@atlaskit/editor-toolbar 0.2.3 → 0.3.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 (56) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/index.js +15 -0
  3. package/dist/cjs/ui/ColorPalette/Color.compiled.css +25 -0
  4. package/dist/cjs/ui/ColorPalette/Color.js +76 -0
  5. package/dist/cjs/ui/ColorPalette/getColorMessage.js +20 -0
  6. package/dist/cjs/ui/ColorPalette/index.compiled.css +1 -0
  7. package/dist/cjs/ui/ColorPalette/index.js +118 -0
  8. package/dist/cjs/ui/ColorPalette/types.js +5 -0
  9. package/dist/cjs/ui/ColorPalette/utils.js +94 -0
  10. package/dist/cjs/ui/ToolbarDropdownMenu.js +43 -4
  11. package/dist/cjs/ui/ToolbarDropdownMenuContext.js +40 -0
  12. package/dist/es2019/index.js +2 -0
  13. package/dist/es2019/ui/ColorPalette/Color.compiled.css +25 -0
  14. package/dist/es2019/ui/ColorPalette/Color.js +65 -0
  15. package/dist/es2019/ui/ColorPalette/getColorMessage.js +18 -0
  16. package/dist/es2019/ui/ColorPalette/index.compiled.css +1 -0
  17. package/dist/es2019/ui/ColorPalette/index.js +110 -0
  18. package/dist/es2019/ui/ColorPalette/types.js +1 -0
  19. package/dist/es2019/ui/ColorPalette/utils.js +83 -0
  20. package/dist/es2019/ui/ToolbarDropdownMenu.js +43 -4
  21. package/dist/es2019/ui/ToolbarDropdownMenuContext.js +26 -0
  22. package/dist/esm/index.js +2 -0
  23. package/dist/esm/ui/ColorPalette/Color.compiled.css +25 -0
  24. package/dist/esm/ui/ColorPalette/Color.js +67 -0
  25. package/dist/esm/ui/ColorPalette/getColorMessage.js +14 -0
  26. package/dist/esm/ui/ColorPalette/index.compiled.css +1 -0
  27. package/dist/esm/ui/ColorPalette/index.js +109 -0
  28. package/dist/esm/ui/ColorPalette/types.js +1 -0
  29. package/dist/esm/ui/ColorPalette/utils.js +84 -0
  30. package/dist/esm/ui/ToolbarDropdownMenu.js +41 -4
  31. package/dist/esm/ui/ToolbarDropdownMenuContext.js +31 -0
  32. package/dist/types/index.d.ts +2 -0
  33. package/dist/types/ui/ColorPalette/Color.d.ts +11 -0
  34. package/dist/types/ui/ColorPalette/getColorMessage.d.ts +8 -0
  35. package/dist/types/ui/ColorPalette/index.d.ts +15 -0
  36. package/dist/types/ui/ColorPalette/types.d.ts +89 -0
  37. package/dist/types/ui/ColorPalette/utils.d.ts +40 -0
  38. package/dist/types/ui/ToolbarDropdownMenu.d.ts +3 -0
  39. package/dist/types/ui/ToolbarDropdownMenuContext.d.ts +12 -0
  40. package/dist/types-ts4.5/index.d.ts +2 -0
  41. package/dist/types-ts4.5/ui/ColorPalette/Color.d.ts +11 -0
  42. package/dist/types-ts4.5/ui/ColorPalette/getColorMessage.d.ts +8 -0
  43. package/dist/types-ts4.5/ui/ColorPalette/index.d.ts +15 -0
  44. package/dist/types-ts4.5/ui/ColorPalette/types.d.ts +89 -0
  45. package/dist/types-ts4.5/ui/ColorPalette/utils.d.ts +40 -0
  46. package/dist/types-ts4.5/ui/ToolbarDropdownMenu.d.ts +3 -0
  47. package/dist/types-ts4.5/ui/ToolbarDropdownMenuContext.d.ts +12 -0
  48. package/package.json +5 -3
  49. package/src/index.ts +3 -0
  50. package/src/ui/ColorPalette/Color.tsx +110 -0
  51. package/src/ui/ColorPalette/getColorMessage.ts +27 -0
  52. package/src/ui/ColorPalette/index.tsx +125 -0
  53. package/src/ui/ColorPalette/types.ts +96 -0
  54. package/src/ui/ColorPalette/utils.ts +102 -0
  55. package/src/ui/ToolbarDropdownMenu.tsx +51 -5
  56. package/src/ui/ToolbarDropdownMenuContext.tsx +44 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/editor-toolbar
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`4d47716053c75`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/4d47716053c75) -
8
+ [ux] ED-28799 Migrate ColorPalette component to editor-toolbar
9
+ - Add DropdownMenu Context to be able to manage opening/closing state of the dropdown in menu item
10
+
3
11
  ## 0.2.3
