@atlaskit/lozenge 13.1.2 → 13.2.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.
Files changed (45) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/index.js +8 -1
  3. package/dist/cjs/lozenge.js +19 -6
  4. package/dist/cjs/new/icon-renderer.js +73 -0
  5. package/dist/cjs/new/lozenge-base.compiled.css +153 -0
  6. package/dist/cjs/new/lozenge-base.js +140 -0
  7. package/dist/cjs/new/lozenge-dropdown-trigger.js +59 -0
  8. package/dist/cjs/new/lozenge.js +44 -0
  9. package/dist/cjs/new/types.js +5 -0
  10. package/dist/cjs/new/utils.js +35 -0
  11. package/dist/es2019/index.js +2 -1
  12. package/dist/es2019/lozenge.js +18 -6
  13. package/dist/es2019/new/icon-renderer.js +67 -0
  14. package/dist/es2019/new/lozenge-base.compiled.css +153 -0
  15. package/dist/es2019/new/lozenge-base.js +133 -0
  16. package/dist/es2019/new/lozenge-dropdown-trigger.js +47 -0
  17. package/dist/es2019/new/lozenge.js +34 -0
  18. package/dist/es2019/new/types.js +1 -0
  19. package/dist/es2019/new/utils.js +28 -0
  20. package/dist/esm/index.js +2 -1
  21. package/dist/esm/lozenge.js +18 -6
  22. package/dist/esm/new/icon-renderer.js +66 -0
  23. package/dist/esm/new/lozenge-base.compiled.css +153 -0
  24. package/dist/esm/new/lozenge-base.js +131 -0
  25. package/dist/esm/new/lozenge-dropdown-trigger.js +50 -0
  26. package/dist/esm/new/lozenge.js +35 -0
  27. package/dist/esm/new/types.js +1 -0
  28. package/dist/esm/new/utils.js +29 -0
  29. package/dist/types/index.d.ts +2 -0
  30. package/dist/types/lozenge.d.ts +6 -9
  31. package/dist/types/new/icon-renderer.d.ts +26 -0
  32. package/dist/types/new/lozenge-base.d.ts +9 -0
  33. package/dist/types/new/lozenge-dropdown-trigger.d.ts +15 -0
  34. package/dist/types/new/lozenge.d.ts +15 -0
  35. package/dist/types/new/types.d.ts +104 -0
  36. package/dist/types/new/utils.d.ts +6 -0
  37. package/dist/types-ts4.5/index.d.ts +2 -0
  38. package/dist/types-ts4.5/lozenge.d.ts +6 -9
  39. package/dist/types-ts4.5/new/icon-renderer.d.ts +26 -0
  40. package/dist/types-ts4.5/new/lozenge-base.d.ts +9 -0
  41. package/dist/types-ts4.5/new/lozenge-dropdown-trigger.d.ts +15 -0
  42. package/dist/types-ts4.5/new/lozenge.d.ts +15 -0
  43. package/dist/types-ts4.5/new/types.d.ts +104 -0
  44. package/dist/types-ts4.5/new/utils.d.ts +6 -0
  45. package/package.json +11 -8
@@ -4,11 +4,12 @@ import * as React from 'react';
4
4
  import { ax, ix } from "@compiled/react/runtime";
5
5
  import { memo, useMemo } from 'react';
6
6
  import { fg } from '@atlaskit/platform-feature-flags';
7
+ import NewLozenge from './new/lozenge';
7
8
  /**
8
9
  * TODO: We should be using our bounded `cssMap` here, but most of
9
10
  * these styles from the visual refresh are not in the Design System.
10
11
  */
