@fluentui/react-tabs 9.74.7-experimental.cli-api.20261006-ccaa611d58.0 → 9.75.0-experimental.css-modules.20261031-810ab07afb.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -11
- package/README.md +8 -0
- package/lib/components/Tab/Tab.js.map +1 -1
- package/lib/components/Tab/Tab.module.css +475 -0
- package/lib/components/Tab/Tab.types.js.map +1 -1
- package/lib/components/Tab/TabAnimatedIndicator.module.css +27 -0
- package/lib/components/Tab/index.js.map +1 -1
- package/lib/components/Tab/renderTab.js +2 -2
- package/lib/components/Tab/renderTab.js.map +1 -1
- package/lib/components/Tab/useTab.js.map +1 -1
- package/lib/components/Tab/useTabAnimatedIndicator.styles.css.js +93 -0
- package/lib/components/Tab/useTabAnimatedIndicator.styles.css.js.map +1 -0
- package/lib/components/Tab/useTabAnimatedIndicator.styles.raw.css.js +93 -0
- package/lib/components/Tab/useTabAnimatedIndicator.styles.raw.css.js.map +1 -0
- package/lib/components/Tab/useTabAnimatedIndicator.styles.raw.js.map +1 -1
- package/lib/components/Tab/useTabStyles.styles.css.js +53 -0
- package/lib/components/Tab/useTabStyles.styles.css.js.map +1 -0
- package/lib/components/Tab/useTabStyles.styles.raw.css.js +53 -0
- package/lib/components/Tab/useTabStyles.styles.raw.css.js.map +1 -0
- package/lib/components/Tab/useTabStyles.styles.raw.js.map +1 -1
- package/lib/components/TabList/TabList.js.map +1 -1
- package/lib/components/TabList/TabList.module.css +27 -0
- package/lib/components/TabList/TabList.types.js.map +1 -1
- package/lib/components/TabList/TabListContext.js.map +1 -1
- package/lib/components/TabList/index.js.map +1 -1
- package/lib/components/TabList/renderTabList.js +2 -2
- package/lib/components/TabList/renderTabList.js.map +1 -1
- package/lib/components/TabList/useTabList.js.map +1 -1
- package/lib/components/TabList/useTabListContextValues.js.map +1 -1
- package/lib/components/TabList/useTabListStyles.styles.css.js +12 -0
- package/lib/components/TabList/useTabListStyles.styles.css.js.map +1 -0
- package/lib/components/TabList/useTabListStyles.styles.raw.css.js +12 -0
- package/lib/components/TabList/useTabListStyles.styles.raw.css.js.map +1 -0
- package/lib/components/TabList/useTabListStyles.styles.raw.js.map +1 -1
- package/lib-commonjs/Tab.cjs +12 -12
- package/lib-commonjs/Tab.cjs.map +1 -1
- package/lib-commonjs/TabList.cjs +12 -12
- package/lib-commonjs/TabList.cjs.map +1 -1
- package/lib-commonjs/components/Tab/Tab.cjs.map +1 -1
- package/lib-commonjs/components/Tab/Tab.module.css +475 -0
- package/lib-commonjs/components/Tab/Tab.types.cjs.map +1 -1
- package/lib-commonjs/components/Tab/TabAnimatedIndicator.module.css +27 -0
- package/lib-commonjs/components/Tab/index.cjs +13 -13
- package/lib-commonjs/components/Tab/index.cjs.map +1 -1
- package/lib-commonjs/components/Tab/renderTab.cjs.map +1 -1
- package/lib-commonjs/components/Tab/useTab.cjs +4 -4
- package/lib-commonjs/components/Tab/useTab.cjs.map +1 -1
- package/lib-commonjs/components/Tab/useTabAnimatedIndicator.styles.css.cjs +103 -0
- package/lib-commonjs/components/Tab/useTabAnimatedIndicator.styles.css.cjs.map +1 -0
- package/lib-commonjs/components/Tab/useTabAnimatedIndicator.styles.raw.cjs.map +1 -1
- package/lib-commonjs/components/Tab/useTabAnimatedIndicator.styles.raw.css.cjs +103 -0
- package/lib-commonjs/components/Tab/useTabAnimatedIndicator.styles.raw.css.cjs.map +1 -0
- package/lib-commonjs/components/Tab/useTabStyles.styles.cjs +7 -7
- package/lib-commonjs/components/Tab/useTabStyles.styles.cjs.map +1 -1
- package/lib-commonjs/components/Tab/useTabStyles.styles.css.cjs +82 -0
- package/lib-commonjs/components/Tab/useTabStyles.styles.css.cjs.map +1 -0
- package/lib-commonjs/components/Tab/useTabStyles.styles.raw.cjs +7 -7
- package/lib-commonjs/components/Tab/useTabStyles.styles.raw.cjs.map +1 -1
- package/lib-commonjs/components/Tab/useTabStyles.styles.raw.css.cjs +82 -0
- package/lib-commonjs/components/Tab/useTabStyles.styles.raw.css.cjs.map +1 -0
- package/lib-commonjs/components/TabList/TabList.cjs.map +1 -1
- package/lib-commonjs/components/TabList/TabList.module.css +27 -0
- package/lib-commonjs/components/TabList/TabList.types.cjs.map +1 -1
- package/lib-commonjs/components/TabList/TabListContext.cjs +4 -4
- package/lib-commonjs/components/TabList/TabListContext.cjs.map +1 -1
- package/lib-commonjs/components/TabList/index.cjs +12 -12
- package/lib-commonjs/components/TabList/index.cjs.map +1 -1
- package/lib-commonjs/components/TabList/renderTabList.cjs.map +1 -1
- package/lib-commonjs/components/TabList/useTabList.cjs +4 -4
- package/lib-commonjs/components/TabList/useTabList.cjs.map +1 -1
- package/lib-commonjs/components/TabList/useTabListContextValues.cjs.map +1 -1
- package/lib-commonjs/components/TabList/useTabListStyles.styles.cjs +3 -3
- package/lib-commonjs/components/TabList/useTabListStyles.styles.cjs.map +1 -1
- package/lib-commonjs/components/TabList/useTabListStyles.styles.css.cjs +29 -0
- package/lib-commonjs/components/TabList/useTabListStyles.styles.css.cjs.map +1 -0
- package/lib-commonjs/components/TabList/useTabListStyles.styles.raw.cjs +3 -3
- package/lib-commonjs/components/TabList/useTabListStyles.styles.raw.cjs.map +1 -1
- package/lib-commonjs/components/TabList/useTabListStyles.styles.raw.css.cjs +29 -0
- package/lib-commonjs/components/TabList/useTabListStyles.styles.raw.css.cjs.map +1 -0
- package/lib-commonjs/index.cjs +22 -22
- package/lib-commonjs/index.cjs.map +1 -1
- package/package.json +14 -14
- package/dist/metadata/api/api-root.json +0 -1
- package/dist/metadata/index.json +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,23 +1,47 @@
|
|
|
1
1
|
# Change Log - @fluentui/react-tabs
|
|
2
2
|
|
|
3
|
-
<!-- This log was last generated on
|
|
3
|
+
<!-- This log was last generated on Sat, 31 Oct 2026 11:08:57 GMT and should not be manually modified. -->
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
-
## [9.
|
|
7
|
+
## [9.75.0-experimental.css-modules.20261031-810ab07afb.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabs_v9.75.0-experimental.css-modules.20261031-810ab07afb.0)
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tabs_v9.12.4..@fluentui/react-tabs_v9.74.7-experimental.cli-api.20261006-ccaa611d58.0)
|
|
9
|
+
Sat, 31 Oct 2026 11:08:57 GMT
|
|
11
10
|
|
|
12
11
|
### Changes
|
|
13
12
|
|
|
14
|
-
- Release 9.
|
|
15
|
-
- Bump @fluentui/react-context-selector to v9.
|
|
16
|
-
- Bump @fluentui/react-jsx-runtime to v9.
|
|
17
|
-
- Bump @fluentui/react-shared-contexts to v9.
|
|
18
|
-
- Bump @fluentui/react-tabster to v9.
|
|
19
|
-
- Bump @fluentui/react-theme to v9.
|
|
20
|
-
- Bump @fluentui/react-utilities to v9.
|
|
13
|
+
- Release 9.75.0-experimental.css-modules.20261031-810ab07afb ([commit](https://github.com/microsoft/fluentui/commit/undefined) by 257645319+office-ogx-auth-helper[bot]@users.noreply.github.com)
|
|
14
|
+
- Bump @fluentui/react-context-selector to v9.75.0-experimental.css-modules.20261031-810ab07afb.0 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
15
|
+
- Bump @fluentui/react-jsx-runtime to v9.75.0-experimental.css-modules.20261031-810ab07afb.0 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
16
|
+
- Bump @fluentui/react-shared-contexts to v9.75.0-experimental.css-modules.20261031-810ab07afb.0 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
17
|
+
- Bump @fluentui/react-tabster to v9.75.0-experimental.css-modules.20261031-810ab07afb.0 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
18
|
+
- Bump @fluentui/react-theme to v9.75.0-experimental.css-modules.20261031-810ab07afb.0 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
19
|
+
- Bump @fluentui/react-utilities to v9.75.0-experimental.css-modules.20261031-810ab07afb.0 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
20
|
+
|
|
21
|
+
## [9.12.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabs_v9.12.6)
|
|
22
|
+
|
|
23
|
+
Mon, 19 Oct 2026 16:49:01 GMT
|
|
24
|
+
|
|
25
|
+
### Patches
|
|
26
|
+
|
|
27
|
+
- Bump @fluentui/react-context-selector to v9.2.21 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
28
|
+
- Bump @fluentui/react-jsx-runtime to v9.4.7 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
29
|
+
- Bump @fluentui/react-tabster to v9.26.19 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
30
|
+
- Bump @fluentui/react-utilities to v9.27.0 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
31
|
+
|
|
32
|
+
## [9.12.5](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabs_v9.12.5)
|
|
33
|
+
|
|
34
|
+
Tue, 22 Sep 2026 11:25:39 GMT
|
|
35
|
+
[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tabs_v9.12.4..@fluentui/react-tabs_v9.12.5)
|
|
36
|
+
|
|
37
|
+
### Patches
|
|
38
|
+
|
|
39
|
+
- fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional ([PR #36559](https://github.com/microsoft/fluentui/pull/36559) by martinhochel@microsoft.com)
|
|
40
|
+
- Bump @fluentui/react-context-selector to v9.2.20 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
41
|
+
- Bump @fluentui/react-jsx-runtime to v9.4.6 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
42
|
+
- Bump @fluentui/react-shared-contexts to v9.26.4 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
43
|
+
- Bump @fluentui/react-tabster to v9.26.18 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
44
|
+
- Bump @fluentui/react-utilities to v9.26.7 ([commit](https://github.com/microsoft/fluentui/commit/undefined) by beachball)
|
|
21
45
|
|
|
22
46
|
## [9.12.4](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabs_v9.12.4)
|
|
23
47
|
|
package/README.md
CHANGED
|
@@ -68,3 +68,11 @@ See [SPEC.md](./SPEC.md).
|
|
|
68
68
|
### Migration Guide
|
|
69
69
|
|
|
70
70
|
If you're upgrading to Fluent UI v9 see [MIGRATION.md](./MIGRATION.md) for guidance on updating to the latest Link implementation.
|
|
71
|
+
|
|
72
|
+
## Opt-in CSS Modules styles
|
|
73
|
+
|
|
74
|
+
Tab animated indicators have layered CSS Modules alternatives beside their Griffel style hooks.
|
|
75
|
+
Resolve the relevant `.styles.js` imports to `.styles.css.js` (and source `.styles`
|
|
76
|
+
imports to `.styles.css.ts`) only in an explicitly opted-in bundler configuration.
|
|
77
|
+
Keep CSS assets and process the headless icon stylesheet in the `fluentui` layer.
|
|
78
|
+
The default component imports and Griffel implementations are unchanged.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Tab/Tab.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useTab_unstable } from './useTab';\nimport { renderTab_unstable } from './renderTab';\nimport { useTabStyles_unstable } from './useTabStyles.styles';\nimport type { TabProps } from './Tab.types';\nimport type { ForwardRefComponent } from '@fluentui/react-utilities';\nimport { useCustomStyleHook_unstable } from '@fluentui/react-shared-contexts';\n\n/**\n * A tab provides a selectable item in a tab list.\n */\nexport const Tab: ForwardRefComponent<TabProps> = React.forwardRef((props, ref) => {\n const state = useTab_unstable(props, ref);\n\n useTabStyles_unstable(state);\n\n useCustomStyleHook_unstable('useTabStyles_unstable')(state);\n\n return renderTab_unstable(state);\n});\n\nTab.displayName = 'Tab';\n"],"names":["React","useTab_unstable","renderTab_unstable","useTabStyles_unstable","useCustomStyleHook_unstable","Tab","forwardRef","props","ref","state","displayName"],"mappings":"AAAA;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,eAAe,QAAQ,cAAW;AAC3C,SAASC,kBAAkB,QAAQ,iBAAc;AACjD,SAASC,qBAAqB,QAAQ,2BAAwB;AAG9D,SAASC,2BAA2B,QAAQ,kCAAkC;AAE9E;;CAEC,GACD,OAAO,MAAMC,oBAAqCL,MAAMM,UAAU,CAAC,CAACC,OAAOC;IACzE,MAAMC,QAAQR,gBAAgBM,OAAOC;IAErCL,sBAAsBM;IAEtBL,4BAA4B,yBAAyBK;IAErD,OAAOP,mBAAmBO;AAC5B,GAAG;AAEHJ,IAAIK,WAAW,GAAG"}
|
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
@layer fluentui {
|
|
2
|
+
/* ---- Root: grid wrapper that holds content + pseudo-element indicators ---- */
|
|
3
|
+
.root {
|
|
4
|
+
align-items: center;
|
|
5
|
+
display: grid;
|
|
6
|
+
flex-shrink: 0;
|
|
7
|
+
grid-auto-flow: column;
|
|
8
|
+
grid-template-columns: auto;
|
|
9
|
+
grid-template-rows: auto;
|
|
10
|
+
outline-style: none;
|
|
11
|
+
position: relative;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* ---- Button: interactive button layered on the root grid ---- */
|
|
15
|
+
.button {
|
|
16
|
+
align-items: center;
|
|
17
|
+
border: none;
|
|
18
|
+
border-radius: var(--borderRadiusMedium);
|
|
19
|
+
cursor: pointer;
|
|
20
|
+
display: grid;
|
|
21
|
+
flex-shrink: 0;
|
|
22
|
+
grid-auto-flow: column;
|
|
23
|
+
grid-template-columns: auto;
|
|
24
|
+
grid-template-rows: auto;
|
|
25
|
+
font-family: var(--fontFamilyBase);
|
|
26
|
+
line-height: var(--lineHeightBase300);
|
|
27
|
+
outline-style: none;
|
|
28
|
+
position: relative;
|
|
29
|
+
overflow: hidden;
|
|
30
|
+
text-transform: none;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* ---- Orientation (also carries default "medium" padding) ---- */
|
|
34
|
+
.horizontal {
|
|
35
|
+
justify-content: center;
|
|
36
|
+
column-gap: var(--spacingHorizontalSNudge);
|
|
37
|
+
padding: var(--spacingVerticalM) var(--spacingHorizontalMNudge);
|
|
38
|
+
}
|
|
39
|
+
.vertical {
|
|
40
|
+
justify-content: start;
|
|
41
|
+
column-gap: var(--spacingHorizontalSNudge);
|
|
42
|
+
padding: var(--spacingVerticalSNudge) var(--spacingHorizontalMNudge);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* ---- Size × orientation: padding overrides for small/large ---- */
|
|
46
|
+
/* medium is the default, covered by .horizontal/.vertical above */
|
|
47
|
+
.small.horizontal {
|
|
48
|
+
column-gap: var(--spacingHorizontalXXS);
|
|
49
|
+
padding: var(--spacingVerticalSNudge) var(--spacingHorizontalSNudge);
|
|
50
|
+
}
|
|
51
|
+
.small.vertical {
|
|
52
|
+
column-gap: var(--spacingHorizontalXXS);
|
|
53
|
+
padding: var(--spacingVerticalXXS) var(--spacingHorizontalSNudge);
|
|
54
|
+
}
|
|
55
|
+
.large.horizontal {
|
|
56
|
+
column-gap: var(--spacingHorizontalSNudge);
|
|
57
|
+
padding: var(--spacingVerticalL) var(--spacingHorizontalMNudge);
|
|
58
|
+
}
|
|
59
|
+
.large.vertical {
|
|
60
|
+
column-gap: var(--spacingHorizontalSNudge);
|
|
61
|
+
padding: var(--spacingVerticalS) var(--spacingHorizontalMNudge);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* ---- Appearance: transparent ---- */
|
|
65
|
+
.transparent {
|
|
66
|
+
background-color: var(--colorTransparentBackground);
|
|
67
|
+
}
|
|
68
|
+
.transparent:enabled:hover {
|
|
69
|
+
background-color: var(--colorTransparentBackgroundHover);
|
|
70
|
+
}
|
|
71
|
+
.transparent:enabled:active {
|
|
72
|
+
background-color: var(--colorTransparentBackgroundPressed);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.transparent :global(.fui-Tab__icon),
|
|
76
|
+
.transparent :global(.fui-Tab__content) {
|
|
77
|
+
color: var(--colorNeutralForeground2);
|
|
78
|
+
}
|
|
79
|
+
.transparent:enabled:hover :global(.fui-Tab__icon),
|
|
80
|
+
.transparent:enabled:hover :global(.fui-Tab__content) {
|
|
81
|
+
color: var(--colorNeutralForeground2Hover);
|
|
82
|
+
}
|
|
83
|
+
.transparent:enabled:active :global(.fui-Tab__icon),
|
|
84
|
+
.transparent:enabled:active :global(.fui-Tab__content) {
|
|
85
|
+
color: var(--colorNeutralForeground2Pressed);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* ---- Appearance: subtle ---- */
|
|
89
|
+
.subtle {
|
|
90
|
+
background-color: var(--colorSubtleBackground);
|
|
91
|
+
}
|
|
92
|
+
.subtle:enabled:hover {
|
|
93
|
+
background-color: var(--colorSubtleBackgroundHover);
|
|
94
|
+
}
|
|
95
|
+
.subtle:enabled:active {
|
|
96
|
+
background-color: var(--colorSubtleBackgroundPressed);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.subtle :global(.fui-Tab__icon),
|
|
100
|
+
.subtle :global(.fui-Tab__content) {
|
|
101
|
+
color: var(--colorNeutralForeground2);
|
|
102
|
+
}
|
|
103
|
+
.subtle:enabled:hover :global(.fui-Tab__icon),
|
|
104
|
+
.subtle:enabled:hover :global(.fui-Tab__content) {
|
|
105
|
+
color: var(--colorNeutralForeground2Hover);
|
|
106
|
+
}
|
|
107
|
+
.subtle:enabled:active :global(.fui-Tab__icon),
|
|
108
|
+
.subtle:enabled:active :global(.fui-Tab__content) {
|
|
109
|
+
color: var(--colorNeutralForeground2Pressed);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* ---- Selected state colors (non-circular only — guarded below by .circularBase reset) ---- */
|
|
113
|
+
.selected :global(.fui-Tab__icon) {
|
|
114
|
+
color: var(--colorCompoundBrandForeground1);
|
|
115
|
+
}
|
|
116
|
+
.selected:enabled:hover :global(.fui-Tab__icon) {
|
|
117
|
+
color: var(--colorCompoundBrandForeground1Hover);
|
|
118
|
+
}
|
|
119
|
+
.selected:enabled:active :global(.fui-Tab__icon) {
|
|
120
|
+
color: var(--colorCompoundBrandForeground1Pressed);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.selected :global(.fui-Tab__content) {
|
|
124
|
+
color: var(--colorNeutralForeground1);
|
|
125
|
+
}
|
|
126
|
+
.selected:enabled:hover :global(.fui-Tab__content) {
|
|
127
|
+
color: var(--colorNeutralForeground1Hover);
|
|
128
|
+
}
|
|
129
|
+
.selected:enabled:active :global(.fui-Tab__content) {
|
|
130
|
+
color: var(--colorNeutralForeground1Pressed);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* ---- Disabled ---- */
|
|
134
|
+
.disabled {
|
|
135
|
+
cursor: not-allowed;
|
|
136
|
+
background-color: var(--colorTransparentBackground);
|
|
137
|
+
}
|
|
138
|
+
.disabled :global(.fui-Tab__icon),
|
|
139
|
+
.disabled :global(.fui-Tab__content) {
|
|
140
|
+
color: var(--colorNeutralForegroundDisabled);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* ---- Focus indicator ---- */
|
|
144
|
+
.focusBase[data-fui-focus-visible] {
|
|
145
|
+
border-color: transparent;
|
|
146
|
+
outline-width: var(--strokeWidthThick);
|
|
147
|
+
outline-color: transparent;
|
|
148
|
+
outline-style: solid;
|
|
149
|
+
box-shadow: var(--shadow4), 0 0 0 var(--strokeWidthThick) var(--colorStrokeFocus2);
|
|
150
|
+
z-index: 1;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.focusCircular[data-fui-focus-visible] {
|
|
154
|
+
border-color: transparent;
|
|
155
|
+
outline-width: var(--strokeWidthThick);
|
|
156
|
+
outline-color: transparent;
|
|
157
|
+
outline-style: solid;
|
|
158
|
+
box-shadow: var(--shadow4), 0 0 0 var(--strokeWidthThick) var(--colorStrokeFocus2),
|
|
159
|
+
0 0 0 var(--strokeWidthThin) var(--colorNeutralStrokeOnBrand) inset;
|
|
160
|
+
z-index: 1;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* ---- Pending indicator (::before) ---- */
|
|
164
|
+
.pendingBase:hover::before,
|
|
165
|
+
.pendingBase:active::before {
|
|
166
|
+
background-color: var(--colorNeutralStroke1Hover);
|
|
167
|
+
border-radius: var(--borderRadiusCircular);
|
|
168
|
+
content: '';
|
|
169
|
+
position: absolute;
|
|
170
|
+
}
|
|
171
|
+
.pendingBase:active::before {
|
|
172
|
+
background-color: var(--colorNeutralStroke1Pressed);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@media (forced-colors: active) {
|
|
176
|
+
.pendingBase:hover::before,
|
|
177
|
+
.pendingBase:active::before {
|
|
178
|
+
background-color: Highlight;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.pendingDisabled:hover::before,
|
|
183
|
+
.pendingDisabled:active::before {
|
|
184
|
+
background-color: var(--colorTransparentStroke);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
@media (forced-colors: active) {
|
|
188
|
+
.pendingDisabled:hover::before,
|
|
189
|
+
.pendingDisabled:active::before {
|
|
190
|
+
background-color: transparent;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* ---- Active indicator (::after) ---- */
|
|
195
|
+
.activeBase::after {
|
|
196
|
+
background-color: var(--colorTransparentStroke);
|
|
197
|
+
border-radius: var(--borderRadiusCircular);
|
|
198
|
+
content: '';
|
|
199
|
+
position: absolute;
|
|
200
|
+
}
|
|
201
|
+
.activeSelected::after {
|
|
202
|
+
background-color: var(--colorCompoundBrandStroke);
|
|
203
|
+
}
|
|
204
|
+
.activeSelected:enabled:hover::after {
|
|
205
|
+
background-color: var(--colorCompoundBrandStrokeHover);
|
|
206
|
+
}
|
|
207
|
+
.activeSelected:enabled:active::after {
|
|
208
|
+
background-color: var(--colorCompoundBrandStrokePressed);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
@media (forced-colors: active) {
|
|
212
|
+
.activeSelected::after,
|
|
213
|
+
.activeSelected:enabled:hover::after,
|
|
214
|
+
.activeSelected:enabled:active::after {
|
|
215
|
+
background-color: ButtonText;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.activeDisabled::after {
|
|
220
|
+
background-color: var(--colorNeutralForegroundDisabled);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/* ---- Indicator positions: compound size × orientation selectors ---- */
|
|
224
|
+
/* Pending (::before) and active (::after) share the same geometry — handled together. */
|
|
225
|
+
|
|
226
|
+
/* Medium + horizontal (default via .horizontal baseline; small/large override below) */
|
|
227
|
+
.horizontal.pendingBase::before,
|
|
228
|
+
.horizontal.activeBase::after {
|
|
229
|
+
bottom: 0;
|
|
230
|
+
height: var(--strokeWidthThicker);
|
|
231
|
+
left: var(--spacingHorizontalM);
|
|
232
|
+
right: var(--spacingHorizontalM);
|
|
233
|
+
}
|
|
234
|
+
/* Medium + vertical */
|
|
235
|
+
.vertical.pendingBase::before,
|
|
236
|
+
.vertical.activeBase::after {
|
|
237
|
+
bottom: var(--spacingVerticalS);
|
|
238
|
+
inset-inline-start: 0;
|
|
239
|
+
top: var(--spacingVerticalS);
|
|
240
|
+
width: var(--strokeWidthThicker);
|
|
241
|
+
}
|
|
242
|
+
/* Small + horizontal */
|
|
243
|
+
.small.horizontal.pendingBase::before,
|
|
244
|
+
.small.horizontal.activeBase::after {
|
|
245
|
+
bottom: 0;
|
|
246
|
+
height: var(--strokeWidthThick);
|
|
247
|
+
left: var(--spacingHorizontalSNudge);
|
|
248
|
+
right: var(--spacingHorizontalSNudge);
|
|
249
|
+
}
|
|
250
|
+
/* Small + vertical */
|
|
251
|
+
.small.vertical.pendingBase::before,
|
|
252
|
+
.small.vertical.activeBase::after {
|
|
253
|
+
bottom: var(--spacingVerticalXS);
|
|
254
|
+
inset-inline-start: 0;
|
|
255
|
+
top: var(--spacingVerticalXS);
|
|
256
|
+
width: var(--strokeWidthThicker);
|
|
257
|
+
}
|
|
258
|
+
/* Large + horizontal: same geometry as medium, no override needed */
|
|
259
|
+
/* Large + vertical */
|
|
260
|
+
.large.vertical.pendingBase::before,
|
|
261
|
+
.large.vertical.activeBase::after {
|
|
262
|
+
bottom: var(--spacingVerticalMNudge);
|
|
263
|
+
inset-inline-start: 0;
|
|
264
|
+
top: var(--spacingVerticalMNudge);
|
|
265
|
+
width: var(--strokeWidthThicker);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/* ---- Circular appearance base ---- */
|
|
269
|
+
.circularBase {
|
|
270
|
+
border-radius: var(--borderRadiusCircular);
|
|
271
|
+
border: solid var(--strokeWidthThin) var(--colorTransparentStroke);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/* Reset selected icon/content colors inherited from non-circular .selected rules */
|
|
275
|
+
.circularBase :global(.fui-Tab__icon),
|
|
276
|
+
.circularBase :global(.fui-Tab__content) {
|
|
277
|
+
color: inherit;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* Circular size padding: compound with .small/.large on the same button element */
|
|
281
|
+
.circularBase {
|
|
282
|
+
padding-block: calc(var(--spacingVerticalSNudge) - var(--strokeWidthThin));
|
|
283
|
+
}
|
|
284
|
+
.circularBase.small {
|
|
285
|
+
padding-block: calc(var(--spacingVerticalXXS) - var(--strokeWidthThin));
|
|
286
|
+
}
|
|
287
|
+
.circularBase.large {
|
|
288
|
+
padding-block: calc(var(--spacingVerticalS) - var(--strokeWidthThin));
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/* ---- Subtle-circular appearance ---- */
|
|
292
|
+
.subtleCircular {
|
|
293
|
+
background-color: var(--colorSubtleBackground);
|
|
294
|
+
color: var(--colorNeutralForeground2);
|
|
295
|
+
}
|
|
296
|
+
.subtleCircular:enabled:hover {
|
|
297
|
+
background-color: var(--colorSubtleBackgroundHover);
|
|
298
|
+
border: solid var(--strokeWidthThin) var(--colorNeutralStroke1Hover);
|
|
299
|
+
color: var(--colorNeutralForeground2Hover);
|
|
300
|
+
}
|
|
301
|
+
.subtleCircular:enabled:active {
|
|
302
|
+
background-color: var(--colorSubtleBackgroundPressed);
|
|
303
|
+
border: solid var(--strokeWidthThin) var(--colorNeutralStroke1Pressed);
|
|
304
|
+
color: var(--colorNeutralForeground2Pressed);
|
|
305
|
+
}
|
|
306
|
+
@media (forced-colors: active) {
|
|
307
|
+
.subtleCircular {
|
|
308
|
+
border: solid var(--strokeWidthThin) Canvas;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/* selected, disabled: compound — CSS handles combinations, hook applies orthogonal classes */
|
|
313
|
+
.subtleCircular.selected {
|
|
314
|
+
background-color: var(--colorBrandBackground2);
|
|
315
|
+
border: solid var(--strokeWidthThin) var(--colorCompoundBrandStroke);
|
|
316
|
+
color: var(--colorBrandForeground2);
|
|
317
|
+
}
|
|
318
|
+
.subtleCircular.selected:enabled:hover {
|
|
319
|
+
background-color: var(--colorBrandBackground2Hover);
|
|
320
|
+
border: solid var(--strokeWidthThin) var(--colorCompoundBrandStrokeHover);
|
|
321
|
+
color: var(--colorBrandForeground2Hover);
|
|
322
|
+
}
|
|
323
|
+
.subtleCircular.selected:enabled:active {
|
|
324
|
+
background-color: var(--colorBrandBackground2Pressed);
|
|
325
|
+
border: solid var(--strokeWidthThin) var(--colorCompoundBrandStrokePressed);
|
|
326
|
+
color: var(--colorBrandForeground2Pressed);
|
|
327
|
+
}
|
|
328
|
+
@media (forced-colors: active) {
|
|
329
|
+
.subtleCircular.selected {
|
|
330
|
+
border: solid var(--strokeWidthThin) Highlight;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.subtleCircular.disabled {
|
|
335
|
+
background-color: var(--colorSubtleBackground);
|
|
336
|
+
color: var(--colorNeutralForegroundDisabled);
|
|
337
|
+
}
|
|
338
|
+
.subtleCircular.selected.disabled {
|
|
339
|
+
background-color: var(--colorNeutralBackgroundDisabled);
|
|
340
|
+
border: solid var(--strokeWidthThin) var(--colorNeutralStrokeDisabled);
|
|
341
|
+
color: var(--colorNeutralForegroundDisabled);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/* ---- Filled-circular appearance ---- */
|
|
345
|
+
.filledCircular {
|
|
346
|
+
background-color: var(--colorNeutralBackground3);
|
|
347
|
+
color: var(--colorNeutralForeground2);
|
|
348
|
+
}
|
|
349
|
+
.filledCircular:enabled:hover {
|
|
350
|
+
background-color: var(--colorNeutralBackground3Hover);
|
|
351
|
+
color: var(--colorNeutralForeground2Hover);
|
|
352
|
+
}
|
|
353
|
+
.filledCircular:enabled:active {
|
|
354
|
+
background-color: var(--colorNeutralBackground3Pressed);
|
|
355
|
+
color: var(--colorNeutralForeground2Pressed);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
@media (forced-colors: active) {
|
|
359
|
+
.filledCircular:enabled:hover {
|
|
360
|
+
background-color: Highlight;
|
|
361
|
+
forced-color-adjust: none;
|
|
362
|
+
}
|
|
363
|
+
.filledCircular:enabled:hover :global(.fui-Tab__content),
|
|
364
|
+
.filledCircular:enabled:hover :global(.fui-Icon-filled),
|
|
365
|
+
.filledCircular:enabled:hover :global(.fui-Icon-regular) {
|
|
366
|
+
color: HighlightText;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
.filledCircular.selected {
|
|
371
|
+
background-color: var(--colorBrandBackground);
|
|
372
|
+
color: var(--colorNeutralForegroundOnBrand);
|
|
373
|
+
}
|
|
374
|
+
.filledCircular.selected:enabled:hover {
|
|
375
|
+
background-color: var(--colorBrandBackgroundHover);
|
|
376
|
+
color: var(--colorNeutralForegroundOnBrand);
|
|
377
|
+
}
|
|
378
|
+
.filledCircular.selected:enabled:active {
|
|
379
|
+
background-color: var(--colorBrandBackgroundPressed);
|
|
380
|
+
color: var(--colorNeutralForegroundOnBrand);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
@media (forced-colors: active) {
|
|
384
|
+
.filledCircular.selected:enabled {
|
|
385
|
+
background-color: ButtonText;
|
|
386
|
+
}
|
|
387
|
+
.filledCircular.selected:enabled :global(.fui-Tab__content) {
|
|
388
|
+
color: ButtonFace;
|
|
389
|
+
forced-color-adjust: none;
|
|
390
|
+
}
|
|
391
|
+
.filledCircular.selected:enabled :global(.fui-Tab__icon) {
|
|
392
|
+
color: ButtonFace;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
.filledCircular.disabled {
|
|
397
|
+
background-color: var(--colorNeutralBackgroundDisabled);
|
|
398
|
+
color: var(--colorNeutralForegroundDisabled);
|
|
399
|
+
}
|
|
400
|
+
.filledCircular.selected.disabled {
|
|
401
|
+
background-color: var(--colorNeutralBackgroundDisabled);
|
|
402
|
+
border: solid var(--strokeWidthThin) var(--colorNeutralStrokeDisabled);
|
|
403
|
+
color: var(--colorNeutralForegroundDisabled);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/* ---- Icon slot ---- */
|
|
407
|
+
.icon {
|
|
408
|
+
grid-column-start: 1;
|
|
409
|
+
grid-row-start: 1;
|
|
410
|
+
align-items: center;
|
|
411
|
+
display: inline-flex;
|
|
412
|
+
justify-content: center;
|
|
413
|
+
overflow: hidden;
|
|
414
|
+
font-size: 20px;
|
|
415
|
+
height: 20px;
|
|
416
|
+
width: 20px;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
.icon :global(.fui-Icon-filled) {
|
|
420
|
+
display: none;
|
|
421
|
+
}
|
|
422
|
+
.icon :global(.fui-Icon-regular) {
|
|
423
|
+
display: inline;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/* Large tab: bigger icon via descendant selector from the button's .large class */
|
|
427
|
+
.large :global(.fui-Tab__icon) {
|
|
428
|
+
font-size: 24px;
|
|
429
|
+
height: 24px;
|
|
430
|
+
width: 24px;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/* Selected state: swap to filled icon variant */
|
|
434
|
+
.selected :global(.fui-Tab__icon) :global(.fui-Icon-filled) {
|
|
435
|
+
display: inline;
|
|
436
|
+
}
|
|
437
|
+
.selected :global(.fui-Tab__icon) :global(.fui-Icon-regular) {
|
|
438
|
+
display: none;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/* ---- Content slot ---- */
|
|
442
|
+
.content {
|
|
443
|
+
overflow: hidden;
|
|
444
|
+
padding: 0 var(--spacingHorizontalXXS);
|
|
445
|
+
font-family: var(--fontFamilyBase);
|
|
446
|
+
font-size: var(--fontSizeBase300);
|
|
447
|
+
font-weight: var(--fontWeightRegular);
|
|
448
|
+
line-height: var(--lineHeightBase300);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/* Selected: semibold (body1Strong). Applies to all tabs including circular. */
|
|
452
|
+
.selected :global(.fui-Tab__content) {
|
|
453
|
+
font-weight: var(--fontWeightSemibold);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/* Large: bigger font (body2 / subtitle2) via descendant from button's .large class */
|
|
457
|
+
.large .content {
|
|
458
|
+
font-size: var(--fontSizeBase400);
|
|
459
|
+
line-height: var(--lineHeightBase400);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
.contentNoIconBefore {
|
|
463
|
+
grid-column-start: 1;
|
|
464
|
+
grid-row-start: 1;
|
|
465
|
+
}
|
|
466
|
+
.contentIconBefore {
|
|
467
|
+
grid-column-start: 2;
|
|
468
|
+
grid-row-start: 1;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.contentPlaceholder {
|
|
472
|
+
visibility: hidden;
|
|
473
|
+
font-weight: var(--fontWeightSemibold);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Tab/Tab.types.ts"],"sourcesContent":["import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities';\n\n/**\n * Any value that identifies a specific tab.\n */\nexport type TabValue = unknown;\n\nexport type TabSlots = {\n /**\n * Root of the component.\n */\n root: Slot<'button'>;\n\n /**\n * Icon that renders before the content.\n */\n icon?: Slot<'span'>;\n\n /**\n * Component children are placed in this slot\n * Avoid using the `children` property in this slot in favour of Component children whenever possible.\n */\n content: NonNullable<Slot<'span'>>;\n};\n\nexport type TabInternalSlots = TabSlots & {\n contentReservedSpace?: Slot<'span'>;\n};\n\n/**\n * Tab Props\n */\nexport type TabProps = Omit<ComponentProps<Partial<TabSlots>>, 'content' | 'value'> &\n Pick<Partial<TabSlots>, 'content'> & {\n /**\n * A tab can be set to disable interaction.\n * @default false\n */\n disabled?: boolean;\n /**\n * The value that identifies this tab when selected.\n */\n value: TabValue;\n };\n\nexport type TabBaseProps = Omit<TabProps, 'contentReservedSpace'>;\n\n/**\n * State used in rendering Tab\n */\nexport type TabState = ComponentState<TabInternalSlots> &\n Pick<TabProps, 'value'> &\n Required<Pick<TabProps, 'disabled'>> & {\n /**\n * A tab supports 'transparent', 'subtle', `subtle-circular` and `filled-circular` appearance.\n */\n appearance?: 'transparent' | 'subtle' | 'subtle-circular' | 'filled-circular';\n\n /**\n * A tab can have only an icon slot filled and no content.\n */\n iconOnly: boolean;\n /**\n * If this tab is selected\n */\n selected: boolean;\n /**\n * When defined, tab content with selected style is rendered hidden to reserve space.\n * This keeps consistent content size between unselected and selected states.\n *\n * @deprecated - use `contentReservedSpace` internal slot instead.\n */\n contentReservedSpaceClassName?: string;\n /**\n * A tab can be either 'small', 'medium', or 'large' size.\n */\n size: 'small' | 'medium' | 'large';\n /**\n * A tab can arrange its content based on if the tabs in the list are arranged vertically.\n */\n vertical: boolean;\n };\n\nexport type TabBaseState = Omit<TabState, 'appearance' | 'size' | 'contentReservedSpace'>;\n"],"names":[],"mappings":"AAmFA,WAA0F"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
@layer fluentui {
|
|
2
|
+
.base {
|
|
3
|
+
overflow: visible;
|
|
4
|
+
}
|
|
5
|
+
.animated::after {
|
|
6
|
+
transition-property: transform;
|
|
7
|
+
transition-duration: var(--durationSlow);
|
|
8
|
+
transition-timing-function: var(--curveDecelerateMax);
|
|
9
|
+
}
|
|
10
|
+
.horizontal::after {
|
|
11
|
+
transform-origin: left;
|
|
12
|
+
transform: translateX(var(--fui-Tab__indicator--offset)) scaleX(var(--fui-Tab__indicator--scale));
|
|
13
|
+
}
|
|
14
|
+
:global([dir='rtl']) .horizontal::after {
|
|
15
|
+
transform-origin: right;
|
|
16
|
+
}
|
|
17
|
+
.vertical::after {
|
|
18
|
+
transform-origin: top;
|
|
19
|
+
transform: translateY(var(--fui-Tab__indicator--offset)) scaleY(var(--fui-Tab__indicator--scale));
|
|
20
|
+
}
|
|
21
|
+
@media (prefers-reduced-motion: reduce) {
|
|
22
|
+
.animated::after {
|
|
23
|
+
transition-property: none;
|
|
24
|
+
transition-duration: 0.01ms;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Tab/index.ts"],"sourcesContent":["export { Tab } from './Tab';\nexport type { TabInternalSlots, TabBaseProps, TabProps, TabSlots, TabBaseState, TabState, TabValue } from './Tab.types';\nexport { renderTab_unstable } from './renderTab';\nexport { useTab_unstable, useTabBase_unstable, useTabA11yBehavior_unstable } from './useTab';\nexport {\n tabClassNames,\n tabReservedSpaceClassNames,\n useTabButtonStyles_unstable,\n useTabContentStyles_unstable,\n useTabIndicatorStyles_unstable,\n useTabStyles_unstable,\n} from './useTabStyles.styles';\nexport { useTabAnimatedIndicatorStyles_unstable } from './useTabAnimatedIndicator.styles';\n"],"names":["Tab","renderTab_unstable","useTab_unstable","useTabBase_unstable","useTabA11yBehavior_unstable","tabClassNames","tabReservedSpaceClassNames","useTabButtonStyles_unstable","useTabContentStyles_unstable","useTabIndicatorStyles_unstable","useTabStyles_unstable","useTabAnimatedIndicatorStyles_unstable"],"mappings":"AAAA,SAASA,GAAG,QAAQ,WAAQ;AAE5B,SAASC,kBAAkB,QAAQ,iBAAc;AACjD,SAASC,eAAe,EAAEC,mBAAmB,EAAEC,2BAA2B,QAAQ,cAAW;AAC7F,SACEC,aAAa,EACbC,0BAA0B,EAC1BC,2BAA2B,EAC3BC,4BAA4B,EAC5BC,8BAA8B,EAC9BC,qBAAqB,QAChB,2BAAwB;AAC/B,SAASC,sCAAsC,QAAQ,sCAAmC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import { assertSlots } from "@fluentui/react-utilities";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@fluentui/react-jsx-runtime/jsx-runtime";
|
|
2
|
+
import { assertSlots } from "@fluentui/react-utilities";
|
|
3
3
|
/**
|
|
4
4
|
* Render the final JSX of Tab
|
|
5
5
|
*/ export const renderTab_unstable = (state)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Tab/renderTab.tsx"],"sourcesContent":["/** @jsxRuntime automatic */\n/** @jsxImportSource @fluentui/react-jsx-runtime */\nimport { assertSlots } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport type { TabBaseState, TabInternalSlots } from './Tab.types';\n\n/**\n * Render the final JSX of Tab\n */\nexport const renderTab_unstable = (state: TabBaseState): JSXElement => {\n assertSlots<TabInternalSlots>(state);\n\n return (\n <state.root>\n {state.icon && <state.icon />}\n {!state.iconOnly && <state.content />}\n {state.contentReservedSpace && <state.contentReservedSpace />}\n </state.root>\n );\n};\n"],"names":["assertSlots","renderTab_unstable","state","root","icon","iconOnly","content","contentReservedSpace"],"mappings":";AAAA,0BAA0B,GAC1B,iDAAiD,GACjD,SAASA,WAAW,QAAQ,4BAA4B;AAIxD;;CAEC,GACD,OAAO,MAAMC,qBAAqB,CAACC;IACjCF,YAA8BE;IAE9B,qBACE,MAACA,MAAMC,IAAI;;YACRD,MAAME,IAAI,kBAAI,KAACF,MAAME,IAAI;YACzB,CAACF,MAAMG,QAAQ,kBAAI,KAACH,MAAMI,OAAO;YACjCJ,MAAMK,oBAAoB,kBAAI,KAACL,MAAMK,oBAAoB;;;AAGhE,EAAE"}
|