4
12
 
5
13
  ### Patch Changes
package/dist/cjs/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
@@ -123,6 +124,12 @@ Object.defineProperty(exports, "CodeIcon", {
123
124
  return _CodeIcon.CodeIcon;
124
125
  }
125
126
  });
127
+ Object.defineProperty(exports, "ColorPalette", {
128
+ enumerable: true,
129
+ get: function get() {
130
+ return _ColorPalette.default;
131
+ }
132
+ });
126
133
  Object.defineProperty(exports, "CommentIcon", {
127
134
  enumerable: true,
128
135
  get: function get() {
@@ -357,6 +364,12 @@ Object.defineProperty(exports, "UnderlineIcon", {
357
364
  return _UnderlineIcon.UnderlineIcon;
358
365
  }
359
366
  });
367
+ Object.defineProperty(exports, "useToolbarDropdownMenu", {
368
+ enumerable: true,
369
+ get: function get() {
370
+ return _ToolbarDropdownMenuContext.useToolbarDropdownMenu;
371
+ }
372
+ });
360
373
  Object.defineProperty(exports, "useToolbarUI", {
361
374
  enumerable: true,
362
375
  get: function get() {
@@ -375,6 +388,7 @@ var _ToolbarSection = require("./ui/ToolbarSection");
375
388
  var _ToolbarTooltip = require("./ui/ToolbarTooltip");
376
389
  var _ToolbarDropdownDivider = require("./ui/ToolbarDropdownDivider");
377
390
  var _ToolbarColorSwatch = require("./ui/ToolbarColorSwatch");
391
+ var _ToolbarDropdownMenuContext = require("./ui/ToolbarDropdownMenuContext");
378
392
  var _AIAdjustLengthIcon = require("./ui/icons/AIAdjustLengthIcon");
379
393
  var _AIChatIcon = require("./ui/icons/AIChatIcon");
380
394
  var _AIProfessionalIcon = require("./ui/icons/AIProfessionalIcon");
@@ -420,4 +434,5 @@ var _AlignTextCenterIcon = require("./ui/icons/AlignTextCenterIcon");
420
434
  var _AlignTextRightIcon = require("./ui/icons/AlignTextRightIcon");
421
435
  var _IndentIcon = require("./ui/icons/IndentIcon");
422
436
  var _OutdentIcon = require("./ui/icons/OutdentIcon");
437
+ var _ColorPalette = _interopRequireDefault(require("./ui/ColorPalette"));
423
438
  var _uiContext = require("./hooks/ui-context");
@@ -0,0 +1,25 @@
1
+
2
+ ._19itcf40{border:var(--_1wr0y6w)}
3
+ ._2rko1hkb{border-radius:var(--ds-border-radius-050,4px)}
4
+ ._2rkoiti9{border-radius:var(--ds-border-radius-100,4px)}._189et94y{border-width:1px}
5
+ ._1dqonqa1{border-style:solid}
6
+ ._1h6d1j28{border-color:transparent}
7
+ ._19bvidpf{padding-left:0}
8
+ ._19bvv77o{padding-left:var(--ds-space-025,2px)}
9
+ ._1bsbcr4y{width:var(--ds-space-300,26px)}
10
+ ._1e0c1txw{display:flex}
11
+ ._1e0c1ule{display:block}
12
+ ._4cvr1h6o{align-items:center}
13
+ ._4t3icr4y{height:var(--ds-space-300,26px)}
14
+ ._80omtlke{cursor:pointer}
15
+ ._bfhkm7j4{background-color:var(--ds-background-neutral,#091e420f)}
16
+ ._ca0qidpf{padding-top:0}
17
+ ._ca0qv77o{padding-top:var(--ds-space-025,2px)}
18
+ ._kqswh2mm{position:relative}
19
+ ._n3tdidpf{padding-bottom:0}
20
+ ._n3tdv77o{padding-bottom:var(--ds-space-025,2px)}
21
+ ._u5f3idpf{padding-right:0}
22
+ ._u5f3v77o{padding-right:var(--ds-space-025,2px)}
23
+ ._y2mv12j9:focus{outline:var(--_toyvsf)}
24
+ ._858umuej:focus, ._jyzfmuej:focus-within, ._4cvxmuej:hover{border-color:var(--ds-border,#091e4224)}
25
+ ._1bg4v77o:focus{outline-offset:var(--ds-space-025,2px)}
@@ -0,0 +1,76 @@
1
+ /* Color.tsx generated by @compiled/babel-plugin v0.36.1 */
2
+ "use strict";
3
+
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.Color = void 0;
10
+ require("./Color.compiled.css");
11
+ var _runtime = require("@compiled/react/runtime");
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ var _checkMarkEditorDone = _interopRequireDefault(require("@atlaskit/icon/core/migration/check-mark--editor-done"));
14
+ var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
15
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
16
+ var buttonWrapperStyles = null;
17
+ var buttonStyles = null;
18
+
19
+ /**
20
+ * Individual color palette item component
21
+ * Displays a single color swatch with tooltip and selection state
22
+ */
23
+ var Color = exports.Color = /*#__PURE__*/(0, _react.memo)(function (_ref) {
24
+ var autoFocus = _ref.autoFocus,
25
+ tabIndex = _ref.tabIndex,
26
+ value = _ref.value,
27
+ label = _ref.label,
28
+ isSelected = _ref.isSelected,
29
+ borderColor = _ref.borderColor,
30
+ _ref$checkMarkColor = _ref.checkMarkColor,
31
+ checkMarkColor = _ref$checkMarkColor === void 0 ? "var(--ds-icon-inverse, #FFFFFF)" : _ref$checkMarkColor,
32
+ hexToPaletteColor = _ref.hexToPaletteColor,
33
+ decorator = _ref.decorator,
34
+ onClick = _ref.onClick,
35
+ onKeyDown = _ref.onKeyDown;
36
+ var colorStyle = hexToPaletteColor ? hexToPaletteColor(value) : value;
37
+ var handleMouseDown = (0, _react.useCallback)(function (e) {
38
+ e.preventDefault();
39
+ }, []);
40
+ var handleClick = (0, _react.useCallback)(function (e) {
41
+ e.preventDefault();
42
+ onClick(value, label);
43
+ }, [onClick, value, label]);
44
+ var handleKeyDown = (0, _react.useCallback)(function (e) {
45
+ if (!onKeyDown) {
46
+ return;
47
+ }
48
+ e.preventDefault();
49
+ onKeyDown(value, label, e);
50
+ }, [onKeyDown, value, label]);
51
+ return /*#__PURE__*/_react.default.createElement(_tooltip.default, {
52
+ content: label
53
+ }, /*#__PURE__*/_react.default.createElement("span", {
54
+ className: (0, _runtime.ax)(["_2rkoiti9 _1h6d1j28 _1dqonqa1 _189et94y _1e0c1txw _4cvr1h6o _ca0qv77o _u5f3v77o _n3tdv77o _19bvv77o _858umuej _jyzfmuej _4cvxmuej"])
55
+ }, /*#__PURE__*/_react.default.createElement("button", {
56
+ type: "button",
57
+ "aria-label": label,
58
+ role: "radio",
59
+ "aria-checked": isSelected,
60
+ onClick: handleClick,
61
+ onKeyDown: handleKeyDown,
62
+ onMouseDown: handleMouseDown,
63
+ tabIndex: tabIndex,
64
+ autoFocus: autoFocus,
65
+ className: (0, _runtime.ax)(["_ca0qidpf _u5f3idpf _n3tdidpf _19bvidpf _2rko1hkb _19itcf40 _4t3icr4y _1bsbcr4y _bfhkm7j4 _80omtlke _1e0c1ule _kqswh2mm _y2mv12j9 _1bg4v77o"]),
66
+ style: {
67
+ backgroundColor: colorStyle || "var(--ds-background-input, #FFFFFF)",
68
+ border: "1px solid ".concat(borderColor),
69
+ "--_1wr0y6w": (0, _runtime.ix)("1px solid ".concat("var(--ds-border-inverse, #FFFFFF)")),
70
+ "--_toyvsf": (0, _runtime.ix)("2px solid ".concat("var(--ds-border-focused, #388BFF)"))
71
+ }
72
+ }, !decorator && isSelected && /*#__PURE__*/_react.default.createElement(_checkMarkEditorDone.default, {
73
+ LEGACY_primaryColor: checkMarkColor,
74
+ label: ""
75
+ }), decorator)));
76
+ });
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = getColorMessage;
7
+ /**
8
+ * Retrieves the appropriate internationalization message for a given color
9
+ * @param messages - Record of color values to message descriptors
10
+ * @param color - The color value to look up
11
+ * @returns The message descriptor or undefined if not found
12
+ */
13
+ function getColorMessage(messages, color) {
14
+ var message = messages[color];
15
+ if (!message) {
16
+ // eslint-disable-next-line no-console
17
+ console.warn("Color palette does not have an internationalization message for color ".concat(color.toUpperCase(), ".\nYou must add a message description to properly translate this color.\nUsing current label as default message.\nThis could have happened when someone changed the 'colorPalette' from 'adf-schema' without updating this file.\n"));
18
+ }
19
+ return message;
20
+ }
@@ -0,0 +1 @@
1
+ ._1e0c1txw{display:flex}
@@ -0,0 +1,118 @@
1
+ /* index.tsx generated by @compiled/babel-plugin v0.36.1 */
2
+ "use strict";
3
+
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.default = void 0;
10
+ require("./index.compiled.css");
11
+ var _runtime = require("@compiled/react/runtime");
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ var _chromatism = _interopRequireDefault(require("chromatism"));
14
+ var _reactIntlNext = require("react-intl-next");
15
+ var _compiled = require("@atlaskit/primitives/compiled");
16
+ var _tokens = require("@atlaskit/tokens");
17
+ var _Color = require("./Color");
18
+ var _getColorMessage = _interopRequireDefault(require("./getColorMessage"));
19
+ var _utils = require("./utils");
20
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
21
+ var styles = {
22
+ paletteWrapper: "_1e0c1txw"
23
+ };
24
+
25
+ /**
26
+ * For a given color pick the color from a list of colors with
27
+ * the highest contrast
28
+ *
29
+ * @param color color string, supports HEX, RGB, RGBA etc.
30
+ * @param useIconToken boolean, describes if a token should be used for the icon color
31
+ * @return Highest contrast color in pool
32
+ */
33
+ function getCheckMarkColor(color, useIconToken) {
34
+ var tokenVal = (0, _utils.getTokenCSSVariableValue)(color);
35
+ var colorValue = !!tokenVal ? tokenVal : color;
36
+
37
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage
38
+ var contrastColor = ['#FFFFFF', '#42526E'].sort(function (a, b) {
39
+ return _chromatism.default.difference(b, colorValue) - _chromatism.default.difference(a, colorValue);
40
+ })[0];
41
+ if (!useIconToken) {
42
+ return contrastColor;
43
+ }
44
+
45
+ // Use of these token comes from guidance from designers in the Design System team
46
+ // they are only intended for use with text colors (and there are different tokens
47
+ // planned to be used when this extended to be used with other palettes).
48
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage
49
+ return contrastColor === '#FFFFFF' ? "var(--ds-icon-inverse, #FFFFFF)" : "var(--ds-icon, #44546F)";
50
+ }
51
+
52
+ /**
53
+ * ColorPalette component for displaying a grid of selectable colors
54
+ *
55
+ * Features:
56
+ * - Responsive grid layout
57
+ * - Keyboard navigation support
58
+ * - Accessibility compliance (ARIA attributes)
59
+ * - Theme-aware tooltips
60
+ * - Design token integration
61
+ * - Customizable color mapping
62
+ */
63
+ var ColorPalette = function ColorPalette(_ref) {
64
+ var _ref$cols = _ref.cols,
65
+ cols = _ref$cols === void 0 ? _utils.DEFAULT_COLOR_PICKER_COLUMNS : _ref$cols,
66
+ onClick = _ref.onClick,
67
+ onKeyDown = _ref.onKeyDown,
68
+ selectedColor = _ref.selectedColor,
69
+ paletteOptions = _ref.paletteOptions;
70
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
71
+ formatMessage = _useIntl.formatMessage;
72
+ var palette = paletteOptions.palette,
73
+ hexToPaletteColor = paletteOptions.hexToPaletteColor,
74
+ paletteColorTooltipMessages = paletteOptions.paletteColorTooltipMessages;
75
+ var _useThemeObserver = (0, _tokens.useThemeObserver)(),
76
+ tokenTheme = _useThemeObserver.colorMode;
77
+ var useIconToken = !!hexToPaletteColor;
78
+ var colorsPerRow = (0, _react.useMemo)(function () {
79
+ return (0, _utils.getColorsPerRowFromPalette)(palette, cols);
80
+ }, [palette, cols]);
81
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, colorsPerRow.map(function (row) {
82
+ return /*#__PURE__*/_react.default.createElement(_compiled.Box, {
83
+ xcss: styles.paletteWrapper,
84
+ key: "row-first-color-".concat(row[0].value),
85
+ role: "radiogroup"
86
+ }, row.map(function (_ref2) {
87
+ var value = _ref2.value,
88
+ label = _ref2.label,
89
+ border = _ref2.border,
90
+ message = _ref2.message,
91
+ decorator = _ref2.decorator;
92
+ var tooltipMessage = message;
93
+
94
+ // Override with theme-specific tooltip messages if provided
95
+ if (paletteColorTooltipMessages) {
96
+ if (tokenTheme === 'dark') {
97
+ tooltipMessage = (0, _getColorMessage.default)(paletteColorTooltipMessages.dark, value.toUpperCase());
98
+ }
99
+ if (tokenTheme === 'light') {
100
+ tooltipMessage = (0, _getColorMessage.default)(paletteColorTooltipMessages.light, value.toUpperCase());
101
+ }
102
+ }
103
+ return /*#__PURE__*/_react.default.createElement(_Color.Color, {
104
+ key: value,
105
+ value: value,
106
+ borderColor: border,
107
+ label: tooltipMessage ? formatMessage(tooltipMessage) : label,
108
+ onClick: onClick,
109
+ onKeyDown: onKeyDown,
110
+ isSelected: value === selectedColor,
111
+ checkMarkColor: getCheckMarkColor(value, useIconToken),
112
+ hexToPaletteColor: hexToPaletteColor,
113
+ decorator: decorator
114
+ });
115
+ }));
116
+ }));
117
+ };
118
+ var _default = exports.default = ColorPalette;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DEFAULT_COLOR_PICKER_COLUMNS = void 0;
7
+ exports.getColorsPerRowFromPalette = getColorsPerRowFromPalette;
8
+ exports.getSelectedRowAndColumn = getSelectedRowAndColumn;
9
+ exports.getSelectedRowAndColumnFromPalette = getSelectedRowAndColumnFromPalette;
10
+ exports.getTokenCSSVariableValue = void 0;
11
+ /**
12
+ * Default number of columns in the color picker
13
+ */
14
+ var DEFAULT_COLOR_PICKER_COLUMNS = exports.DEFAULT_COLOR_PICKER_COLUMNS = 7;
15
+
16
+ /**
17
+ * Splits a palette array into rows based on the specified number of columns
18
+ * @param palette - Array of palette colors
19
+ * @param cols - Number of columns per row
20
+ * @returns Array of color rows
21
+ */
22
+ function getColorsPerRowFromPalette(palette) {
23
+ var cols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_COLOR_PICKER_COLUMNS;
24
+ return palette.reduce(function (resultArray, item, index) {
25
+ var chunkIndex = Math.floor(index / cols);
26
+ resultArray[chunkIndex] = resultArray[chunkIndex] || []; // start a new chunk
27
+ resultArray[chunkIndex].push(item);
28
+ return resultArray;
29
+ }, []);
30
+ }
31
+
32
+ /**
33
+ * Finds the row and column indices of a selected color in the palette grid
34
+ * @param colorsPerRow - 2D array of colors organized by rows
35
+ * @param selectedColor - The currently selected color value
36
+ * @returns Object containing row and column indices
37
+ */
38
+ function getSelectedRowAndColumn(colorsPerRow, selectedColor) {
39
+ var selectedRowIndex = -1;
40
+ var selectedColumnIndex = -1;
41
+ colorsPerRow.forEach(function (row, rowIndex) {
42
+ row.forEach(function (_ref, columnIndex) {
43
+ var value = _ref.value;
44
+ if (value === selectedColor) {
45
+ selectedRowIndex = rowIndex;
46
+ selectedColumnIndex = columnIndex;
47
+ }
48
+ });
49
+ });
50
+ return {
51
+ selectedRowIndex: selectedRowIndex,
52
+ selectedColumnIndex: selectedColumnIndex
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Finds the row and column indices of a selected color in a flat palette array
58
+ * @param palette - Flat array of palette colors
59
+ * @param selectedColor - The currently selected color value
60
+ * @param cols - Number of columns per row
61
+ * @returns Object containing row and column indices
62
+ */
63
+ function getSelectedRowAndColumnFromPalette(palette, selectedColor) {
64
+ var cols = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_COLOR_PICKER_COLUMNS;
65
+ var colorsPerRow = getColorsPerRowFromPalette(palette, cols);
66
+ return getSelectedRowAndColumn(colorsPerRow, selectedColor);
67
+ }
68
+
69
+ /**
70
+ * Extracts the actual color value from a CSS variable expression
71
+ * Handles both token variables and fallback values
72
+ * @param variableExpression - CSS variable expression (e.g., "var(--ds-background-accent-blue-subtle, #0052CC)")
73
+ * @returns The resolved color value or empty string if not found
74
+ */
75
+ var getTokenCSSVariableValue = exports.getTokenCSSVariableValue = function getTokenCSSVariableValue(variableExpression) {
76
+ // Match CSS variable pattern: var(--variable-name, fallback)
77
+ // Ignored via go/ees005
78
+ // eslint-disable-next-line require-unicode-regexp
79
+ var matcher = variableExpression.match(/var\(([^,\)]+)(,.*)?/);
80
+ if (matcher) {
81
+ var variable = matcher[1].trim();
82
+ var fallback = matcher[2] ? matcher[2].replace(',', '').trim() : '';
83
+
84
+ // Return fallback if we're in a server environment
85
+ if (typeof document === 'undefined') {
86
+ return fallback;
87
+ }
88
+
89
+ // Get the computed value from the document
90
+ var value = window.getComputedStyle(document.documentElement).getPropertyValue(variable).trim();
91
+ return value || fallback;
92
+ }
93
+ return '';
94
+ };
@@ -1,15 +1,18 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports.ToolbarDropdownMenu = void 0;
8
- var _react = _interopRequireDefault(require("react"));
9
+ var _react = _interopRequireWildcard(require("react"));
9
10
  var _dropdownMenu = _interopRequireDefault(require("@atlaskit/dropdown-menu"));
10
11
  var _uiContext = require("../hooks/ui-context");
11
12
  var _ToolbarButton = require("./ToolbarButton");
12
- var ToolbarDropdownMenu = exports.ToolbarDropdownMenu = function ToolbarDropdownMenu(_ref) {
13
+ var _ToolbarDropdownMenuContext = require("./ToolbarDropdownMenuContext");
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
15
+ var ToolbarDropdownMenuContent = function ToolbarDropdownMenuContent(_ref) {
13
16
  var iconBefore = _ref.iconBefore,
14
17
  groupLocation = _ref.groupLocation,
15
18
  children = _ref.children,
@@ -18,6 +21,23 @@ var ToolbarDropdownMenu = exports.ToolbarDropdownMenu = function ToolbarDropdown
18
21
  label = _ref.label;
19
22
  var _useToolbarUI = (0, _uiContext.useToolbarUI)(),
20
23
  onDropdownOpenChanged = _useToolbarUI.onDropdownOpenChanged;
24
+ var _useToolbarDropdownMe = (0, _ToolbarDropdownMenuContext.useToolbarDropdownMenu)(),
25
+ closeMenu = _useToolbarDropdownMe.closeMenu,
26
+ isOpen = _useToolbarDropdownMe.isOpen,
27
+ openMenu = _useToolbarDropdownMe.openMenu;
28
+ var handleOpenChange = (0, _react.useCallback)(function (args) {
29
+ onDropdownOpenChanged(args);
30
+ if (!args.isOpen) {
31
+ closeMenu();
32
+ }
33
+ }, [closeMenu, onDropdownOpenChanged]);
34
+ var handleClick = (0, _react.useCallback)(function () {
35
+ if (!isOpen) {
36
+ openMenu();
37
+ } else {
38
+ closeMenu();
39
+ }
40
+ }, [closeMenu, openMenu, isOpen]);
21
41
  return /*#__PURE__*/_react.default.createElement(_dropdownMenu.default, {
22
42
  trigger: function trigger(triggerProps) {
23
43
  return /*#__PURE__*/_react.default.createElement(_ToolbarButton.ToolbarButton, {
@@ -27,7 +47,10 @@ var ToolbarDropdownMenu = exports.ToolbarDropdownMenu = function ToolbarDropdown
27
47
  "aria-haspopup": triggerProps['aria-haspopup'],
28
48
  "aria-controls": triggerProps['aria-controls'],
29
49
  onBlur: triggerProps.onBlur,
30
- onClick: triggerProps.onClick,
50
+ onClick: function onClick(e) {
51
+ handleClick();
52
+ triggerProps.onClick && triggerProps.onClick(e);
53
+ },
31
54
  onFocus: triggerProps.onFocus,
32
55
  testId: testId,
33
56
  iconBefore: iconBefore,
@@ -36,6 +59,22 @@ var ToolbarDropdownMenu = exports.ToolbarDropdownMenu = function ToolbarDropdown
36
59
  label: label
37
60
  });
38
61
  },
39
- onOpenChange: onDropdownOpenChanged
62
+ onOpenChange: handleOpenChange,
63
+ isOpen: isOpen
40
64
  }, children);
65
+ };
66
+ var ToolbarDropdownMenu = exports.ToolbarDropdownMenu = function ToolbarDropdownMenu(_ref2) {
67
+ var iconBefore = _ref2.iconBefore,
68
+ groupLocation = _ref2.groupLocation,
69
+ children = _ref2.children,
70
+ isDisabled = _ref2.isDisabled,
71
+ testId = _ref2.testId,
72
+ label = _ref2.label;
73
+ return /*#__PURE__*/_react.default.createElement(_ToolbarDropdownMenuContext.ToolbarDropdownMenuProvider, null, /*#__PURE__*/_react.default.createElement(ToolbarDropdownMenuContent, {
74
+ iconBefore: iconBefore,
75
+ groupLocation: groupLocation,
76
+ isDisabled: isDisabled,
77
+ testId: testId,
78
+ label: label
79
+ }, children));
41
80
  };
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useToolbarDropdownMenu = exports.ToolbarDropdownMenuProvider = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
12
+ var ToolbarDropdownMenuContext = /*#__PURE__*/(0, _react.createContext)(undefined);
13
+ var useToolbarDropdownMenu = exports.useToolbarDropdownMenu = function useToolbarDropdownMenu() {
14
+ var context = (0, _react.useContext)(ToolbarDropdownMenuContext);
15
+ if (!context) {
16
+ throw new Error('useToolbarDropdownMenu must be used within ToolbarDropdownMenuProvider');
17
+ }
18
+ return context;
19
+ };
20
+ var ToolbarDropdownMenuProvider = exports.ToolbarDropdownMenuProvider = function ToolbarDropdownMenuProvider(_ref) {
21
+ var children = _ref.children;
22
+ var _useState = (0, _react.useState)(false),
23
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
24
+ isOpen = _useState2[0],
25
+ setIsOpen = _useState2[1];
26
+ var openMenu = function openMenu() {
27
+ return setIsOpen(true);
28
+ };
29
+ var closeMenu = function closeMenu() {
30
+ setIsOpen(false);
31
+ };
32
+ var contextValue = {
33
+ openMenu: openMenu,
34
+ closeMenu: closeMenu,
35
+ isOpen: isOpen
36
+ };
37
+ return /*#__PURE__*/_react.default.createElement(ToolbarDropdownMenuContext.Provider, {
38
+ value: contextValue
39
+ }, children);
40
+ };
@@ -11,6 +11,7 @@ export { ToolbarSection } from './ui/ToolbarSection';
11
11
  export { ToolbarTooltip } from './ui/ToolbarTooltip';
12
12
  export { ToolbarDropdownDivider } from './ui/ToolbarDropdownDivider';
13
13
  export { ToolbarColorSwatch } from './ui/ToolbarColorSwatch';
14
+ export { useToolbarDropdownMenu } from './ui/ToolbarDropdownMenuContext';
14
15
  export { AIAdjustLengthIcon } from './ui/icons/AIAdjustLengthIcon';
15
16
  export { AIChatIcon } from './ui/icons/AIChatIcon';
16
17
  export { AIBriefcaseIcon } from './ui/icons/AIProfessionalIcon';
@@ -56,4 +57,5 @@ export { AlignTextCenterIcon } from './ui/icons/AlignTextCenterIcon';
56
57
  export { AlignTextRightIcon } from './ui/icons/AlignTextRightIcon';
57
58
  export { IndentIcon } from './ui/icons/IndentIcon';
58
59
  export { OutdentIcon } from './ui/icons/OutdentIcon';
60
+ export { default as ColorPalette } from './ui/ColorPalette';
59
61
  export { useToolbarUI, ToolbarUIProvider } from './hooks/ui-context';
@@ -0,0 +1,25 @@
1
+
2
+ ._19itv4vr{border:1px solid var(--ds-border-inverse,#fff)}
3
+ ._2rko1hkb{border-radius:var(--ds-border-radius-050,4px)}
4
+ ._2rkoiti9{border-radius:var(--ds-border-radius-100,4px)}._189et94y{border-width:1px}
5
+ ._1dqonqa1{border-style:solid}
6
+ ._1h6d1j28{border-color:transparent}
7
+ ._19bvidpf{padding-left:0}
8
+ ._19bvv77o{padding-left:var(--ds-space-025,2px)}
9
+ ._1bsbcr4y{width:var(--ds-space-300,26px)}
10
+ ._1e0c1txw{display:flex}
11
+ ._1e0c1ule{display:block}
12
+ ._4cvr1h6o{align-items:center}
13
+ ._4t3icr4y{height:var(--ds-space-300,26px)}
14
+ ._80omtlke{cursor:pointer}
15
+ ._bfhkm7j4{background-color:var(--ds-background-neutral,#091e420f)}
16
+ ._ca0qidpf{padding-top:0}
17
+ ._ca0qv77o{padding-top:var(--ds-space-025,2px)}
18
+ ._kqswh2mm{position:relative}
19
+ ._n3tdidpf{padding-bottom:0}
20
+ ._n3tdv77o{padding-bottom:var(--ds-space-025,2px)}
21
+ ._u5f3idpf{padding-right:0}
22
+ ._u5f3v77o{padding-right:var(--ds-space-025,2px)}
23
+ ._y2mvugt7:focus{outline:2px solid var(--ds-border-focused,#388bff)}
24
+ ._858umuej:focus, ._jyzfmuej:focus-within, ._4cvxmuej:hover{border-color:var(--ds-border,#091e4224)}
25
+ ._1bg4v77o:focus{outline-offset:var(--ds-space-025,2px)}
@@ -0,0 +1,65 @@
1
+ /* Color.tsx generated by @compiled/babel-plugin v0.36.1 */
2
+ import "./Color.compiled.css";
3
+ import { ax, ix } from "@compiled/react/runtime";
4
+ import React, { useCallback, memo } from 'react';
5
+ import EditorDoneIcon from '@atlaskit/icon/core/migration/check-mark--editor-done';
6
+ import Tooltip from '@atlaskit/tooltip';
7
+ const buttonWrapperStyles = null;
8
+ const buttonStyles = null;
9
+
10
+ /**
11
+ * Individual color palette item component
12
+ * Displays a single color swatch with tooltip and selection state
13
+ */
14
+ export const Color = /*#__PURE__*/memo(({
15
+ autoFocus,
16
+ tabIndex,
17
+ value,
18
+ label,
19
+ isSelected,
20
+ borderColor,
21
+ checkMarkColor = "var(--ds-icon-inverse, #FFFFFF)",
22
+ hexToPaletteColor,
23
+ decorator,
24
+ onClick,
25
+ onKeyDown
26
+ }) => {
27
+ const colorStyle = hexToPaletteColor ? hexToPaletteColor(value) : value;
28
+ const handleMouseDown = useCallback(e => {
29
+ e.preventDefault();
30
+ }, []);
31
+ const handleClick = useCallback(e => {
32
+ e.preventDefault();
33
+ onClick(value, label);
34
+ }, [onClick, value, label]);
35
+ const handleKeyDown = useCallback(e => {
36
+ if (!onKeyDown) {
37
+ return;
38
+ }
39
+ e.preventDefault();
40
+ onKeyDown(value, label, e);
41
+ }, [onKeyDown, value, label]);
42
+ return /*#__PURE__*/React.createElement(Tooltip, {
43
+ content: label
44
+ }, /*#__PURE__*/React.createElement("span", {
45
+ className: ax(["_2rkoiti9 _1h6d1j28 _1dqonqa1 _189et94y _1e0c1txw _4cvr1h6o _ca0qv77o _u5f3v77o _n3tdv77o _19bvv77o _858umuej _jyzfmuej _4cvxmuej"])
46
+ }, /*#__PURE__*/React.createElement("button", {
47
+ type: "button",
48
+ "aria-label": label,
49
+ role: "radio",
50
+ "aria-checked": isSelected,
51
+ onClick: handleClick,
52
+ onKeyDown: handleKeyDown,
53
+ onMouseDown: handleMouseDown,
54
+ tabIndex: tabIndex,
55
+ style: {
56
+ backgroundColor: colorStyle || "var(--ds-background-input, #FFFFFF)",
57
+ border: `1px solid ${borderColor}`
58
+ },
59
+ autoFocus: autoFocus,
60
+ className: ax(["_ca0qidpf _u5f3idpf _n3tdidpf _19bvidpf _2rko1hkb _19itv4vr _4t3icr4y _1bsbcr4y _bfhkm7j4 _80omtlke _1e0c1ule _kqswh2mm _y2mvugt7 _1bg4v77o"])
61
+ }, !decorator && isSelected && /*#__PURE__*/React.createElement(EditorDoneIcon, {
62
+ LEGACY_primaryColor: checkMarkColor,
63
+ label: ""
64
+ }), decorator)));
65
+ });
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Retrieves the appropriate internationalization message for a given color
3
+ * @param messages - Record of color values to message descriptors
4
+ * @param color - The color value to look up
5
+ * @returns The message descriptor or undefined if not found
6
+ */
7
+ export default function getColorMessage(messages, color) {
8
+ const message = messages[color];
9
+ if (!message) {
10
+ // eslint-disable-next-line no-console
11
+ console.warn(`Color palette does not have an internationalization message for color ${color.toUpperCase()}.
12
+ You must add a message description to properly translate this color.
13
+ Using current label as default message.
14
+ This could have happened when someone changed the 'colorPalette' from 'adf-schema' without updating this file.
15
+ `);
16
+ }
17
+ return message;
18
+ }
@@ -0,0 +1 @@
1
+ ._1e0c1txw{display:flex}