11
- const stylesNew = {
12
+ const styles = {
12
13
  container: "_2rkofajl _1reo15vq _18m915vq _1e0c116y _vchhusvi _kqswpfqs _1kz6184x _bozg1b66 _y4ti1b66",
13
14
  containerSubtle: "_1cwg1n1a",
14
15
  text: "_1reo15vq _18m915vq _ect41gqc _1wyb1skh _zg8l4jg8 _k48pmoej _vwz47vkz _1bto1l2s _1p1dangw _o5721q9c",
@@ -44,7 +45,7 @@ const appearanceTypes = ['default', 'inprogress', 'moved', 'new', 'removed', 'su
44
45
  * - [Code](https://atlassian.design/components/lozenge/code)
45
46
  * - [Usage](https://atlassian.design/components/lozenge/usage)
46
47
  */
47
- const Lozenge = /*#__PURE__*/memo(({
48
+ const LegacyLozenge = /*#__PURE__*/memo(({
48
49
  children,
49
50
  testId,
50
51
  isBold = false,
@@ -62,7 +63,7 @@ const Lozenge = /*#__PURE__*/memo(({
62
63
  maxWidth: maxWidthIsPc ? maxWidth : '100%'
63
64
  },
64
65
  "data-testid": testId,
65
- className: ax([stylesNew.container, stylesNew[`bg.${appearanceStyle}.${appearanceType}`], appearanceStyle === 'subtle' && stylesNew[`outline.subtle.${appearanceType}`], appearanceStyle === 'subtle' && stylesNew.containerSubtle])
66
+ className: ax([styles.container, styles[`bg.${appearanceStyle}.${appearanceType}`], appearanceStyle === 'subtle' && styles[`outline.subtle.${appearanceType}`], appearanceStyle === 'subtle' && styles.containerSubtle])
66
67
  }, /*#__PURE__*/React.createElement("span", {
67
68
  style: {
68
69
  color: style === null || style === void 0 ? void 0 : style.color,
@@ -70,8 +71,19 @@ const Lozenge = /*#__PURE__*/memo(({
70
71
  maxWidth: maxWidthIsPc ? '100%' : `calc(${maxWidthValue} - ${"var(--ds-space-100, 8px)"})`
71
72
  },
72
73
  "data-testid": testId && `${testId}--text`,
73
- className: ax([stylesNew.text, fg('platform-lozenge-custom-letterspacing') && stylesNew.customLetterspacing, stylesNew[`text.${appearanceStyle}`]])
74
+ className: ax([styles.text, fg('platform-lozenge-custom-letterspacing') && styles.customLetterspacing, styles[`text.${appearanceStyle}`]])
74
75
  }, children));
75
76
  });
76
- Lozenge.displayName = 'Lozenge';
77
- export default Lozenge;
77
+ LegacyLozenge.displayName = 'Lozenge';
78
+
79
+ /**
80
+ * Wrapper component that switches between old and new Lozenge based on feature flag
81
+ */
82
+ const LozengeWrapper = /*#__PURE__*/memo(props => {
83
+ if (fg('platform-dst-lozenge-tag-badge-visual-uplifts')) {
84
+ return /*#__PURE__*/React.createElement(NewLozenge, props);
85
+ }
86
+ return /*#__PURE__*/React.createElement(LegacyLozenge, props);
87
+ });
88
+ LozengeWrapper.displayName = 'Lozenge';
89
+ export default LozengeWrapper;
@@ -0,0 +1,67 @@
1
+ import React from 'react';
2
+ // Map lozenge colors to appropriate icon colors
3
+ const getIconColor = (color, isSelected) => {
4
+ // When lozenge is selected and interactive, use selected text color for consistency
5
+ if (isSelected) {
6
+ return "var(--ds-icon-selected, #1868DB)";
7
+ }
8
+
9
+ // For semantic colors, use corresponding semantic text colors
10
+ switch (color) {
11
+ case 'success':
12
+ return "var(--ds-icon-success, #6A9A23)";
13
+ case 'warning':
14
+ return "var(--ds-icon-warning, #E06C00)";
15
+ case 'danger':
16
+ return "var(--ds-icon-danger, #C9372C)";
17
+ case 'information':
18
+ return "var(--ds-icon-information, #357DE8)";
19
+ case 'neutral':
20
+ return "var(--ds-icon-subtlest, #6B6E76)";
21
+ case 'discovery':
22
+ return "var(--ds-icon-discovery, #AF59E1)";
23
+ // For accent colors, use corresponding accent icon colors
24
+ case 'accent-red':
25
+ return "var(--ds-icon-accent-red, #C9372C)";
26
+ case 'accent-orange':
27
+ return "var(--ds-icon-accent-orange, #E06C00)";
28
+ case 'accent-yellow':
29
+ return "var(--ds-icon-accent-yellow, #B38600)";
30
+ case 'accent-lime':
31
+ return "var(--ds-icon-accent-lime, #6A9A23)";
32
+ case 'accent-green':
33
+ return "var(--ds-icon-accent-green, #22A06B)";
34
+ case 'accent-teal':
35
+ return "var(--ds-icon-accent-teal, #2898BD)";
36
+ case 'accent-blue':
37
+ return "var(--ds-icon-accent-blue, #357DE8)";
38
+ case 'accent-purple':
39
+ return "var(--ds-icon-accent-purple, #AF59E1)";
40
+ case 'accent-magenta':
41
+ return "var(--ds-icon-accent-magenta, #CD519D)";
42
+ case 'accent-gray':
43
+ return "var(--ds-icon-accent-gray, #7D818A)";
44
+ default:
45
+ return "var(--ds-icon-subtlest, #6B6E76)";
46
+ }
47
+ };
48
+
49
+ /**
50
+ * Icon renderer for lozenge components
51
+ * Handles proper sizing and color theming for icons
52
+ */
53
+ export const IconRenderer = ({
54
+ icon: Icon,
55
+ color,
56
+ isSelected,
57
+ testId
58
+ }) => {
59
+ const iconColor = getIconColor(color, isSelected);
60
+ return /*#__PURE__*/React.createElement(Icon, {
61
+ color: iconColor,
62
+ label: "",
63
+ size: "small",
64
+ testId: testId
65
+ });
66
+ };
67
+ export default IconRenderer;
@@ -0,0 +1,153 @@
1
+
2
+ ._11c81o8v{font:var(--ds-font-body-small,normal 400 11px/1pc ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Ubuntu,"Helvetica Neue",sans-serif)}
3
+ ._2rko12b0{border-radius:var(--ds-radius-small,4px)}
4
+ ._zulp1b66{gap:var(--ds-space-050,4px)}
5
+ ._189ee4h9{border-width:var(--ds-border-width,1px)}
6
+ ._18zr1b66{padding-inline:var(--ds-space-050,4px)}
7
+ ._1dqonqa1{border-style:solid}
8
+ ._1h6d1j28{border-color:transparent}
9
+ ._1h6dzs9d{border-color:color-mix(in oklch,var(--border-color) 100%,var(--cm-border-color) var(--cm-border-value))!important}
10
+ ._1rjcv77o{padding-block:var(--ds-space-025,2px)}._111i1h4e{--icon-pressed-l-factor:0.7}
11
+ ._13muu67f{--cm-border-color:#fff}
12
+ ._168qx19p{--cm-icon-value:20%}
13
+ ._18dicjiy{--border-hovered-l-factor:1.2}
14
+ ._18m915vq{overflow-y:hidden}
15
+ ._1b3i17hp{--icon-color:var(--ds-icon-accent-green,#22a06b)}
16
+ ._1b3i1cv2{--icon-color:var(--ds-icon-subtlest,#6b6e76)}
17
+ ._1b3i1diz{--icon-color:var(--ds-icon-accent-gray,#7d818a)}
18
+ ._1b3i1j6y{--icon-color:var(--ds-icon-accent-orange,#e06c00)}
19
+ ._1b3i1oqg{--icon-color:var(--ds-icon-accent-yellow,#b38600)}
20
+ ._1b3i4pcx{--icon-color:var(--ds-icon-success,#6a9a23)}
21
+ ._1b3i6txe{--icon-color:var(--ds-icon-accent-blue,#357de8)}
22
+ ._1b3i8645{--icon-color:var(--ds-icon-accent-lime,#6a9a23)}
23
+ ._1b3i8uof{--icon-color:var(--ds-icon-accent-teal,#2898bd)}
24
+ ._1b3iervl{--icon-color:var(--ds-icon-warning,#e06c00)}
25
+ ._1b3inbxb{--icon-color:var(--ds-icon-accent-red,#c9372c)}
26
+ ._1b3iqm1h{--icon-color:var(--ds-icon-discovery,#af59e1)}
27
+ ._1b3is4qr{--icon-color:var(--ds-icon-danger,#c9372c)}
28
+ ._1b3iuq3u{--icon-color:var(--ds-icon-accent-purple,#af59e1)}
29
+ ._1b3iv8hk{--icon-color:var(--ds-icon-accent-magenta,#cd519d)}
30
+ ._1b3iyhbg{--icon-color:var(--ds-icon-information,#357de8)}
31
+ ._1bto1l2s{text-overflow:ellipsis}
32
+ ._1cp21w66:hover>span:first-of-type>svg{color:color-mix(in oklch,var(--icon-color) 100%,var(--cm-icon-color) var(--cm-icon-hovered-value))}
33
+ ._1e0c116y{display:inline-flex}
34
+ ._1gqs1mvc:active>span:first-of-type>svg{color:color-mix(in oklch,var(--icon-color) 100%,var(--cm-icon-color) var(--cm-icon-pressed-value))}
35
+ ._1iel6xdd{--icon-hovered-l-factor:0.8}
36
+ ._1k671038{--border-l-factor:1.33}
37
+ ._1reo15vq{overflow-x:hidden}
38
+ ._1xe213rw>span:first-of-type>svg{color:color-mix(in oklch,var(--icon-color) 100%,var(--cm-icon-color) var(--cm-icon-value))}
39
+ ._3wu016y8{--border-color:var(--ds-border-accent-red,#e2483d)}
40
+ ._3wu01b2s{--border-color:var(--ds-border-accent-orange,#e06c00)}
41
+ ._3wu01bqt{--border-color:var(--ds-border-danger,#e2483d)}
42
+ ._3wu01crs{--border-color:var(--ds-border-accent-green,#22a06b)}
43
+ ._3wu01h3o{--border-color:var(--ds-border-accent-teal,#2898bd)}
44
+ ._3wu01hqq{--border-color:var(--ds-border-accent-purple,#af59e1)}
45
+ ._3wu01ihb{--border-color:var(--ds-border-bold,#7d818a)}
46
+ ._3wu01mps{--border-color:var(--ds-border-success,#6a9a23)}
47
+ ._3wu01w55{--border-color:var(--ds-border-accent-blue,#357de8)}
48
+ ._3wu01xiv{--border-color:var(--ds-border-warning,#e06c00)}
49
+ ._3wu08yml{--border-color:var(--ds-border-accent-gray,#7d818a)}
50
+ ._3wu0feiv{--border-color:var(--ds-border-accent-yellow,#b38600)}
51
+ ._3wu0nf89{--border-color:var(--ds-border-accent-lime,#6a9a23)}
52
+ ._3wu0uwd0{--border-color:var(--ds-border-accent-magenta,#cd519d)}
53
+ ._3wu0v30g{--border-color:var(--ds-border-discovery,#af59e1)}
54
+ ._3wu0vbh5{--border-color:var(--ds-border-information,#357de8)}
55
+ ._46v5hwvj{--cm-icon-pressed-value:40%}
56
+ ._4cvr1h6o{align-items:center}
57
+ ._4t3igktf{height:20px}
58
+ ._4uq11yqs{--icon-l-factor:0.88}
59
+ ._80omtlke{cursor:pointer}
60
+ ._bfhk10f4{background-color:var(--ds-background-warning-subtler,#fce4a6)}
61
+ ._bfhk14j0{background-color:var(--ds-background-success-subtler,#d3f1a7)}
62
+ ._bfhk15s3{background-color:var(--ds-background-selected,#e9f2fe)}
63
+ ._bfhk165s{background-color:var(--ds-background-accent-orange-subtler,#fce4a6)}
64
+ ._bfhk1773{background-color:var(--ds-background-accent-yellow-subtler,#f5e989)}
65
+ ._bfhk18wg{background-color:var(--ds-background-danger-subtler,#ffd5d2)}
66
+ ._bfhk1a17{background-color:var(--ds-background-accent-teal-subtler,#c6edfb)}
67
+ ._bfhk1dy8{background-color:var(--ds-background-accent-blue-subtler,#cfe1fd)}
68
+ ._bfhk1nm4{background-color:var(--ds-background-accent-purple-subtler,#eed7fc)}
69
+ ._bfhk1rtt{background-color:var(--ds-background-accent-red-subtler,#ffd5d2)}
70
+ ._bfhk1wnw{background-color:var(--ds-background-accent-green-subtler,#baf3db)}
71
+ ._bfhk8lbg{background-color:var(--ds-background-information-subtler,#cfe1fd)}
72
+ ._bfhke670{background-color:var(--ds-background-discovery-subtler,#eed7fc)}
73
+ ._bfhki8nm{background-color:var(--ds-background-neutral,#0515240f)}
74
+ ._bfhkv9ra{background-color:var(--ds-background-accent-magenta-subtler,#fdd0ec)}
75
+ ._bfhkysee{background-color:var(--ds-background-accent-gray-subtlest,#f0f1f2)}
76
+ ._bfhkz2ec{background-color:var(--ds-background-accent-lime-subtler,#d3f1a7)}
77
+ ._bg3q9by0{--cm-border-pressed-value:10%}
78
+ ._fdt01r5k{--cm-icon-hovered-value:30%}
79
+ ._hyog26zw{--border-pressed-l-factor:1.08}
80
+ ._m71tr3uz{--cm-icon-color:#000}
81
+ ._o5721q9c{white-space:nowrap}
82
+ ._oe6mmko7{--cm-border-value:45%}
83
+ ._syaz12v7{color:var(--ds-text-accent-teal-bolder,#164555)}
84
+ ._syaz1blx{color:var(--ds-text-danger-bolder,#5d1f1a)}
85
+ ._syaz1g72{color:var(--ds-text-discovery-bolder,#48245d)}
86
+ ._syaz1ik3{color:var(--ds-text-accent-lime-bolder,#37471f)}
87
+ ._syaz1kyx{color:var(--ds-text-accent-blue-bolder,#123263)}
88
+ ._syaz1mn1{color:var(--ds-text-accent-purple-bolder,#48245d)}
89
+ ._syaz1p1e{color:var(--ds-text-success-bolder,#37471f)}
90
+ ._syaz1qd9{color:var(--ds-text-information-bolder,#123263)}
91
+ ._syaz1qur{color:var(--ds-text-accent-magenta-bolder,#50253f)}
92
+ ._syaz1tmo{color:var(--ds-text-accent-gray-bolder,#1e1f21)}
93
+ ._syaz1y78{color:var(--ds-text-accent-green-bolder,#164b35)}
94
+ ._syaz6x5g{color:var(--ds-text-selected,#1868db)}
95
+ ._syaz7i1p{color:var(--ds-text-accent-orange-bolder,#693200)}
96
+ ._syazekll{color:var(--ds-text-accent-yellow-bolder,#533f04)}
97
+ ._syazhwvp{color:var(--ds-text-accent-red-bolder,#5d1f1a)}
98
+ ._syazi7uo{color:var(--ds-text,#292a2e)}
99
+ ._syazmgs1{color:var(--ds-text-warning-bolder,#693200)}
100
+ ._vchhusvi{box-sizing:border-box}
101
+ ._ylgq1r5k{--cm-border-hovered-value:30%}
102
+ [data-color-mode=dark] ._189qkb7n{--icon-l-factor:1}
103
+ [data-color-mode=dark] ._18mn783i{--icon-pressed-l-factor:1.37}
104
+ [data-color-mode=dark] ._196p1btq{--icon-hovered-l-factor:1.15}
105
+ [data-color-mode=dark] ._1f28f1ug{--cm-icon-value:0%}
106
+ [data-color-mode=dark] ._1t75u67f{--cm-icon-color:#fff}
107
+ [data-color-mode=dark] ._aewt1n8h{--cm-icon-pressed-value:70%}
108
+ [data-color-mode=dark] ._hg5mr3uz{--cm-border-color:#000}
109
+ [data-color-mode=dark] ._l0666xdd{--border-hovered-l-factor:0.8}
110
+ [data-color-mode=dark] ._ockq1r5k{--cm-icon-hovered-value:30%}
111
+ [data-color-mode=dark] ._pclnn8xv{--border-pressed-l-factor:0.9}
112
+ [data-color-mode=dark] ._u8p61h4e{--border-l-factor:0.7}
113
+ ._128mdkaa:focus-visible{outline-width:var(--ds-border-width-focused,2px)}
114
+ ._1ah3v77o:focus-visible{outline-offset:var(--ds-space-025,2px)}
115
+ ._mizu1v1w:focus-visible{outline-color:var(--ds-border-focused,#4688ec)}
116
+ ._ra3xnqa1:focus-visible{outline-style:solid}
117
+ ._4cvx7ddx:hover{border-color:color-mix(in oklch,var(--border-color) 100%,var(--cm-border-color) var(--cm-border-hovered-value))!important}
118
+ ._irr315aw:hover{background-color:var(--ds-background-information-subtler-hovered,#adcbfb)}
119
+ ._irr31axx:hover{background-color:var(--ds-background-accent-magenta-subtler-hovered,#fcb6e1)}
120
+ ._irr31e2h:hover{background-color:var(--ds-background-accent-green-subtler-hovered,#97edc9)}
121
+ ._irr31ei0:hover{background-color:var(--ds-background-accent-orange-subtler-hovered,#fbd779)}
122
+ ._irr31gf0:hover{background-color:var(--ds-background-accent-lime-subtler-hovered,#bde97c)}
123
+ ._irr31r82:hover{background-color:var(--ds-background-success-subtler-hovered,#bde97c)}
124
+ ._irr31uw7:hover{background-color:var(--ds-background-accent-yellow-subtler-hovered,#efdd4e)}
125
+ ._irr31yx4:hover{background-color:var(--ds-background-warning-subtler-hovered,#fbd779)}
126
+ ._irr370oi:hover{background-color:var(--ds-background-danger-subtler-hovered,#ffb8b2)}
127
+ ._irr3815t:hover{background-color:var(--ds-background-accent-blue-subtler-hovered,#adcbfb)}
128
+ ._irr3affd:hover{background-color:var(--ds-background-accent-red-subtler-hovered,#ffb8b2)}
129
+ ._irr3attl:hover{background-color:var(--ds-background-accent-purple-subtler-hovered,#e3bdfa)}
130
+ ._irr3kwwr:hover{background-color:var(--ds-background-accent-teal-subtler-hovered,#b1e4f7)}
131
+ ._irr3plhp:hover{background-color:var(--ds-background-neutral-hovered,#0b120e24)}
132
+ ._irr3rumk:hover{background-color:var(--ds-background-discovery-subtler-hovered,#e3bdfa)}
133
+ ._irr3ufnl:hover{background-color:var(--ds-background-selected-hovered,#cfe1fd)}
134
+ ._irr3wejn:hover{background-color:var(--ds-background-accent-gray-subtlest-hovered,#dddee1)}
135
+ ._q4zt1csi:active{border-color:color-mix(in oklch,var(--border-color) 100%,var(--cm-border-color) var(--cm-border-pressed-value))!important}
136
+ ._1di618ut:active{background-color:var(--ds-background-accent-gray-subtlest-pressed,#b7b9be)}
137
+ ._1di61gdz:active{background-color:var(--ds-background-neutral-pressed,#080f214a)}
138
+ ._1di61j5a:active{background-color:var(--ds-background-accent-red-subtler-pressed,#fd9891)}
139
+ ._1di61jb0:active{background-color:var(--ds-background-accent-teal-subtler-pressed,#9dd9ee)}
140
+ ._1di61r9w:active{background-color:var(--ds-background-accent-yellow-subtler-pressed,#eed12b)}
141
+ ._1di62kxc:active{background-color:var(--ds-background-accent-lime-subtler-pressed,#b3df72)}
142
+ ._1di63nfk:active{background-color:var(--ds-background-accent-purple-subtler-pressed,#d8a0f7)}
143
+ ._1di642ri:active{background-color:var(--ds-background-accent-magenta-subtler-pressed,#f797d2)}
144
+ ._1di65usi:active{background-color:var(--ds-background-discovery-subtler-pressed,#d8a0f7)}
145
+ ._1di6ar1y:active{background-color:var(--ds-background-information-subtler-pressed,#8fb8f6)}
146
+ ._1di6bkku:active{background-color:var(--ds-background-warning-subtler-pressed,#fbc828)}
147
+ ._1di6d6jc:active{background-color:var(--ds-background-success-subtler-pressed,#b3df72)}
148
+ ._1di6dpo3:active{background-color:var(--ds-background-accent-orange-subtler-pressed,#fbc828)}
149
+ ._1di6jkmi:active{background-color:var(--ds-background-danger-subtler-pressed,#fd9891)}
150
+ ._1di6nozp:active{background-color:var(--ds-background-selected-pressed,#8fb8f6)}
151
+ ._1di6rwxf:active{background-color:var(--ds-background-accent-blue-subtler-pressed,#8fb8f6)}
152
+ ._1di6ybhx:active{background-color:var(--ds-background-accent-green-subtler-pressed,#7ee2b8)}
153
+ @supports (color:oklch(from white l c h)){._1easxmrh{border-color:oklch(from var(--border-color) calc(l * var(--border-l-factor)) c h)!important}._1r9r1ss3>span:first-of-type>svg{color:oklch(from var(--icon-color) calc(l * var(--icon-l-factor)) c h)}._1lh71sfd:hover>span:first-of-type>svg{color:oklch(from var(--icon-color) calc(l * var(--icon-hovered-l-factor)) c h)}._11o31cha:active>span:first-of-type>svg{color:oklch(from var(--icon-color) calc(l * var(--icon-pressed-l-factor)) c h)}._75gv2l9f:hover{border-color:oklch(from var(--border-color) calc(l * var(--border-hovered-l-factor)) c h)!important}._ui3h1ct7:active{border-color:oklch(from var(--border-color) calc(l * var(--border-pressed-l-factor)) c h)!important}}
@@ -0,0 +1,133 @@
1
+ /* lozenge-base.tsx generated by @compiled/babel-plugin v0.38.1 */
2
+ import "./lozenge-base.compiled.css";
3
+ import * as React from 'react';
4
+ import { ax, ix } from "@compiled/react/runtime";
5
+ import { forwardRef, Fragment, memo } from 'react';
6
+ import { cx } from '@atlaskit/css';
7
+ import ChevronDownIcon from '@atlaskit/icon/core/chevron-down';
8
+ import Pressable from '@atlaskit/primitives/pressable';
9
+ import IconRenderer from './icon-renderer';
10
+ import { getThemeStyles, resolveLozengeColor } from './utils';
11
+ const styles = {
12
+ container: "_2rko12b0 _1reo15vq _18m915vq _zulp1b66 _1rjcv77o _18zr1b66 _189ee4h9 _1dqonqa1 _1h6d1j28 _1e0c116y _4cvr1h6o _vchhusvi _4t3igktf",
13
+ containerInteractive: "_80omtlke _mizu1v1w _1ah3v77o _ra3xnqa1 _128mdkaa",
14
+ containerSelected: "_bfhk15s3 _syaz6x5g _irr3ufnl _1di6nozp",
15
+ text: "_11c81o8v _1reo15vq _18m915vq _1bto1l2s _o5721q9c",
16
+ textSelected: "_syaz6x5g",
17
+ 'semantic.success': "_1b3i4pcx _3wu01mps _bfhk14j0 _syaz1p1e",
18
+ 'semantic.warning': "_1b3iervl _3wu01xiv _bfhk10f4 _syazmgs1",
19
+ 'semantic.danger': "_1b3is4qr _3wu01bqt _bfhk18wg _syaz1blx",
20
+ 'semantic.information': "_1b3iyhbg _3wu0vbh5 _bfhk8lbg _syaz1qd9",
21
+ 'semantic.neutral': "_1b3i1cv2 _3wu01ihb _bfhki8nm _syazi7uo",
22
+ 'semantic.discovery': "_1b3iqm1h _3wu0v30g _bfhke670 _syaz1g72",
23
+ 'accent.red': "_1b3inbxb _3wu016y8 _bfhk1rtt _syazhwvp",
24
+ 'accent.orange': "_1b3i1j6y _3wu01b2s _bfhk165s _syaz7i1p",
25
+ 'accent.yellow': "_1b3i1oqg _3wu0feiv _bfhk1773 _syazekll",
26
+ 'accent.lime': "_1b3i8645 _3wu0nf89 _bfhkz2ec _syaz1ik3",
27
+ 'accent.green': "_1b3i17hp _3wu01crs _bfhk1wnw _syaz1y78",
28
+ 'accent.teal': "_1b3i8uof _3wu01h3o _bfhk1a17 _syaz12v7",
29
+ 'accent.blue': "_1b3i6txe _3wu01w55 _bfhk1dy8 _syaz1kyx",
30
+ 'accent.purple': "_1b3iuq3u _3wu01hqq _bfhk1nm4 _syaz1mn1",
31
+ 'accent.magenta': "_1b3iv8hk _3wu0uwd0 _bfhkv9ra _syaz1qur",
32
+ 'accent.gray': "_1b3i1diz _3wu08yml _bfhkysee _syaz1tmo",
33
+ 'interactive.semantic.success': "_irr31r82 _1di6d6jc",
34
+ 'interactive.semantic.warning': "_irr31yx4 _1di6bkku",
35
+ 'interactive.semantic.danger': "_irr370oi _1di6jkmi",
36
+ 'interactive.semantic.information': "_irr315aw _1di6ar1y",
37
+ 'interactive.semantic.neutral': "_irr3plhp _1di61gdz",
38
+ 'interactive.semantic.discovery': "_irr3rumk _1di65usi",
39
+ 'interactive.accent.red': "_irr3affd _1di61j5a",
40
+ 'interactive.accent.orange': "_irr31ei0 _1di6dpo3",
41
+ 'interactive.accent.yellow': "_irr31uw7 _1di61r9w",
42
+ 'interactive.accent.lime': "_irr31gf0 _1di62kxc",
43
+ 'interactive.accent.green': "_irr31e2h _1di6ybhx",
44
+ 'interactive.accent.teal': "_irr3kwwr _1di61jb0",
45
+ 'interactive.accent.blue': "_irr3815t _1di6rwxf",
46
+ 'interactive.accent.purple': "_irr3attl _1di63nfk",
47
+ 'interactive.accent.magenta': "_irr31axx _1di642ri",
48
+ 'interactive.accent.gray': "_irr3wejn _1di618ut",
49
+ selectedInteractive: "_irr3ufnl _1di6nozp",
50
+ iconBorderFilter: "_1h6dzs9d _4uq11yqs _1k671038 _m71tr3uz _13muu67f _168qx19p _oe6mmko7 _189qkb7n _u8p61h4e _1t75u67f _hg5mr3uz _1f28f1ug _1xe213rw _1easxmrh _1r9r1ss3",
51
+ iconBorderInteractiveFilter: "_1iel6xdd _111i1h4e _18dicjiy _hyog26zw _fdt01r5k _46v5hwvj _ylgq1r5k _bg3q9by0 _196p1btq _18mn783i _l0666xdd _pclnn8xv _ockq1r5k _aewt1n8h _4cvx7ddx _1cp21w66 _q4zt1csi _1gqs1mvc _75gv2l9f _1lh71sfd _ui3h1ct7 _11o31cha"
52
+ };
53
+
54
+ /**
55
+ * __New Lozenge__
56
+ *
57
+ * A lozenge is a visual indicator used to highlight an item's status for quick recognition.
58
+ * This is the updated version with the new North Star visual language.
59
+ */
60
+ const LozengeBase = /*#__PURE__*/memo( /*#__PURE__*/forwardRef(({
61
+ children,
62
+ testId,
63
+ appearance,
64
+ iconBefore,
65
+ maxWidth = 200,
66
+ isSelected,
67
+ // for dropdown trigger
68
+ onClick,
69
+ // for dropdown trigger
70
+ style,
71
+ analyticsContext,
72
+ interactionName
73
+ }, ref) => {
74
+ const isInteractive = typeof onClick === 'function';
75
+
76
+ // Determine the effective color, with fallback logic for legacy appearances
77
+ const resolvedColor = resolveLozengeColor(appearance) || 'neutral';
78
+ const {
79
+ category,
80
+ key
81
+ } = getThemeStyles(resolvedColor);
82
+ const colorStyleKey = `${category}.${key}`;
83
+ const interactiveStyleKey = `interactive.${category}.${key}`;
84
+ const maxWidthValue = typeof maxWidth === 'string' ? maxWidth : `${maxWidth}px`;
85
+ const maxWidthIsPc = typeof maxWidth === 'string' && /%$/.test(maxWidth);
86
+ const commonStyleOverrides = {
87
+ backgroundColor: style === null || style === void 0 ? void 0 : style.backgroundColor,
88
+ maxWidth: maxWidthIsPc ? maxWidth : '100%'
89
+ };
90
+ const innerContent = /*#__PURE__*/React.createElement(Fragment, null, iconBefore && /*#__PURE__*/React.createElement(IconRenderer, {
91
+ icon: iconBefore,
92
+ color: resolvedColor,
93
+ isSelected: isInteractive ? isSelected : undefined,
94
+ testId: testId && `${testId}--icon`
95
+ }), /*#__PURE__*/React.createElement("span", {
96
+ style: {
97
+ maxWidth: maxWidthIsPc ? '100%' : `calc(${maxWidthValue} - ${"var(--ds-space-100, 8px)"})`,
98
+ color: style === null || style === void 0 ? void 0 : style.color
99
+ },
100
+ "data-testid": testId && `${testId}--text`,
101
+ className: ax([styles.text])
102
+ }, children), isInteractive && /*#__PURE__*/React.createElement(ChevronDownIcon, {
103
+ label: "",
104
+ size: "small",
105
+ color: isSelected ? "var(--ds-icon-selected, #1868DB)" : 'currentColor',
106
+ testId: testId && `${testId}--chevron`
107
+ }));
108
+ if (isInteractive) {
109
+ return /*#__PURE__*/React.createElement(Pressable, {
110
+ ref: ref,
111
+ xcss: cx(styles.container, !isSelected && styles.iconBorderFilter, !isSelected && styles.iconBorderInteractiveFilter, styles[colorStyleKey], styles[interactiveStyleKey], isSelected && styles.containerSelected),
112
+ onClick: onClick,
113
+ style: {
114
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop
115
+ ...commonStyleOverrides,
116
+ // Specified because Pressable has a default border:none which overrides the border specified on the container
117
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop
118
+ border: `solid ${"var(--ds-border-width, 1px)"} ${isSelected ? "var(--ds-border-selected, #1868DB)" : 'transparent'}`
119
+ },
120
+ testId: testId,
121
+ analyticsContext: analyticsContext,
122
+ interactionName: interactionName,
123
+ componentName: "LozengeDropdownTrigger"
124
+ }, innerContent);
125
+ }
126
+ return /*#__PURE__*/React.createElement("span", {
127
+ ref: ref,
128
+ style: commonStyleOverrides,
129
+ "data-testid": testId,
130
+ className: ax([styles.container, styles[colorStyleKey], styles.iconBorderFilter])
131
+ }, innerContent);
132
+ }));
133
+ export default LozengeBase;
@@ -0,0 +1,47 @@
1
+ /* lozenge-dropdown-trigger.tsx generated by @compiled/babel-plugin v0.38.1 */
2
+ import * as React from 'react';
3
+ import { ax, ix } from "@compiled/react/runtime";
4
+ import { forwardRef, memo } from 'react';
5
+ import __noop from '@atlaskit/ds-lib/noop';
6
+ import LozengeBase from './lozenge-base';
7
+ /**
8
+ * __Lozenge Dropdown Trigger__
9
+ *
10
+ * An interactive lozenge component that acts as a dropdown trigger.
11
+ * Built on LozengeBase with dropdown interaction patterns.
12
+ *
13
+ * - Supports all color variants from the lozenge
14
+ * - Shows selected state with dedicated color tokens
15
+ * - Includes a chevron icon on the right of the text
16
+ * - Built for dropdown menu interactions
17
+ * - Supports analytics events and UFO press interactions
18
+ */
19
+ const LozengeDropdownTrigger = /*#__PURE__*/memo( /*#__PURE__*/forwardRef(({
20
+ children,
21
+ testId,
22
+ appearance = 'neutral',
23
+ iconBefore,
24
+ isSelected = false,
25
+ maxWidth = 200,
26
+ onClick = __noop,
27
+ style,
28
+ analyticsContext,
29
+ interactionName
30
+ }, ref) => {
31
+ return /*#__PURE__*/React.createElement(LozengeBase, {
32
+ ref: ref,
33
+ appearance: appearance,
34
+ iconBefore: iconBefore,
35
+ isSelected: isSelected,
36
+ maxWidth: maxWidth
37
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop
38
+ ,
39
+ style: style,
40
+ testId: testId,
41
+ onClick: onClick,
42
+ analyticsContext: analyticsContext,
43
+ interactionName: interactionName
44
+ }, children);
45
+ }));
46
+ LozengeDropdownTrigger.displayName = 'LozengeDropdownTrigger';
47
+ export default LozengeDropdownTrigger;
@@ -0,0 +1,34 @@
1
+ /* lozenge.tsx generated by @compiled/babel-plugin v0.38.1 */
2
+ import * as React from 'react';
3
+ import { ax, ix } from "@compiled/react/runtime";
4
+ import LozengeBase from './lozenge-base';
5
+ /**
6
+ * __Lozenge__
7
+ *
8
+ * A lozenge is a visual indicator used to highlight an item's status for quick recognition.
9
+ *
10
+ * - [Examples](https://atlassian.design/components/lozenge/examples)
11
+ * - [Code](https://atlassian.design/components/lozenge/code)
12
+ * - [Usage](https://atlassian.design/components/lozenge/usage)
13
+ */
14
+ const Lozenge = ({
15
+ appearance = 'neutral',
16
+ maxWidth = 200,
17
+ style,
18
+ testId,
19
+ children,
20
+ iconBefore
21
+ }) => {
22
+ return /*#__PURE__*/React.createElement(LozengeBase, {
23
+ appearance: appearance,
24
+ iconBefore: iconBefore,
25
+ isInteractive: true,
26
+ maxWidth: maxWidth
27
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop
28
+ ,
29
+ style: style,
30
+ testId: testId
31
+ }, children);
32
+ };
33
+ Lozenge.displayName = 'Lozenge';
34
+ export default Lozenge;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ // Map legacy appearance to new color values
2
+ const legacyAppearanceMap = {
3
+ default: 'neutral',
4
+ removed: 'danger',
5
+ inprogress: 'information',
6
+ new: 'discovery',
7
+ moved: 'warning'
8
+ };
9
+
10
+ // Resolve the lozenge color based on the appearance
11
+ export const resolveLozengeColor = (appearance = 'neutral') => {
12
+ var _legacyAppearanceMap$;
13
+ if (appearance.startsWith('accent-')) {
14
+ return appearance;
15
+ }
16
+ return (_legacyAppearanceMap$ = legacyAppearanceMap[appearance]) !== null && _legacyAppearanceMap$ !== void 0 ? _legacyAppearanceMap$ : appearance;
17
+ };
18
+
19
+ // extract the category and key from the resolved color
20
+ export const getThemeStyles = resolvedColor => {
21
+ const isAccent = resolvedColor.startsWith('accent-');
22
+ const category = isAccent ? 'accent' : 'semantic';
23
+ const key = isAccent ? resolvedColor.replace('accent-', '') : resolvedColor;
24
+ return {
25
+ category,
26
+ key
27
+ };
28
+ };
package/dist/esm/index.js CHANGED
@@ -1 +1,2 @@
1
- export { default } from './lozenge';
1
+ export { default } from './lozenge';
2
+ export { default as LozengeDropdownTrigger } from './new/lozenge-dropdown-trigger';
@@ -4,11 +4,12 @@ import * as React from 'react';
4
4
  import { ax, ix } from "@compiled/react/runtime";
5
5
  import { memo, useMemo } from 'react';
6
6
  import { fg } from '@atlaskit/platform-feature-flags';
7
+ import NewLozenge from './new/lozenge';
7
8
  /**
8
9
  * TODO: We should be using our bounded `cssMap` here, but most of
9
10
  * these styles from the visual refresh are not in the Design System.
10
11
  */
11
- var stylesNew = {
12
+ var styles = {
12
13
  container: "_2rkofajl _1reo15vq _18m915vq _1e0c116y _vchhusvi _kqswpfqs _1kz6184x _bozg1b66 _y4ti1b66",
13
14
  containerSubtle: "_1cwg1n1a",
14
15
  text: "_1reo15vq _18m915vq _ect41gqc _1wyb1skh _zg8l4jg8 _k48pmoej _vwz47vkz _1bto1l2s _1p1dangw _o5721q9c",
@@ -44,7 +45,7 @@ var appearanceTypes = ['default', 'inprogress', 'moved', 'new', 'removed', 'succ
44
45
  * - [Code](https://atlassian.design/components/lozenge/code)
45
46
  * - [Usage](https://atlassian.design/components/lozenge/usage)
46
47
  */
47
- var Lozenge = /*#__PURE__*/memo(function (_ref) {
48
+ var LegacyLozenge = /*#__PURE__*/memo(function (_ref) {
48
49
  var children = _ref.children,
49
50
  testId = _ref.testId,
50
51
  _ref$isBold = _ref.isBold,
@@ -66,7 +67,7 @@ var Lozenge = /*#__PURE__*/memo(function (_ref) {
66
67
  maxWidth: maxWidthIsPc ? maxWidth : '100%'
67
68
  },
68
69
  "data-testid": testId,
69
- className: ax([stylesNew.container, stylesNew["bg.".concat(appearanceStyle, ".").concat(appearanceType)], appearanceStyle === 'subtle' && stylesNew["outline.subtle.".concat(appearanceType)], appearanceStyle === 'subtle' && stylesNew.containerSubtle])
70
+ className: ax([styles.container, styles["bg.".concat(appearanceStyle, ".").concat(appearanceType)], appearanceStyle === 'subtle' && styles["outline.subtle.".concat(appearanceType)], appearanceStyle === 'subtle' && styles.containerSubtle])
70
71
  }, /*#__PURE__*/React.createElement("span", {
71
72
  style: {
72
73
  color: style === null || style === void 0 ? void 0 : style.color,
@@ -74,8 +75,19 @@ var Lozenge = /*#__PURE__*/memo(function (_ref) {
74
75
  maxWidth: maxWidthIsPc ? '100%' : "calc(".concat(maxWidthValue, " - ", "var(--ds-space-100, 8px)", ")")
75
76
  },
76
77
  "data-testid": testId && "".concat(testId, "--text"),
77
- className: ax([stylesNew.text, fg('platform-lozenge-custom-letterspacing') && stylesNew.customLetterspacing, stylesNew["text.".concat(appearanceStyle)]])
78
+ className: ax([styles.text, fg('platform-lozenge-custom-letterspacing') && styles.customLetterspacing, styles["text.".concat(appearanceStyle)]])
78
79
  }, children));
79
80
  });
80
- Lozenge.displayName = 'Lozenge';
81
- export default Lozenge;
81
+ LegacyLozenge.displayName = 'Lozenge';
82
+
83
+ /**
84
+ * Wrapper component that switches between old and new Lozenge based on feature flag
85
+ */
86
+ var LozengeWrapper = /*#__PURE__*/memo(function (props) {
87
+ if (fg('platform-dst-lozenge-tag-badge-visual-uplifts')) {
88
+ return /*#__PURE__*/React.createElement(NewLozenge, props);
89
+ }
90
+ return /*#__PURE__*/React.createElement(LegacyLozenge, props);
91
+ });
92
+ LozengeWrapper.displayName = 'Lozenge';
93
+ export default LozengeWrapper;
@@ -0,0 +1,66 @@
1
+ import React from 'react';
2
+ // Map lozenge colors to appropriate icon colors
3
+ var getIconColor = function getIconColor(color, isSelected) {
4
+ // When lozenge is selected and interactive, use selected text color for consistency
5
+ if (isSelected) {
6
+ return "var(--ds-icon-selected, #1868DB)";
7
+ }
8
+
9
+ // For semantic colors, use corresponding semantic text colors
10
+ switch (color) {
11
+ case 'success':
12
+ return "var(--ds-icon-success, #6A9A23)";
13
+ case 'warning':
14
+ return "var(--ds-icon-warning, #E06C00)";
15
+ case 'danger':
16
+ return "var(--ds-icon-danger, #C9372C)";
17
+ case 'information':
18
+ return "var(--ds-icon-information, #357DE8)";
19
+ case 'neutral':
20
+ return "var(--ds-icon-subtlest, #6B6E76)";
21
+ case 'discovery':
22
+ return "var(--ds-icon-discovery, #AF59E1)";
23
+ // For accent colors, use corresponding accent icon colors
24
+ case 'accent-red':
25
+ return "var(--ds-icon-accent-red, #C9372C)";
26
+ case 'accent-orange':
27
+ return "var(--ds-icon-accent-orange, #E06C00)";
28
+ case 'accent-yellow':
29
+ return "var(--ds-icon-accent-yellow, #B38600)";
30
+ case 'accent-lime':
31
+ return "var(--ds-icon-accent-lime, #6A9A23)";
32
+ case 'accent-green':
33
+ return "var(--ds-icon-accent-green, #22A06B)";
34
+ case 'accent-teal':
35
+ return "var(--ds-icon-accent-teal, #2898BD)";
36
+ case 'accent-blue':
37
+ return "var(--ds-icon-accent-blue, #357DE8)";
38
+ case 'accent-purple':
39
+ return "var(--ds-icon-accent-purple, #AF59E1)";
40
+ case 'accent-magenta':
41
+ return "var(--ds-icon-accent-magenta, #CD519D)";
42
+ case 'accent-gray':
43
+ return "var(--ds-icon-accent-gray, #7D818A)";
44
+ default:
45
+ return "var(--ds-icon-subtlest, #6B6E76)";
46
+ }
47
+ };
48
+
49
+ /**
50
+ * Icon renderer for lozenge components
51
+ * Handles proper sizing and color theming for icons
52
+ */
53
+ export var IconRenderer = function IconRenderer(_ref) {
54
+ var Icon = _ref.icon,
55
+ color = _ref.color,
56
+ isSelected = _ref.isSelected,
57
+ testId = _ref.testId;
58
+ var iconColor = getIconColor(color, isSelected);
59
+ return /*#__PURE__*/React.createElement(Icon, {
60
+ color: iconColor,
61
+ label: "",
62
+ size: "small",
63
+ testId: testId
64
+ });
65
+ };
66
+ export default IconRenderer;