@12-apps/ui 6.96.1 → 6.97.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/dist/_internal/components/data-display/Avatar/Avatar.js +1 -1
- package/dist/_internal/components/data-display/Chip/Chip.js +3 -3
- package/dist/_internal/components/data-display/Chip/Chip.metrics.js +3 -1
- package/dist/_internal/components/data-display/Chip/Chip.styles.js +2 -2
- package/dist/_internal/components/data-display/index.js +4 -4
- package/dist/_internal/components/form/CepField/CepField.js +1 -1
- package/dist/_internal/components/form/index.js +1 -1
- package/dist/_internal/components/form/total-form/Fields/CepField.js +2 -2
- package/dist/_internal/components/form/total-form/Fields/index.js +3 -3
- package/dist/_internal/components/index.js +12 -12
- package/dist/_internal/components/layout/SettingCard/SettingCard.js +6 -6
- package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +4 -4
- package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +5 -5
- package/dist/_internal/components/layout/SettingCard/SettingGrid.js +5 -5
- package/dist/_internal/components/layout/SettingCard/SettingGroup.js +7 -7
- package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +6 -6
- package/dist/_internal/components/layout/SettingCard/SettingToggle.js +7 -7
- package/dist/_internal/components/layout/index.js +10 -10
- package/dist/_internal/user-avatar/user-avatar.js +2 -2
- package/dist/{chunk-FMNOCFD2.js → chunk-2C7AWMV7.js} +2 -2
- package/dist/{chunk-I3QVH34Y.js → chunk-44BTMZB6.js} +3 -3
- package/dist/{chunk-GOWKXKWO.js → chunk-44I2KXKW.js} +7 -5
- package/dist/chunk-44I2KXKW.js.map +1 -0
- package/dist/{chunk-JIEVKHOH.js → chunk-EXEBN5ZP.js} +16 -1
- package/dist/chunk-EXEBN5ZP.js.map +1 -0
- package/dist/{chunk-Y5J2EIR4.js → chunk-F3UHWLTD.js} +2 -2
- package/dist/{chunk-52NM5VEW.js → chunk-GZBLDPXY.js} +3 -1
- package/dist/{chunk-52NM5VEW.js.map → chunk-GZBLDPXY.js.map} +1 -1
- package/dist/{chunk-UOI3RX4W.js → chunk-IAPFZJ6I.js} +2 -2
- package/dist/{chunk-E2UOEI7N.js → chunk-JJYECKEL.js} +2 -2
- package/dist/{chunk-BTDRBO4G.js → chunk-L2ICH44N.js} +3 -3
- package/dist/{chunk-UTWEHMAP.js → chunk-LYVVXC3J.js} +11 -3
- package/dist/chunk-LYVVXC3J.js.map +1 -0
- package/dist/{chunk-BRFL7OWI.js → chunk-N2J24TJ3.js} +2 -2
- package/dist/{chunk-KXVWH3JM.js → chunk-QZRWOF4R.js} +2 -2
- package/dist/{chunk-VILNULUY.js → chunk-RCULGFEH.js} +3 -3
- package/dist/{chunk-PQ4P4OEA.js → chunk-SSWNJR36.js} +2 -2
- package/dist/{chunk-KCH6O6IC.js → chunk-XSLF3YGH.js} +3 -3
- package/dist/data-display/Avatar.js +1 -1
- package/dist/data-display/Chip.js +3 -3
- package/dist/form/CepField.js +1 -1
- package/dist/form/total-form.js +3 -3
- package/dist/layout/SettingCard.js +10 -10
- package/dist/native/data-display/Chip.js +5 -2
- package/dist/native/data-display/Chip.js.map +1 -1
- package/dist/types/components/data-display/Avatar/Avatar.d.ts.map +1 -1
- package/dist/types/components/data-display/Chip/Chip.base.d.ts +3 -2
- package/dist/types/components/data-display/Chip/Chip.base.d.ts.map +1 -1
- package/dist/types/components/data-display/Chip/Chip.metrics.d.ts +6 -0
- package/dist/types/components/data-display/Chip/Chip.metrics.d.ts.map +1 -1
- package/dist/types/components/data-display/Chip/Chip.styles.d.ts.map +1 -1
- package/dist/types/components/form/CepField/CepField.d.ts +1 -1
- package/dist/types/components/form/CepField/CepField.d.ts.map +1 -1
- package/dist/types/components/form/CepField/CepField.types.d.ts +9 -0
- package/dist/types/components/form/CepField/CepField.types.d.ts.map +1 -1
- package/dist/types-native/components/data-display/Chip/Chip.base.d.ts +3 -2
- package/dist/types-native/components/data-display/Chip/Chip.base.d.ts.map +1 -1
- package/dist/types-native/components/data-display/Chip/Chip.look.native.d.ts.map +1 -1
- package/dist/types-native/components/data-display/Chip/Chip.metrics.d.ts +6 -0
- package/dist/types-native/components/data-display/Chip/Chip.metrics.d.ts.map +1 -1
- package/dist/user-avatar.js +2 -2
- package/package.json +1 -1
- package/src/components/data-display/Avatar/Avatar.tsx +22 -3
- package/src/components/data-display/Chip/Chip.base.ts +3 -2
- package/src/components/data-display/Chip/Chip.look.native.ts +6 -3
- package/src/components/data-display/Chip/Chip.metrics.ts +6 -0
- package/src/components/data-display/Chip/Chip.styles.tsx +9 -4
- package/src/components/data-display/Chip/chip.md +1 -1
- package/src/components/form/CepField/CepField.md +4 -0
- package/src/components/form/CepField/CepField.tsx +14 -1
- package/src/components/form/CepField/CepField.types.ts +9 -0
- package/dist/chunk-GOWKXKWO.js.map +0 -1
- package/dist/chunk-JIEVKHOH.js.map +0 -1
- package/dist/chunk-UTWEHMAP.js.map +0 -1
- /package/dist/{chunk-FMNOCFD2.js.map → chunk-2C7AWMV7.js.map} +0 -0
- /package/dist/{chunk-I3QVH34Y.js.map → chunk-44BTMZB6.js.map} +0 -0
- /package/dist/{chunk-Y5J2EIR4.js.map → chunk-F3UHWLTD.js.map} +0 -0
- /package/dist/{chunk-UOI3RX4W.js.map → chunk-IAPFZJ6I.js.map} +0 -0
- /package/dist/{chunk-E2UOEI7N.js.map → chunk-JJYECKEL.js.map} +0 -0
- /package/dist/{chunk-BTDRBO4G.js.map → chunk-L2ICH44N.js.map} +0 -0
- /package/dist/{chunk-BRFL7OWI.js.map → chunk-N2J24TJ3.js.map} +0 -0
- /package/dist/{chunk-KXVWH3JM.js.map → chunk-QZRWOF4R.js.map} +0 -0
- /package/dist/{chunk-VILNULUY.js.map → chunk-RCULGFEH.js.map} +0 -0
- /package/dist/{chunk-PQ4P4OEA.js.map → chunk-SSWNJR36.js.map} +0 -0
- /package/dist/{chunk-KCH6O6IC.js.map → chunk-XSLF3YGH.js.map} +0 -0
|
@@ -9,8 +9,9 @@ import type { ColorValue, SizeValue } from '../../../tokens/vocabulary';
|
|
|
9
9
|
*/
|
|
10
10
|
/**
|
|
11
11
|
* `soft` is a status chip's look: the colour's tint for a ground and, for ink,
|
|
12
|
-
* its dark step in light mode
|
|
13
|
-
* tint either way), so a row of states reads
|
|
12
|
+
* its dark step in light mode (warning's darkened a step further) and its light
|
|
13
|
+
* step in dark mode (4.5:1 on the tint either way), so a row of states reads
|
|
14
|
+
* without a row of solid blocks.
|
|
14
15
|
*/
|
|
15
16
|
export type ChipVariant = 'filled' | 'outlined' | 'soft';
|
|
16
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chip.base.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Chip/Chip.base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAExE;;;;;;GAMG;AACH
|
|
1
|
+
{"version":3,"file":"Chip.base.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Chip/Chip.base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAExE;;;;;;GAMG;AACH;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAEzD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC;AAEjC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC;AAEnC,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IAEd,2BAA2B;IAC3B,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB,uBAAuB;IACvB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAEhB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qDAAqD;IACrD,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAEtB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chip.look.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Chip/Chip.look.native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,
|
|
1
|
+
{"version":3,"file":"Chip.look.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Chip/Chip.look.native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAYL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAKrD,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,uEAAuE;IACvE,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAoED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,OAAO,GAChB,SAAS,CAQX;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,CAWzF;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,WAAW,GACnB,SAAS,CASX;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,GAAG,QAAQ,GACtB,SAAS,CAYX;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS,CAQ7F;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,UAAU,CAOpE;AAED,eAAO,MAAM,WAAW,GAAI,MAAM,WAAW,KAAG,eAAmC,CAAC"}
|
|
@@ -62,6 +62,12 @@ export declare const CHIP_TRANSITION_EASING = "cubic-bezier(0.4, 0, 0.2, 1)";
|
|
|
62
62
|
export declare const SOFT_GROUND_ALPHA = 0.14;
|
|
63
63
|
/** A soft chip's hover ground. */
|
|
64
64
|
export declare const SOFT_HOVER_ALPHA = 0.22;
|
|
65
|
+
/**
|
|
66
|
+
* How much a light-mode soft WARNING ink darkens its `dark` step (FUT-4464). With
|
|
67
|
+
* the default theme, `warning.dark` (#e65100) on its 14% tint is 3.25:1; darkened
|
|
68
|
+
* by 0.2 it is 4.77:1. The other five colours clear 4.5:1 on `dark` as it is.
|
|
69
|
+
*/
|
|
70
|
+
export declare const SOFT_WARNING_LIGHT_DARKEN = 0.2;
|
|
65
71
|
/** A soft chip's keyboard-focus ring, in design px (read through `rem`). */
|
|
66
72
|
export declare const SOFT_FOCUS_RING: {
|
|
67
73
|
readonly width: 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chip.metrics.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Chip/Chip.metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;GASG;AAEH,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE7C,eAAO,MAAM,WAAW,GAAI,MAAM,QAAQ,KAAG,WACQ,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,CAAC;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,eAAe,CAqC3D,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,oFAAoF;AACpF,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,yEAAyE;AACzE,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAIzC,yEAAyE;AACzE,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,YAAY;;;;;CAAsE,CAAC;AAChG,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,sBAAsB,iCAAiC,CAAC;AAErE,oEAAoE;AACpE,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,kCAAkC;AAClC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,4EAA4E;AAC5E,eAAO,MAAM,eAAe;;;CAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"Chip.metrics.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Chip/Chip.metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;GASG;AAEH,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE7C,eAAO,MAAM,WAAW,GAAI,MAAM,QAAQ,KAAG,WACQ,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,CAAC;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,eAAe,CAqC3D,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,oFAAoF;AACpF,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,yEAAyE;AACzE,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAIzC,yEAAyE;AACzE,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,YAAY;;;;;CAAsE,CAAC;AAChG,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,sBAAsB,iCAAiC,CAAC;AAErE,oEAAoE;AACpE,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,kCAAkC;AAClC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,4EAA4E;AAC5E,eAAO,MAAM,eAAe;;;CAAmC,CAAC"}
|
package/dist/user-avatar.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
UserAvatar,
|
|
3
3
|
UserMenu
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-JJYECKEL.js";
|
|
5
5
|
import "./chunk-DQ22UKMZ.js";
|
|
6
6
|
import "./chunk-UDQSIRAP.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-EXEBN5ZP.js";
|
|
8
8
|
import "./chunk-7XSCEHGA.js";
|
|
9
9
|
import "./chunk-MTEQEPNY.js";
|
|
10
10
|
import "./chunk-6ZZGK5DT.js";
|
package/package.json
CHANGED
|
@@ -59,9 +59,13 @@ interface ImageState {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
|
-
* Tracks the
|
|
63
|
-
* a `src` and clears on load/error
|
|
64
|
-
* (via `slotProps.img` in the view
|
|
62
|
+
* Tracks the image's load lifecycle. `imageLoading` starts true whenever there is
|
|
63
|
+
* a `src` and clears on load/error. Two sources report it: the `<img>`'s own
|
|
64
|
+
* events (wired via `slotProps.img` in the view, since load/error don't bubble to
|
|
65
|
+
* the root), and a probe of the same src. The probe is needed because MUI's
|
|
66
|
+
* Avatar runs its own probe and, once that one errors, stops rendering the
|
|
67
|
+
* `<img>` — whose error event then never fires, leaving the avatar blank under
|
|
68
|
+
* the spinner forever (FUT-4467). Whichever reports first wins.
|
|
65
69
|
*/
|
|
66
70
|
function useImageState(src: string | undefined, onError?: React.ReactEventHandler): ImageState {
|
|
67
71
|
const [imageError, setImageError] = useState(false);
|
|
@@ -70,6 +74,21 @@ function useImageState(src: string | undefined, onError?: React.ReactEventHandle
|
|
|
70
74
|
useEffect(() => {
|
|
71
75
|
setImageError(false);
|
|
72
76
|
setImageLoading(!!src);
|
|
77
|
+
if (!src || typeof Image === 'undefined') return undefined;
|
|
78
|
+
let current = true;
|
|
79
|
+
const probe = new Image();
|
|
80
|
+
probe.onload = () => {
|
|
81
|
+
if (current) setImageLoading(false);
|
|
82
|
+
};
|
|
83
|
+
probe.onerror = () => {
|
|
84
|
+
if (!current) return;
|
|
85
|
+
setImageError(true);
|
|
86
|
+
setImageLoading(false);
|
|
87
|
+
};
|
|
88
|
+
probe.src = src;
|
|
89
|
+
return () => {
|
|
90
|
+
current = false;
|
|
91
|
+
};
|
|
73
92
|
}, [src]);
|
|
74
93
|
|
|
75
94
|
const handleImageError = useCallback<React.ReactEventHandler>(
|
|
@@ -11,8 +11,9 @@ import type { ColorValue, SizeValue } from '../../../tokens/vocabulary';
|
|
|
11
11
|
*/
|
|
12
12
|
/**
|
|
13
13
|
* `soft` is a status chip's look: the colour's tint for a ground and, for ink,
|
|
14
|
-
* its dark step in light mode
|
|
15
|
-
* tint either way), so a row of states reads
|
|
14
|
+
* its dark step in light mode (warning's darkened a step further) and its light
|
|
15
|
+
* step in dark mode (4.5:1 on the tint either way), so a row of states reads
|
|
16
|
+
* without a row of solid blocks.
|
|
16
17
|
*/
|
|
17
18
|
export type ChipVariant = 'filled' | 'outlined' | 'soft';
|
|
18
19
|
|
|
@@ -12,10 +12,11 @@ import {
|
|
|
12
12
|
OUTLINED_HOVER_ALPHA,
|
|
13
13
|
SOFT_GROUND_ALPHA,
|
|
14
14
|
SOFT_HOVER_ALPHA,
|
|
15
|
+
SOFT_WARNING_LIGHT_DARKEN,
|
|
15
16
|
type ChipMuiSize,
|
|
16
17
|
type ChipSizeMetrics,
|
|
17
18
|
} from './Chip.metrics';
|
|
18
|
-
import { alpha } from '../../../tokens/color';
|
|
19
|
+
import { alpha, darken } from '../../../tokens/color';
|
|
19
20
|
import type { UiTheme } from '../../../tokens/theme';
|
|
20
21
|
|
|
21
22
|
/** MUI's `action.selectedOpacity`; its hover wash adds `OUTLINED_HOVER_ALPHA` on top. */
|
|
@@ -64,8 +65,10 @@ function softPaint(theme: UiTheme, color: ChipColor): ChipPaint {
|
|
|
64
65
|
};
|
|
65
66
|
}
|
|
66
67
|
const accent = theme.palette[color];
|
|
67
|
-
// The ink that reads on a 14% tint: `dark` over a light page, `light` over a dark
|
|
68
|
-
|
|
68
|
+
// The ink that reads on a 14% tint: `dark` over a light page, `light` over a dark
|
|
69
|
+
// one; a light-mode warning darkens `dark` further, as the web does (FUT-4464).
|
|
70
|
+
const lightInk = color === 'warning' ? darken(accent.dark, SOFT_WARNING_LIGHT_DARKEN) : accent.dark;
|
|
71
|
+
const ink = theme.mode === 'dark' ? accent.light : lightInk;
|
|
69
72
|
return {
|
|
70
73
|
container: { backgroundColor: alpha(accent.main, SOFT_GROUND_ALPHA) },
|
|
71
74
|
pressed: { backgroundColor: alpha(accent.main, SOFT_HOVER_ALPHA) },
|
|
@@ -105,5 +105,11 @@ export const CHIP_TRANSITION_EASING = 'cubic-bezier(0.4, 0, 0.2, 1)';
|
|
|
105
105
|
export const SOFT_GROUND_ALPHA = 0.14;
|
|
106
106
|
/** A soft chip's hover ground. */
|
|
107
107
|
export const SOFT_HOVER_ALPHA = 0.22;
|
|
108
|
+
/**
|
|
109
|
+
* How much a light-mode soft WARNING ink darkens its `dark` step (FUT-4464). With
|
|
110
|
+
* the default theme, `warning.dark` (#e65100) on its 14% tint is 3.25:1; darkened
|
|
111
|
+
* by 0.2 it is 4.77:1. The other five colours clear 4.5:1 on `dark` as it is.
|
|
112
|
+
*/
|
|
113
|
+
export const SOFT_WARNING_LIGHT_DARKEN = 0.2;
|
|
108
114
|
/** A soft chip's keyboard-focus ring, in design px (read through `rem`). */
|
|
109
115
|
export const SOFT_FOCUS_RING = { width: 2, offset: 2 } as const;
|
|
@@ -4,7 +4,7 @@ import type { KeyboardEvent, ReactElement } from 'react';
|
|
|
4
4
|
import React from 'react';
|
|
5
5
|
|
|
6
6
|
import { chipKeyAction, type ChipKeyArgs } from './Chip.helpers';
|
|
7
|
-
import { alpha } from '@mui/material/styles/index.js';
|
|
7
|
+
import { alpha, darken } from '@mui/material/styles/index.js';
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
10
|
CHIP_SIZES,
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
SOFT_FOCUS_RING,
|
|
16
16
|
SOFT_GROUND_ALPHA,
|
|
17
17
|
SOFT_HOVER_ALPHA,
|
|
18
|
+
SOFT_WARNING_LIGHT_DARKEN,
|
|
18
19
|
} from './Chip.metrics';
|
|
19
20
|
import type { ChipProps } from './Chip.types';
|
|
20
21
|
import { shadowInk } from '../../../tokens/ink';
|
|
@@ -83,8 +84,10 @@ const paletteKey = (color: NonNullable<ChipProps['color']>): 'primary' | 'second
|
|
|
83
84
|
* `soft`: the colour's tint for a ground, and for ink the step that reads on it:
|
|
84
85
|
* the `dark` step in light mode, the `light` step in dark mode (FUT-4442). The
|
|
85
86
|
* ground is a 14% tint over the page, so on a near-black page the ink has to be
|
|
86
|
-
* lighter than `main`; `dark` there is 2.6 to 3.9:1, `light` clears 4.5:1.
|
|
87
|
-
*
|
|
87
|
+
* lighter than `main`; `dark` there is 2.6 to 3.9:1, `light` clears 4.5:1. In
|
|
88
|
+
* light mode warning's `dark` is 3.25:1 on its tint, so it is darkened by
|
|
89
|
+
* `SOFT_WARNING_LIGHT_DARKEN` (4.77:1, FUT-4464). The label, the icon and the
|
|
90
|
+
* delete glyph all take it.
|
|
88
91
|
*/
|
|
89
92
|
const softStyles = (color: NonNullable<ChipProps['color']>): SxProps<Theme> => {
|
|
90
93
|
const key = paletteKey(color);
|
|
@@ -92,7 +95,9 @@ const softStyles = (color: NonNullable<ChipProps['color']>): SxProps<Theme> => {
|
|
|
92
95
|
key ? alpha(theme.palette[key].main, SOFT_GROUND_ALPHA) : theme.palette.action.selected;
|
|
93
96
|
const ink = (theme: Theme): string => {
|
|
94
97
|
if (!key) return theme.palette.text.secondary;
|
|
95
|
-
|
|
98
|
+
if (theme.palette.mode === 'dark') return theme.palette[key].light;
|
|
99
|
+
// Warning's `dark` step is too light for its own tint (FUT-4464).
|
|
100
|
+
return key === 'warning' ? darken(theme.palette.warning.dark, SOFT_WARNING_LIGHT_DARKEN) : theme.palette[key].dark;
|
|
96
101
|
};
|
|
97
102
|
return {
|
|
98
103
|
backgroundColor: ground,
|
|
@@ -29,7 +29,7 @@ interface ChipProps {
|
|
|
29
29
|
|
|
30
30
|
**Features**
|
|
31
31
|
|
|
32
|
-
- Filled/Outlined/Soft variants; optional avatar or icon. `soft` is a status chip: the colour's tint for a ground and, for ink, its dark step in light mode and its light step in dark mode.
|
|
32
|
+
- Filled/Outlined/Soft variants; optional avatar or icon. `soft` is a status chip: the colour's tint for a ground and, for ink, its dark step in light mode (warning's darkened a step further, FUT-4464) and its light step in dark mode.
|
|
33
33
|
- Selectable (toggle) and/or deletable (× button).
|
|
34
34
|
- Keyboard: Space/Enter activates; Delete/Backspace triggers remove when focused.
|
|
35
35
|
|
|
@@ -52,6 +52,10 @@ serves a supplier form, a store-location form or a delivery checkout.
|
|
|
52
52
|
form for somebody else's address (a supplier), or the browser offers the signed-in
|
|
53
53
|
person's own CEP and the lookup then fills their street (FUT-4140). Same prop on
|
|
54
54
|
`Fields.CepField`
|
|
55
|
+
- `passwordManagers`: `offer` (default) or `ignore`. `ignore` puts `data-lpignore`,
|
|
56
|
+
`data-1p-ignore` and `data-bwignore` on the `<input>`, so LastPass, 1Password and
|
|
57
|
+
Bitwarden stop drawing their icon in a lone CEP box they read as a login field
|
|
58
|
+
(FUT-4444). The browser's own `autocomplete` still offers a saved CEP
|
|
55
59
|
|
|
56
60
|
### State Props
|
|
57
61
|
|
|
@@ -121,6 +121,18 @@ function CepStatus({
|
|
|
121
121
|
/** What only the `<input>` can act on. Hoisted: one object for every render. */
|
|
122
122
|
const CEP_INPUT_PROPS = { inputMode: 'numeric' } as const;
|
|
123
123
|
|
|
124
|
+
/** The same, plus each password manager's own "not mine" flag (`passwordManagers="ignore"`, FUT-4444). */
|
|
125
|
+
const CEP_INPUT_PROPS_NO_MANAGERS = {
|
|
126
|
+
...CEP_INPUT_PROPS,
|
|
127
|
+
'data-lpignore': 'true',
|
|
128
|
+
'data-1p-ignore': 'true',
|
|
129
|
+
'data-bwignore': 'true',
|
|
130
|
+
} as const;
|
|
131
|
+
|
|
132
|
+
/** The `<input>`'s own props: the keypad always, the managers' flags only when asked (`offer` is the default). */
|
|
133
|
+
const inputPropsOf = (passwordManagers: 'offer' | 'ignore' | undefined) =>
|
|
134
|
+
passwordManagers === 'ignore' ? CEP_INPUT_PROPS_NO_MANAGERS : CEP_INPUT_PROPS;
|
|
135
|
+
|
|
124
136
|
/** `postal-code` unless the caller said otherwise (`off` for somebody else's address). */
|
|
125
137
|
const autoCompleteOf = (autoComplete: string | undefined): string => autoComplete ?? 'postal-code';
|
|
126
138
|
|
|
@@ -188,6 +200,7 @@ export function CepField({
|
|
|
188
200
|
size, // undefined reaches `Input`, whose own default is `md`
|
|
189
201
|
labelPlacement = 'above',
|
|
190
202
|
autoComplete,
|
|
203
|
+
passwordManagers,
|
|
191
204
|
}: CepFieldProps): React.ReactElement {
|
|
192
205
|
const testId = dataTestId ?? `cep-field-${name}`;
|
|
193
206
|
|
|
@@ -217,7 +230,7 @@ export function CepField({
|
|
|
217
230
|
// prop `Input` does not recognise, so it landed on the wrapper `div`
|
|
218
231
|
// and the phone kept opening the letter keyboard for eight digits
|
|
219
232
|
// (FUT-1440's CepField row).
|
|
220
|
-
inputProps={
|
|
233
|
+
inputProps={inputPropsOf(passwordManagers)}
|
|
221
234
|
autoComplete={autoCompleteOf(autoComplete)}
|
|
222
235
|
size={size}
|
|
223
236
|
// `inside`: the label is the Input's own, drawn in the box and floating
|
|
@@ -97,4 +97,13 @@ export interface CepFieldProps {
|
|
|
97
97
|
* (FUT-4140).
|
|
98
98
|
*/
|
|
99
99
|
autoComplete?: string;
|
|
100
|
+
/**
|
|
101
|
+
* Whether password managers may treat the box as theirs. `offer` (default)
|
|
102
|
+
* leaves them alone, as the field always has. `ignore` marks the `<input>`
|
|
103
|
+
* with `data-lpignore`, `data-1p-ignore` and `data-bwignore`, so LastPass,
|
|
104
|
+
* 1Password and Bitwarden keep their icon and fill out of a lone CEP box that
|
|
105
|
+
* their heuristics read as a login field (FUT-4444). The browser's own
|
|
106
|
+
* `autocomplete` is untouched: a saved CEP is still offered.
|
|
107
|
+
*/
|
|
108
|
+
passwordManagers?: 'offer' | 'ignore';
|
|
100
109
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Chip/Chip.styles.tsx"],"sourcesContent":["import Avatar from '@mui/material/Avatar/index.js';\nimport type { SxProps, Theme } from '@mui/material/styles/index.js';\nimport type { KeyboardEvent, ReactElement } from 'react';\nimport React from 'react';\n\nimport { chipKeyAction, type ChipKeyArgs } from './Chip.helpers';\nimport { alpha } from '@mui/material/styles/index.js';\n\nimport {\n CHIP_SIZES,\n CHIP_TRANSITION_EASING,\n CHIP_TRANSITION_MS,\n HOVER_LIFT_PX,\n HOVER_SHADOW,\n SOFT_FOCUS_RING,\n SOFT_GROUND_ALPHA,\n SOFT_HOVER_ALPHA,\n} from './Chip.metrics';\nimport type { ChipProps } from './Chip.types';\nimport { shadowInk } from '../../../tokens/ink';\nimport { rem, rems, sxRem } from '../../../tokens/relative';\n\n/**\n * A chip is not a native control, so the two keyboard conventions it stands in\n * for are wired by hand: Delete/Backspace removes it, Enter/Space activates it.\n * The DECISION is `chipKeyAction`, which the native half reads too.\n */\nexport const makeKeyDownHandler =\n (args: ChipKeyArgs & { onClick?: () => void; onDelete?: () => void }) =>\n (event: KeyboardEvent): void => {\n const action = chipKeyAction(event.key, args);\n if (action === null) return;\n event.preventDefault();\n if (action === 'delete') {\n args.onDelete?.();\n return;\n }\n args.onClick?.();\n };\n\nexport const avatarFor = (\n avatar: ChipProps['avatar'],\n avatarSrc?: string,\n): ReactElement | undefined => {\n if (avatar && React.isValidElement(avatar)) {\n return avatar;\n }\n if (avatarSrc) {\n const { avatarSize } = CHIP_SIZES.medium;\n return <Avatar src={avatarSrc} sx={{ width: sxRem(avatarSize), height: sxRem(avatarSize) }} />;\n }\n return undefined;\n};\n\ninterface ChipStyleArgs {\n variant: ChipProps['variant'];\n color?: ChipProps['color'];\n selected?: boolean;\n clickable?: boolean;\n disabled?: boolean;\n}\n\n/** The lift's shadow, per mode — the same numbers the native chip reads. */\nconst hoverShadow = (theme: Theme): string =>\n `0 ${rems(theme, HOVER_SHADOW.offsetY, HOVER_SHADOW.blur)} ${shadowInk(\n theme,\n theme.palette.mode === 'dark' ? HOVER_SHADOW.alphaDark : HOVER_SHADOW.alphaLight,\n )}`;\n\n/**\n * Selection styling uses SEMANTIC palette tokens (not hardcoded rgba). A filled\n * selected chip keeps MUI's solid `color.main` + contrast text (clear active\n * state); an outlined selected chip gets a subtle theme-driven `action.selected`\n * tint so it reads as active without muddying the fill.\n */\n/** The palette entry a colour paints with; `neutral` has none and takes the ink. */\nconst paletteKey = (color: NonNullable<ChipProps['color']>): 'primary' | 'secondary' | 'error' | 'info' | 'success' | 'warning' | null => {\n if (color === 'neutral') return null;\n return color === 'danger' ? 'error' : color;\n};\n\n/**\n * `soft`: the colour's tint for a ground, and for ink the step that reads on it:\n * the `dark` step in light mode, the `light` step in dark mode (FUT-4442). The\n * ground is a 14% tint over the page, so on a near-black page the ink has to be\n * lighter than `main`; `dark` there is 2.6 to 3.9:1, `light` clears 4.5:1. The\n * label, the icon and the delete glyph all take it.\n */\nconst softStyles = (color: NonNullable<ChipProps['color']>): SxProps<Theme> => {\n const key = paletteKey(color);\n const ground = (theme: Theme): string =>\n key ? alpha(theme.palette[key].main, SOFT_GROUND_ALPHA) : theme.palette.action.selected;\n const ink = (theme: Theme): string => {\n if (!key) return theme.palette.text.secondary;\n return theme.palette.mode === 'dark' ? theme.palette[key].light : theme.palette[key].dark;\n };\n return {\n backgroundColor: ground,\n color: ink,\n // A state is read at a glance: the label is set semibold.\n fontWeight: 600,\n '& .MuiChip-icon': { color: ink },\n '&.MuiChip-clickable:hover': {\n backgroundColor: (theme: Theme) => (key ? alpha(theme.palette[key].main, SOFT_HOVER_ALPHA) : theme.palette.action.hover),\n },\n // `neutral` keeps MUI's glyph and focus exactly as they were.\n ...(key ? (accentedStates(key, ink) as object) : {}),\n };\n};\n\n/**\n * What only an accented soft chip changes (FUT-4442, FUT-4461). MUI paints the\n * delete glyph in `contrastText` at 0.7, near-black on a dark ground, so the glyph\n * takes the ink. Focus, in both modes: the chip keeps its resting ground (MUI's\n * `dark` step puts the ink at about 1:1 in light mode and sinks the light ink in\n * dark mode) and draws a ring in the ink, so focus shows without the ground.\n */\nconst accentedStates = (\n key: Exclude<ReturnType<typeof paletteKey>, null>,\n ink: (theme: Theme) => string,\n): SxProps<Theme> => ({\n '& .MuiChip-deleteIcon': { color: ink, '&:hover': { color: ink } },\n '&.Mui-focusVisible': {\n backgroundColor: (theme: Theme) => alpha(theme.palette[key].main, SOFT_GROUND_ALPHA),\n outlineStyle: 'solid',\n outlineWidth: (theme: Theme) => rem(theme, SOFT_FOCUS_RING.width),\n outlineColor: ink,\n outlineOffset: (theme: Theme) => rem(theme, SOFT_FOCUS_RING.offset),\n },\n});\n\nexport const chipStyles = ({\n variant,\n color = 'primary',\n selected,\n clickable,\n disabled,\n}: ChipStyleArgs): SxProps<Theme> => {\n const lifts = clickable && !disabled;\n\n return {\n ...(variant === 'soft' ? (softStyles(color) as object) : {}),\n // Enhanced styling for outlined variant\n ...(variant === 'outlined' && {\n borderWidth: '1px',\n borderStyle: 'solid',\n backgroundColor: 'transparent',\n }),\n ...(selected &&\n variant === 'outlined' && {\n backgroundColor: (theme: Theme) => theme.palette.action.selected,\n }),\n '&:hover': {\n ...(lifts && {\n transform: (theme: Theme) => `translateY(${rem(theme, -HOVER_LIFT_PX)})`,\n boxShadow: (theme: Theme) => hoverShadow(theme),\n }),\n },\n '&:active': {\n ...(lifts && {\n transform: 'translateY(0px)',\n }),\n },\n transition: `all ${CHIP_TRANSITION_MS / 1000}s ${CHIP_TRANSITION_EASING}`,\n };\n};\n\nexport const iconWithTestId = (\n icon: ChipProps['icon'],\n testId: string,\n): ReactElement | undefined =>\n icon && React.isValidElement(icon)\n ? React.cloneElement(icon as ReactElement, {\n 'data-testid': testId,\n } as Record<string, unknown>)\n : undefined;\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Avatar/Avatar.tsx"],"sourcesContent":["import BrokenImage from '@mui/icons-material/BrokenImage';\nimport Person from '@mui/icons-material/Person';\nimport { styled } from '@mui/material/styles/index.js';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport {\n AVATAR_DEFAULTS,\n contentTypeOf,\n pickAvatarContent,\n type AvatarContentPick,\n} from './Avatar.helpers';\nimport { GROUP_MAX, GROUP_OVERLAP, GROUP_HOVER, BORDER_WIDTH } from './Avatar.metrics';\nimport type { AvatarProps, ContentType } from './Avatar.types';\nimport { rem } from '../../../tokens/relative';\nimport { AvatarView, type AvatarViewProps } from './Avatar.view';\nimport { EN_US_UI_LABELS } from '../../../en-US.labels';\n\n/** The node behind the winning content slot; the pick itself is shared. */\nfunction resolveContent(args: {\n children?: React.ReactNode;\n fallback?: React.ReactNode;\n icon?: React.ReactNode;\n imageError: boolean;\n showFallbackOnError: boolean;\n}): { content: React.ReactNode; contentType: ContentType } {\n const { children, fallback, icon, imageError, showFallbackOnError } = args;\n const pick = pickAvatarContent({\n hasChildren: Boolean(children),\n hasFallback: Boolean(fallback),\n hasIcon: Boolean(icon),\n imageError,\n showFallbackOnError,\n });\n const NODES: Record<AvatarContentPick, React.ReactNode> = {\n children,\n fallback,\n icon,\n broken: <BrokenImage />,\n default: <Person />,\n };\n return { content: NODES[pick], contentType: contentTypeOf(pick) };\n}\n\n/** Fades the avatar in after `animationDelay`ms. */\nfunction useMountedFade(animationDelay: number): boolean {\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n const timer = window.setTimeout(() => setMounted(true), animationDelay);\n return () => window.clearTimeout(timer);\n }, [animationDelay]);\n return mounted;\n}\n\ninterface ImageState {\n imageError: boolean;\n imageLoading: boolean;\n handleImageError: React.ReactEventHandler;\n handleImageLoad: () => void;\n}\n\n/**\n * Tracks the `<img>` load lifecycle. `imageLoading` starts true whenever there is\n * a `src` and clears on load/error — the handlers must be wired to the actual img\n * (via `slotProps.img` in the view), since load/error don't bubble to the root.\n */\nfunction useImageState(src: string | undefined, onError?: React.ReactEventHandler): ImageState {\n const [imageError, setImageError] = useState(false);\n const [imageLoading, setImageLoading] = useState(!!src);\n\n useEffect(() => {\n setImageError(false);\n setImageLoading(!!src);\n }, [src]);\n\n const handleImageError = useCallback<React.ReactEventHandler>(\n (event) => {\n setImageError(true);\n setImageLoading(false);\n onError?.(event);\n },\n [onError],\n );\n\n const handleImageLoad = useCallback(() => setImageLoading(false), []);\n\n return { imageError, imageLoading, handleImageError, handleImageLoad };\n}\n\n/** Normalizes props (defaults + rest passthrough) and derives everything the view needs. */\nfunction useAvatarModel(raw: AvatarProps, ref: React.Ref<HTMLDivElement>): AvatarViewProps {\n const {\n variant,\n size,\n glow,\n pulse,\n status,\n fallback,\n icon,\n bordered,\n color,\n src,\n alt,\n children,\n loading,\n onError,\n onClick,\n interactive,\n showFallbackOnError,\n animationDelay,\n className,\n dataTestId,\n // React Native's spelling of the same id; it names the component on both\n // sides and must not reach the DOM as an attribute.\n testID,\n ...rest\n } = { ...AVATAR_DEFAULTS, ...raw };\n\n const mounted = useMountedFade(animationDelay);\n const { imageError, imageLoading, handleImageError, handleImageLoad } = useImageState(src, onError);\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => onClick?.(event),\n [onClick],\n );\n const { content, contentType } = resolveContent({\n children,\n fallback,\n icon,\n imageError,\n showFallbackOnError,\n });\n\n return {\n mounted,\n variant,\n size,\n color,\n glow,\n pulse,\n bordered,\n showSpinner: loading || imageLoading,\n imageError,\n clickable: interactive || !!onClick,\n imgSrc: imageError ? undefined : src,\n alt,\n ariaLabel: (rest['aria-label'] as string) || alt || EN_US_UI_LABELS.avatar.name,\n content,\n contentType,\n className,\n dataTestId: testID ?? dataTestId,\n status,\n forwardedRef: ref,\n onClick: handleClick,\n handleImageError,\n handleImageLoad,\n rest,\n };\n}\n\nexport const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>((props, ref) => (\n <AvatarView {...useAvatarModel(props, ref)} />\n));\n\nAvatar.displayName = 'Avatar';\n\nconst AvatarGroupContainer = styled('div')<{ overlap?: number }>(({ theme, overlap = GROUP_OVERLAP }) => ({\n display: 'flex',\n alignItems: 'center',\n '& > *': {\n marginLeft: rem(theme, -overlap),\n transition: 'all 0.3s ease',\n position: 'relative',\n border: `${rem(theme, BORDER_WIDTH)} solid ${theme.palette.background.paper}`,\n '&:hover': {\n zIndex: 100,\n transform: `scale(${GROUP_HOVER.scale}) translateY(${rem(theme, -GROUP_HOVER.lift)})`,\n },\n '&:first-of-type': {\n marginLeft: 0,\n },\n },\n}));\n\n// Export AvatarGroup for grouped avatars\nexport const AvatarGroup: React.FC<{\n children: React.ReactNode;\n max?: number;\n overlap?: number;\n className?: string;\n dataTestId?: string;\n}> = ({ children, max = GROUP_MAX, overlap = GROUP_OVERLAP, className, dataTestId }) => {\n const childrenArray = React.Children.toArray(children);\n const visibleChildren = max ? childrenArray.slice(0, max) : childrenArray;\n const remainingCount = childrenArray.length - visibleChildren.length;\n\n return (\n <AvatarGroupContainer overlap={overlap} className={className} data-testid={dataTestId}>\n {visibleChildren}\n {remainingCount > 0 && (\n <Avatar\n size={(visibleChildren[0] as React.ReactElement<AvatarProps>)?.props?.size || 'md'}\n color=\"neutral\"\n fallback={`+${remainingCount}`}\n bordered\n dataTestId={dataTestId ? `${dataTestId}-overflow` : undefined}\n />\n )}\n </AvatarGroupContainer>\n );\n};\n\nAvatarGroup.displayName = 'AvatarGroup';\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/form/CepField/CepField.tsx"],"sourcesContent":["'use client';\n\nimport type { CepFieldCopy } from \"../../../copy\";\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { cepDigits, formatCep, isValidCep } from '@12-apps/forms-core';\n\nimport { FormControl, FormLabel, FormMessage } from '../Form';\n// The outlined entry: CepField renders no variant, and the generic one would\n// ship MUI's FilledInput and Input to every screen with a CEP field (FUT-1054).\nimport { Input } from '../Input/outlined';\nimport type { CepAddress, CepFieldProps, CepLookupStatus } from './CepField.types';\n\n/** Everything {@link useCepLookup} needs, so the hook signature stays flat. */\ninterface LookupOptions {\n digits: string;\n complete: boolean;\n disabled: boolean;\n debounceMs: number;\n onLookup?: (cep: string) => Promise<CepAddress | null>;\n onResolved?: (address: CepAddress) => void;\n onNotFound?: () => void;\n}\n\n/**\n * Debounced, race-safe CEP resolution.\n *\n * Two guards earn their keep here: a monotonic sequence id, bumped\n * synchronously on every new query, so a slow response for a since-edited CEP\n * can never land; and a \"last queried\" marker, so re-rendering (or the caller\n * re-masking the same value) never re-hits the provider.\n */\nfunction useCepLookup({\n digits,\n complete,\n disabled,\n debounceMs,\n onLookup,\n onResolved,\n onNotFound,\n}: LookupOptions): CepLookupStatus {\n const [status, setStatus] = useState<CepLookupStatus>('idle');\n const lastQueriedRef = useRef('');\n const seqRef = useRef(0);\n // Latest callbacks, read at call time — keeps them out of the effect deps so\n // an inline arrow from the caller doesn't re-trigger the lookup every render.\n const lookupRef = useRef(onLookup);\n const resolvedRef = useRef(onResolved);\n const notFoundRef = useRef(onNotFound);\n lookupRef.current = onLookup;\n resolvedRef.current = onResolved;\n notFoundRef.current = onNotFound;\n\n useEffect(() => {\n if (!complete || disabled || !lookupRef.current) {\n // Editing away from a complete CEP drops any stale status and forgets the\n // last query, so re-typing the same CEP resolves again.\n seqRef.current += 1;\n setStatus('idle');\n lastQueriedRef.current = '';\n return;\n }\n if (lastQueriedRef.current === digits) return;\n\n const mySeq = (seqRef.current += 1);\n const handle = setTimeout(() => {\n lastQueriedRef.current = digits;\n setStatus('loading');\n void (async () => {\n // A failing lookup is treated exactly like \"not found\" — the user types\n // the address instead. Never surfaced as a crash. Going through\n // `Promise.resolve().then` rather than calling directly covers the two\n // failure modes an `await … .catch()` misses: a lookup that throws\n // SYNCHRONOUSLY, and one that returns something other than a promise.\n const address = await Promise.resolve()\n .then(() => lookupRef.current?.(digits))\n .catch(() => null);\n if (seqRef.current !== mySeq) return;\n setStatus(address ? 'found' : 'notfound');\n // A miss is reported too, so a caller that filled from a PREVIOUS CEP\n // can undo it rather than leaving that address under this CEP.\n if (address) resolvedRef.current?.(address);\n else notFoundRef.current?.();\n })();\n }, debounceMs);\n\n return () => clearTimeout(handle);\n }, [digits, complete, disabled, debounceMs]);\n\n return status;\n}\n\n/**\n * The lookup outcome as a live region, so screen readers announce it without\n * stealing focus. Silent while idle, and while the caller is showing its own\n * validation error (which would otherwise stack two messages).\n */\nfunction CepStatus({\n status,\n testId,\n suppressed,\n copy,\n}: {\n status: CepLookupStatus;\n testId: string;\n suppressed: boolean;\n copy: CepFieldCopy;\n}): React.ReactElement {\n const visible = !suppressed && status !== 'idle';\n return (\n <span id={`${testId}-status`} role=\"status\" aria-live=\"polite\">\n {visible && (\n <FormMessage error={status === 'notfound'} dataTestId={`${testId}-${status}`}>\n {copy[status as Exclude<CepLookupStatus, 'idle'>]}\n </FormMessage>\n )}\n </span>\n );\n}\n\n/** What only the `<input>` can act on. Hoisted: one object for every render. */\nconst CEP_INPUT_PROPS = { inputMode: 'numeric' } as const;\n\n/** `postal-code` unless the caller said otherwise (`off` for somebody else's address). */\nconst autoCompleteOf = (autoComplete: string | undefined): string => autoComplete ?? 'postal-code';\n\n/** The stacked label over the box (`labelPlacement=\"above\"`), or nothing when there is no label. */\nfunction AboveLabel({\n name,\n label,\n error,\n}: {\n name: string;\n label?: string;\n error?: string;\n}): React.ReactElement | null {\n if (!label) return null;\n return (\n <FormLabel htmlFor={name} error={Boolean(error)}>\n {label}\n </FormLabel>\n );\n}\n\n/** The label handed to the `Input`, which draws it in the box: only for `inside`. */\nfunction insideLabel(label: string | undefined, placement: 'above' | 'inside'): string | undefined {\n return placement === 'inside' ? label : undefined;\n}\n\n/**\n * A CEP input that fills the rest of the address in.\n *\n * The pattern every Brazilian form has used for twenty years: type eight\n * digits, and logradouro/bairro/cidade/UF arrive on their own. This is the\n * reusable half — masking, validation, debouncing, race-safety and status —\n * with the actual lookup injected via `onLookup`, so the same component serves\n * a supplier form, a store-location form or a delivery checkout without\n * knowing anything about providers or auth.\n *\n * Resolution is best-effort by design. A provider outage, an unknown CEP or a\n * timeout leaves the field exactly as usable as a plain text input — the user\n * types the address themselves. Autofill never blocks.\n *\n * @example\n * ```tsx\n * <CepField\n * value={cep}\n * onChange={setCep}\n * onLookup={(c) => fetch(`/api/…/lookup/cep/${c}`).then((r) => r.json()).then((b) => b.data)}\n * onResolved={(a) => { setStreet(a.street ?? ''); setCity(a.city ?? ''); }}\n * />\n * ```\n */\nexport function CepField({\n value,\n onChange,\n onLookup,\n onResolved,\n onNotFound,\n label = 'CEP',\n placeholder = '00000-000',\n error,\n disabled = false,\n debounceMs = 500,\n name = 'postalCode',\n dataTestId,\n copy,\n size, // undefined reaches `Input`, whose own default is `md`\n labelPlacement = 'above',\n autoComplete,\n}: CepFieldProps): React.ReactElement {\n const testId = dataTestId ?? `cep-field-${name}`;\n\n const status = useCepLookup({\n digits: cepDigits(value),\n complete: isValidCep(value),\n disabled,\n debounceMs,\n onLookup,\n onResolved,\n onNotFound,\n });\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => onChange(formatCep(event.target.value)),\n [onChange],\n );\n\n return (\n <FormControl fullWidth>\n {labelPlacement === 'above' && <AboveLabel name={name} label={label} error={error} />}\n <Input\n id={name}\n name={name}\n type=\"text\"\n // On the `<input>`, through `inputProps`: a top-level `inputMode` is a\n // prop `Input` does not recognise, so it landed on the wrapper `div`\n // and the phone kept opening the letter keyboard for eight digits\n // (FUT-1440's CepField row).\n inputProps={CEP_INPUT_PROPS}\n autoComplete={autoCompleteOf(autoComplete)}\n size={size}\n // `inside`: the label is the Input's own, drawn in the box and floating\n // up on focus or a value — what every other `Input` in the form does.\n // `above` keeps the stacked `FormLabel`, for callers that never opted in.\n label={insideLabel(label, labelPlacement)}\n placeholder={placeholder}\n value={value}\n error={Boolean(error)}\n disabled={disabled}\n loading={status === 'loading'}\n onChange={handleChange}\n data-testid={testId}\n aria-describedby={`${testId}-status`}\n aria-busy={status === 'loading'}\n />\n {error && (\n <FormMessage error dataTestId={`${testId}-message`}>\n {error}\n </FormMessage>\n )}\n <CepStatus status={status} testId={testId} suppressed={Boolean(error)} copy={copy} />\n </FormControl>\n );\n}\n\nexport default CepField;\n"],"mappings":"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","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|