@pingux/astro 2.211.0-alpha.0 → 2.212.1-alpha.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 (65) hide show
  1. package/lib/cjs/components/LabelValuePairs/LabelValuePairs.d.ts +14 -0
  2. package/lib/cjs/components/LabelValuePairs/LabelValuePairs.js +70 -0
  3. package/lib/cjs/components/LabelValuePairs/LabelValuePairs.mdx +69 -0
  4. package/lib/cjs/components/LabelValuePairs/LabelValuePairs.stories.js +109 -0
  5. package/lib/cjs/components/LabelValuePairs/LabelValuePairs.styles.d.ts +18 -0
  6. package/lib/cjs/components/LabelValuePairs/LabelValuePairs.styles.js +28 -0
  7. package/lib/cjs/components/LabelValuePairs/LabelValuePairs.test.js +315 -0
  8. package/lib/cjs/components/LabelValuePairs/LabelValuePairsLabel.d.ts +4 -0
  9. package/lib/cjs/components/LabelValuePairs/LabelValuePairsLabel.js +47 -0
  10. package/lib/cjs/components/LabelValuePairs/LabelValuePairsRow.d.ts +3 -0
  11. package/lib/cjs/components/LabelValuePairs/LabelValuePairsRow.js +40 -0
  12. package/lib/cjs/components/LabelValuePairs/LabelValuePairsSubvalue.d.ts +4 -0
  13. package/lib/cjs/components/LabelValuePairs/LabelValuePairsSubvalue.js +29 -0
  14. package/lib/cjs/components/LabelValuePairs/LabelValuePairsValue.d.ts +4 -0
  15. package/lib/cjs/components/LabelValuePairs/LabelValuePairsValue.js +120 -0
  16. package/lib/cjs/components/LabelValuePairs/constants.d.ts +5 -0
  17. package/lib/cjs/components/LabelValuePairs/constants.js +12 -0
  18. package/lib/cjs/components/LabelValuePairs/index.d.ts +2 -0
  19. package/lib/cjs/components/LabelValuePairs/index.js +62 -0
  20. package/lib/cjs/components/LabelValuePairs/labelValuePairsAttributes.d.ts +74 -0
  21. package/lib/cjs/components/LabelValuePairs/labelValuePairsAttributes.js +20 -0
  22. package/lib/cjs/index.d.ts +2 -0
  23. package/lib/cjs/index.js +71 -52
  24. package/lib/cjs/recipes/ListAndPanel.stories.js +1 -16
  25. package/lib/cjs/recipes/PanelContent.stories.js +11 -47
  26. package/lib/cjs/recipes/items.js +38 -30
  27. package/lib/cjs/styles/themeOverrides/onyxDarkUiLibraryOverride.js +41 -0
  28. package/lib/cjs/styles/themeOverrides/onyxUiLibraryOverride.d.ts +37 -0
  29. package/lib/cjs/styles/themeOverrides/onyxUiLibraryOverride.js +47 -0
  30. package/lib/cjs/styles/themes/next-gen/convertedComponentList.js +1 -1
  31. package/lib/cjs/styles/themes/next-gen/next-gen.d.ts +17 -0
  32. package/lib/cjs/styles/themes/next-gen/variants/variants.d.ts +17 -0
  33. package/lib/cjs/styles/themes/next-gen/variants/variants.js +2 -0
  34. package/lib/cjs/styles/variants/variants.js +2 -0
  35. package/lib/cjs/types/index.d.ts +1 -0
  36. package/lib/cjs/types/index.js +46 -35
  37. package/lib/cjs/types/labelValuePairs.d.ts +35 -0
  38. package/lib/cjs/types/labelValuePairs.js +6 -0
  39. package/lib/cjs/utils/designUtils/figmaLinks.d.ts +3 -0
  40. package/lib/cjs/utils/designUtils/figmaLinks.js +3 -0
  41. package/lib/components/LabelValuePairs/LabelValuePairs.js +35 -0
  42. package/lib/components/LabelValuePairs/LabelValuePairs.mdx +69 -0
  43. package/lib/components/LabelValuePairs/LabelValuePairs.stories.js +102 -0
  44. package/lib/components/LabelValuePairs/LabelValuePairs.styles.js +21 -0
  45. package/lib/components/LabelValuePairs/LabelValuePairs.test.js +309 -0
  46. package/lib/components/LabelValuePairs/LabelValuePairsLabel.js +35 -0
  47. package/lib/components/LabelValuePairs/LabelValuePairsRow.js +28 -0
  48. package/lib/components/LabelValuePairs/LabelValuePairsSubvalue.js +17 -0
  49. package/lib/components/LabelValuePairs/LabelValuePairsValue.js +108 -0
  50. package/lib/components/LabelValuePairs/constants.js +5 -0
  51. package/lib/components/LabelValuePairs/index.js +2 -0
  52. package/lib/components/LabelValuePairs/labelValuePairsAttributes.js +13 -0
  53. package/lib/index.js +2 -0
  54. package/lib/recipes/ListAndPanel.stories.js +3 -18
  55. package/lib/recipes/PanelContent.stories.js +11 -47
  56. package/lib/recipes/items.js +39 -31
  57. package/lib/styles/themeOverrides/onyxDarkUiLibraryOverride.js +41 -0
  58. package/lib/styles/themeOverrides/onyxUiLibraryOverride.js +47 -0
  59. package/lib/styles/themes/next-gen/convertedComponentList.js +1 -1
  60. package/lib/styles/themes/next-gen/variants/variants.js +2 -0
  61. package/lib/styles/variants/variants.js +2 -0
  62. package/lib/types/index.js +1 -0
  63. package/lib/types/labelValuePairs.js +1 -0
  64. package/lib/utils/designUtils/figmaLinks.js +3 -0
  65. package/package.json +1 -1
@@ -0,0 +1,309 @@
1
+ import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
2
+ import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
3
+ import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
4
+ import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
5
+ import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
6
+ import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
7
+ import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
8
+ import _Symbol from "@babel/runtime-corejs3/core-js-stable/symbol";
9
+ import _Object$create from "@babel/runtime-corejs3/core-js-stable/object/create";
10
+ import _bindInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/bind";
11
+ import _Object$getPrototypeOf from "@babel/runtime-corejs3/core-js-stable/object/get-prototype-of";
12
+ import _Object$setPrototypeOf from "@babel/runtime-corejs3/core-js-stable/object/set-prototype-of";
13
+ import _Symbol$asyncIterator from "@babel/runtime-corejs3/core-js-stable/symbol/async-iterator";
14
+ import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
15
+ import _Symbol$iterator from "@babel/runtime-corejs3/core-js-stable/symbol/iterator";
16
+ import _reverseInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reverse";
17
+ import _typeof from "@babel/runtime-corejs3/helpers/esm/typeof";
18
+ import _asyncToGenerator from "@babel/runtime-corejs3/helpers/esm/asyncToGenerator";
19
+ import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
20
+ function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (_Object$getPrototypeOf ? _Object$getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && _reverseInstanceProperty(o).call(o)); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
21
+ function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof _Symbol && _Symbol$iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
22
+ function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
23
+ function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
24
+ function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || _Promise); }
25
+ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof _Symbol && _Symbol$asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
26
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof _Symbol ? _Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = _Object$create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: _bindInstanceProperty(d).call(d, e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = _Object$getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(c); function f(e) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = _Object$create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
27
+ function _regeneratorDefine2(e, r, n, t) { var i = _Object$defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
28
+ function _OverloadYield(e, d) { this.v = e, this.k = d; }
29
+ import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
30
+ import _repeatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/repeat";
31
+ function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
32
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context5, _context6; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context5 = ownKeys(Object(t), !0)).call(_context5, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context6 = ownKeys(Object(t))).call(_context6, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
33
+ import React from 'react';
34
+ import InformationIcon from '@pingux/mdi-react/InformationIcon';
35
+ import userEvent from '@testing-library/user-event';
36
+ import { Icon } from '../../index';
37
+ import { act, render, screen } from '../../utils/testUtils/testWrapper';
38
+ import { universalComponentTests } from '../../utils/testUtils/universalComponentTest';
39
+ import LabelValuePairs, { Pair, PairLabel, PairSubvalue, PairValue, ValueTypes } from '.';
40
+ import { jsx as ___EmotionJSX } from "@emotion/react";
41
+ var originalClipboard = _objectSpread({}, global.navigator.clipboard);
42
+ var getComponent = function getComponent(children) {
43
+ return render(___EmotionJSX(LabelValuePairs, null, children));
44
+ };
45
+
46
+ // Needs to be added to each components test file
47
+ universalComponentTests({
48
+ renderComponent: function renderComponent(props) {
49
+ return ___EmotionJSX(LabelValuePairs, props, ___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Username"), ___EmotionJSX(PairValue, null, "jsmith")));
50
+ }
51
+ });
52
+ test('renders a row for each field with a value', function () {
53
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Username"), ___EmotionJSX(PairValue, null, "jsmith")));
54
+ expect(screen.getByText('Username')).toBeInTheDocument();
55
+ expect(screen.getByText('jsmith')).toBeInTheDocument();
56
+ });
57
+ test('rows with falsy value are not rendered unless isLoading is true', function () {
58
+ getComponent(___EmotionJSX(React.Fragment, null, ___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Empty Field"), ___EmotionJSX(PairValue, null)), ___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Null Field"), ___EmotionJSX(PairValue, null, null)), ___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Visible Field"), ___EmotionJSX(PairValue, null, "some value"))));
59
+ expect(screen.queryByText('Empty Field')).not.toBeInTheDocument();
60
+ expect(screen.queryByText('Null Field')).not.toBeInTheDocument();
61
+ expect(screen.getByText('Visible Field')).toBeInTheDocument();
62
+ });
63
+ test('rows with falsy value are rendered when isLoading is true', function () {
64
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Loading Field"), ___EmotionJSX(PairValue, {
65
+ isLoading: true
66
+ })));
67
+ expect(screen.getByText('Loading Field')).toBeInTheDocument();
68
+ });
69
+ describe('valueType COPYABLE', function () {
70
+ beforeEach(function () {
71
+ var mockClipboard = {
72
+ writeText: jest.fn()
73
+ };
74
+ _Object$defineProperty(window, 'navigator', {
75
+ value: {
76
+ clipboard: mockClipboard
77
+ },
78
+ configurable: true
79
+ });
80
+ global.document.execCommand = jest.fn();
81
+ jest.spyOn(document, 'execCommand').mockReturnValue(true);
82
+ });
83
+ afterEach(function () {
84
+ jest.resetAllMocks();
85
+ _Object$defineProperty(window, 'navigator', {
86
+ value: {
87
+ clipboard: originalClipboard
88
+ },
89
+ configurable: true
90
+ });
91
+ });
92
+ test('renders a copy-to-clipboard button', function () {
93
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "API Key"), ___EmotionJSX(PairValue, {
94
+ valueType: ValueTypes.COPYABLE
95
+ }, "abc123")));
96
+ expect(screen.getByLabelText('copy to clipboard')).toBeInTheDocument();
97
+ });
98
+ test('clicking the copy button writes the field value to the clipboard', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
99
+ var fieldValue, button;
100
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
101
+ while (1) switch (_context2.prev = _context2.next) {
102
+ case 0:
103
+ fieldValue = 'abc123';
104
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "API Key"), ___EmotionJSX(PairValue, {
105
+ valueType: ValueTypes.COPYABLE
106
+ }, fieldValue)));
107
+ button = screen.getByLabelText('copy to clipboard');
108
+ _context2.next = 5;
109
+ return act(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
110
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
111
+ while (1) switch (_context.prev = _context.next) {
112
+ case 0:
113
+ return _context.abrupt("return", userEvent.click(button));
114
+ case 1:
115
+ case "end":
116
+ return _context.stop();
117
+ }
118
+ }, _callee);
119
+ })));
120
+ case 5:
121
+ expect(navigator.clipboard.writeText).toHaveBeenCalledTimes(1);
122
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith(fieldValue);
123
+ case 7:
124
+ case "end":
125
+ return _context2.stop();
126
+ }
127
+ }, _callee2);
128
+ })));
129
+ });
130
+ test('valueType ELEMENT renders the provided node directly', function () {
131
+ var customNode = ___EmotionJSX("span", {
132
+ "data-testid": "custom-element"
133
+ }, "Custom Element");
134
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Custom"), ___EmotionJSX(PairValue, {
135
+ valueType: ValueTypes.ELEMENT
136
+ }, customNode)));
137
+ expect(screen.getByTestId('custom-element')).toBeInTheDocument();
138
+ expect(screen.getByText('Custom Element')).toBeInTheDocument();
139
+ });
140
+ test('valueType MASKED renders bullet characters by default', function () {
141
+ var _context3;
142
+ var secretValue = 'secret';
143
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Password"), ___EmotionJSX(PairValue, {
144
+ valueType: ValueTypes.MASKED
145
+ }, secretValue)));
146
+ var bullets = _repeatInstanceProperty(_context3 = '•').call(_context3, secretValue.length);
147
+ expect(screen.getByText(bullets)).toBeInTheDocument();
148
+ });
149
+ test('masked toggle has aria-label "Show content" initially, clicking reveals value and changes label to "Hide content"', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
150
+ var secretValue, showButton;
151
+ return _regeneratorRuntime().wrap(function _callee3$(_context4) {
152
+ while (1) switch (_context4.prev = _context4.next) {
153
+ case 0:
154
+ secretValue = 'mypassword';
155
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Secret"), ___EmotionJSX(PairValue, {
156
+ valueType: ValueTypes.MASKED
157
+ }, secretValue)));
158
+ showButton = screen.getByLabelText('Show content');
159
+ expect(showButton).toBeInTheDocument();
160
+
161
+ // The actual value should not be visible yet
162
+ expect(screen.queryByText(secretValue)).not.toBeInTheDocument();
163
+ _context4.next = 7;
164
+ return userEvent.click(showButton);
165
+ case 7:
166
+ // After click: value is revealed and button label changes
167
+ expect(screen.getByText(secretValue)).toBeInTheDocument();
168
+ expect(screen.getByLabelText('Hide content')).toBeInTheDocument();
169
+ case 9:
170
+ case "end":
171
+ return _context4.stop();
172
+ }
173
+ }, _callee3);
174
+ })));
175
+ test('isLoading renders the skeleton and has role="alert" in the DOM', function () {
176
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Loading Row"), ___EmotionJSX(PairValue, {
177
+ isLoading: true
178
+ }, "will be replaced")));
179
+ expect(screen.getByRole('alert')).toBeInTheDocument();
180
+ });
181
+ test('isLoading renders even when value is falsy', function () {
182
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Empty Loading Row"), ___EmotionJSX(PairValue, {
183
+ isLoading: true
184
+ }, undefined)));
185
+ expect(screen.getByText('Empty Loading Row')).toBeInTheDocument();
186
+ expect(screen.getByRole('alert')).toBeInTheDocument();
187
+ });
188
+ test('helpHint content appears and trigger button has expected aria-label', function () {
189
+ var helpText = 'This is some help content';
190
+ var fieldLabel = 'Help Field';
191
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, {
192
+ helpHint: helpText
193
+ }, fieldLabel), ___EmotionJSX(PairValue, null, "value here")));
194
+ var expectedAriaLabel = "".concat(fieldLabel, " help hint");
195
+ expect(screen.getByLabelText(expectedAriaLabel)).toBeInTheDocument();
196
+ });
197
+ test('Subvalue renders when provided', function () {
198
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Main Label"), ___EmotionJSX(PairSubvalue, null, "Secondary label text"), ___EmotionJSX(PairValue, null, "some value")));
199
+ expect(screen.getByText('Secondary label text')).toBeInTheDocument();
200
+ });
201
+ test('second child renders as an icon element when provided', function () {
202
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Icon Field", ___EmotionJSX(Icon, {
203
+ "aria-hidden": "true",
204
+ title: {
205
+ name: ''
206
+ },
207
+ icon: InformationIcon
208
+ })), ___EmotionJSX(PairValue, null, "icon value")));
209
+ // the icon is aria-hidden so must query with hidden: true
210
+ var icons = screen.getAllByRole('img', {
211
+ hidden: true
212
+ });
213
+ expect(icons.length).toBeGreaterThan(0);
214
+ });
215
+ describe('sub-component prop passthrough', function () {
216
+ test('PairLabel forwards containerProps and textProps, and renders a second child as an icon', function () {
217
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, {
218
+ containerProps: {
219
+ 'data-testid': 'label-container'
220
+ },
221
+ textProps: {
222
+ 'data-testid': 'label-text'
223
+ }
224
+ }, "Field", ___EmotionJSX(Icon, {
225
+ "data-testid": "label-icon",
226
+ "aria-hidden": "true",
227
+ title: {
228
+ name: ''
229
+ },
230
+ icon: InformationIcon
231
+ })), ___EmotionJSX(PairValue, null, "value")));
232
+ expect(screen.getByTestId('label-container')).toBeInTheDocument();
233
+ expect(screen.getByTestId('label-text')).toBeInTheDocument();
234
+ expect(screen.getByTestId('label-icon')).toBeInTheDocument();
235
+ });
236
+ test('PairLabel forwards helpHintProps to the HelpHint popover trigger', function () {
237
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, {
238
+ helpHint: "Help content",
239
+ helpHintProps: {
240
+ 'data-testid': 'label-help-hint'
241
+ }
242
+ }, "Field"), ___EmotionJSX(PairValue, null, "value")));
243
+ expect(screen.getByTestId('label-help-hint')).toBeInTheDocument();
244
+ });
245
+ test('PairValue forwards containerProps and textProps for the default text display', function () {
246
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Field"), ___EmotionJSX(PairValue, {
247
+ containerProps: {
248
+ 'data-testid': 'value-container'
249
+ },
250
+ textProps: {
251
+ 'data-testid': 'value-text'
252
+ }
253
+ }, "value")));
254
+ expect(screen.getByTestId('value-text')).toBeInTheDocument();
255
+ });
256
+ test('PairValue forwards containerProps and textProps for COPYABLE values', function () {
257
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Field"), ___EmotionJSX(PairValue, {
258
+ valueType: ValueTypes.COPYABLE,
259
+ containerProps: {
260
+ 'data-testid': 'copy-container'
261
+ },
262
+ textProps: {
263
+ 'data-testid': 'copy-text'
264
+ }
265
+ }, "abc123")));
266
+ expect(screen.getByTestId('copy-container')).toBeInTheDocument();
267
+ expect(screen.getByTestId('copy-text')).toBeInTheDocument();
268
+ });
269
+ test('PairValue forwards containerProps, textProps, iconProps, and iconButtonProps for MASKED values', function () {
270
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Field"), ___EmotionJSX(PairValue, {
271
+ valueType: ValueTypes.MASKED,
272
+ containerProps: {
273
+ 'data-testid': 'masked-container'
274
+ },
275
+ textProps: {
276
+ 'data-testid': 'masked-text'
277
+ },
278
+ iconProps: {
279
+ 'data-testid': 'masked-icon'
280
+ },
281
+ iconButtonProps: {
282
+ 'data-testid': 'masked-icon-button'
283
+ }
284
+ }, "secret")));
285
+ expect(screen.getByTestId('masked-container')).toBeInTheDocument();
286
+ expect(screen.getByTestId('masked-text')).toBeInTheDocument();
287
+ expect(screen.getByTestId('masked-icon')).toBeInTheDocument();
288
+ expect(screen.getByTestId('masked-icon-button')).toBeInTheDocument();
289
+ });
290
+ test('PairValue forwards skeletonProps and containerProps when isLoading', function () {
291
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Field"), ___EmotionJSX(PairValue, {
292
+ isLoading: true,
293
+ containerProps: {
294
+ 'data-testid': 'loading-container'
295
+ },
296
+ skeletonProps: {
297
+ 'data-testid': 'loading-skeleton'
298
+ }
299
+ })));
300
+ expect(screen.getByTestId('loading-container')).toBeInTheDocument();
301
+ expect(screen.getByTestId('loading-skeleton')).toBeInTheDocument();
302
+ });
303
+ test('PairSubvalue forwards TextProps directly', function () {
304
+ getComponent(___EmotionJSX(Pair, null, ___EmotionJSX(PairLabel, null, "Field"), ___EmotionJSX(PairSubvalue, {
305
+ "data-testid": "subvalue-text"
306
+ }, "Secondary text"), ___EmotionJSX(PairValue, null, "value")));
307
+ expect(screen.getByTestId('subvalue-text')).toBeInTheDocument();
308
+ });
309
+ });
@@ -0,0 +1,35 @@
1
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
+ import _slicedToArray from "@babel/runtime-corejs3/helpers/esm/slicedToArray";
3
+ import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
4
+ var _excluded = ["children", "helpHint", "containerProps", "textProps", "helpHintProps"];
5
+ import React, { forwardRef } from 'react';
6
+ import { Box, HelpHint, Text } from '../../index';
7
+ import { jsx as ___EmotionJSX } from "@emotion/react";
8
+ var displayName = 'PairLabel';
9
+ var PairLabel = /*#__PURE__*/forwardRef(function (props, ref) {
10
+ var children = props.children,
11
+ helpHint = props.helpHint,
12
+ containerProps = props.containerProps,
13
+ textProps = props.textProps,
14
+ helpHintProps = props.helpHintProps,
15
+ others = _objectWithoutProperties(props, _excluded);
16
+ var _React$Children$toArr = React.Children.toArray(children),
17
+ _React$Children$toArr2 = _slicedToArray(_React$Children$toArr, 2),
18
+ label = _React$Children$toArr2[0],
19
+ icon = _React$Children$toArr2[1];
20
+ return ___EmotionJSX(Box, _extends({
21
+ ref: ref,
22
+ isRow: true,
23
+ alignItems: "center",
24
+ gap: "sm"
25
+ }, others, containerProps), ___EmotionJSX(Text, _extends({
26
+ variant: "h4",
27
+ as: "h4"
28
+ }, textProps), label), icon, helpHint && ___EmotionJSX(HelpHint, _extends({
29
+ iconButtonProps: {
30
+ 'aria-label': "".concat(label, " help hint")
31
+ }
32
+ }, helpHintProps), helpHint));
33
+ });
34
+ PairLabel.displayName = displayName;
35
+ export default PairLabel;
@@ -0,0 +1,28 @@
1
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
+ import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
3
+ var _excluded = ["children"];
4
+ import _findInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/find";
5
+ import React, { forwardRef } from 'react';
6
+ import { Box } from '../../index';
7
+ import PairValue from './LabelValuePairsValue';
8
+ import { jsx as ___EmotionJSX } from "@emotion/react";
9
+ var displayName = 'Pair';
10
+ var Pair = /*#__PURE__*/forwardRef(function (props, ref) {
11
+ var children = props.children,
12
+ others = _objectWithoutProperties(props, _excluded);
13
+ var childrenArray = React.Children.toArray(children);
14
+ var valueChild = _findInstanceProperty(childrenArray).call(childrenArray, function (child) {
15
+ return /*#__PURE__*/React.isValidElement(child) && child.type === PairValue;
16
+ });
17
+ var isLoading = valueChild === null || valueChild === void 0 ? void 0 : valueChild.props.isLoading;
18
+ var hasValueContent = Boolean(valueChild === null || valueChild === void 0 ? void 0 : valueChild.props.children);
19
+ if (!hasValueContent && !isLoading) {
20
+ return null;
21
+ }
22
+ return ___EmotionJSX(Box, _extends({
23
+ ref: ref,
24
+ variant: "labelValuePairs.fieldItem"
25
+ }, others), children);
26
+ });
27
+ Pair.displayName = displayName;
28
+ export default Pair;
@@ -0,0 +1,17 @@
1
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
+ import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
3
+ var _excluded = ["children"];
4
+ import React, { forwardRef } from 'react';
5
+ import { Text } from '../../index';
6
+ import { jsx as ___EmotionJSX } from "@emotion/react";
7
+ var displayName = 'PairSubvalue';
8
+ var PairSubvalue = /*#__PURE__*/forwardRef(function (props, ref) {
9
+ var children = props.children,
10
+ others = _objectWithoutProperties(props, _excluded);
11
+ return ___EmotionJSX(Text, _extends({
12
+ ref: ref,
13
+ variant: "variants.labelValuePairs.subLabel"
14
+ }, others), children);
15
+ });
16
+ PairSubvalue.displayName = displayName;
17
+ export default PairSubvalue;
@@ -0,0 +1,108 @@
1
+ import _slicedToArray from "@babel/runtime-corejs3/helpers/esm/slicedToArray";
2
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
3
+ import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
4
+ var _excluded = ["children"],
5
+ _excluded2 = ["children", "valueType", "isLoading", "containerProps", "textProps", "iconProps", "iconButtonProps", "skeletonProps"];
6
+ import _repeatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/repeat";
7
+ import React, { forwardRef, useState } from 'react';
8
+ import EyeOffIcon from '@pingux/mdi-react/EyeOffOutlineIcon';
9
+ import EyeIcon from '@pingux/mdi-react/EyeOutlineIcon';
10
+ import { Box, CopyText, Icon, IconButton, Skeleton, Text } from '../../index';
11
+ import { ValueTypes } from './constants';
12
+ import { jsx as ___EmotionJSX } from "@emotion/react";
13
+ var displayName = 'PairValue';
14
+ var MASKED_ARIA_LABELS = {
15
+ SHOW: 'Show content',
16
+ HIDE: 'Hide content'
17
+ };
18
+ var ValueText = function ValueText(_ref) {
19
+ var children = _ref.children,
20
+ others = _objectWithoutProperties(_ref, _excluded);
21
+ return ___EmotionJSX(Text, _extends({
22
+ variant: "variants.labelValuePairs.value"
23
+ }, others), children);
24
+ };
25
+ var MaskedValue = function MaskedValue(_ref2) {
26
+ var _context;
27
+ var value = _ref2.value,
28
+ containerProps = _ref2.containerProps,
29
+ textProps = _ref2.textProps,
30
+ iconProps = _ref2.iconProps,
31
+ iconButtonProps = _ref2.iconButtonProps;
32
+ var _useState = useState(false),
33
+ _useState2 = _slicedToArray(_useState, 2),
34
+ isRevealed = _useState2[0],
35
+ setIsRevealed = _useState2[1];
36
+ var bullets = _repeatInstanceProperty(_context = '•').call(_context, value.length);
37
+ return ___EmotionJSX(Box, _extends({
38
+ isRow: true,
39
+ alignItems: "center",
40
+ gap: "sm"
41
+ }, containerProps), ___EmotionJSX(ValueText, _extends({
42
+ sx: isRevealed ? undefined : {
43
+ letterSpacing: '0.25em'
44
+ }
45
+ }, textProps), isRevealed ? value : bullets), ___EmotionJSX(IconButton, _extends({
46
+ "aria-label": isRevealed ? MASKED_ARIA_LABELS.HIDE : MASKED_ARIA_LABELS.SHOW,
47
+ onPress: function onPress() {
48
+ return setIsRevealed(function (prev) {
49
+ return !prev;
50
+ });
51
+ },
52
+ sx: {
53
+ width: 'fit-content',
54
+ marginLeft: 'sm',
55
+ alignSelf: 'auto'
56
+ }
57
+ }, iconButtonProps), ___EmotionJSX(Icon, _extends({
58
+ "aria-hidden": "true",
59
+ title: {
60
+ name: isRevealed ? 'Eye Icon' : 'Eye Off Icon'
61
+ },
62
+ icon: isRevealed ? EyeIcon : EyeOffIcon,
63
+ size: "sm"
64
+ }, iconProps))));
65
+ };
66
+ var PairValue = /*#__PURE__*/forwardRef(function (props, ref) {
67
+ var children = props.children,
68
+ valueType = props.valueType,
69
+ isLoading = props.isLoading,
70
+ containerProps = props.containerProps,
71
+ textProps = props.textProps,
72
+ iconProps = props.iconProps,
73
+ iconButtonProps = props.iconButtonProps,
74
+ skeletonProps = props.skeletonProps,
75
+ others = _objectWithoutProperties(props, _excluded2);
76
+ if (isLoading) {
77
+ return ___EmotionJSX(Box, _extends({
78
+ ref: ref,
79
+ role: "alert",
80
+ "aria-live": "assertive",
81
+ "aria-label": "Loading"
82
+ }, others, containerProps), ___EmotionJSX(Skeleton, _extends({
83
+ variant: "text"
84
+ }, skeletonProps)));
85
+ }
86
+ switch (valueType) {
87
+ case ValueTypes.COPYABLE:
88
+ return ___EmotionJSX(CopyText, _extends({
89
+ ref: ref
90
+ }, others, containerProps), ___EmotionJSX(ValueText, textProps, children));
91
+ case ValueTypes.MASKED:
92
+ return ___EmotionJSX(MaskedValue, {
93
+ value: String(children),
94
+ containerProps: containerProps,
95
+ textProps: textProps,
96
+ iconProps: iconProps,
97
+ iconButtonProps: iconButtonProps
98
+ });
99
+ case ValueTypes.ELEMENT:
100
+ return children;
101
+ default:
102
+ return ___EmotionJSX(ValueText, _extends({
103
+ ref: ref
104
+ }, others, textProps), children);
105
+ }
106
+ });
107
+ PairValue.displayName = displayName;
108
+ export default PairValue;
@@ -0,0 +1,5 @@
1
+ export var ValueTypes = {
2
+ COPYABLE: 'COPYABLE',
3
+ MASKED: 'MASKED',
4
+ ELEMENT: 'ELEMENT'
5
+ };
@@ -0,0 +1,2 @@
1
+ export * from './constants';
2
+ export { default, Pair, PairLabel, PairSubvalue, PairValue } from './LabelValuePairs';
@@ -0,0 +1,13 @@
1
+ import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
2
+ import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
3
+ import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
4
+ import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
5
+ import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
6
+ import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
7
+ import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
8
+ import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
9
+ import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
10
+ function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(t), !0)).call(_context, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context2 = ownKeys(Object(t))).call(_context2, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
12
+ import { ariaAttributeBaseArgTypes } from '../../utils/docUtils/ariaAttributes';
13
+ export var labelValuePairsArgTypes = _objectSpread({}, ariaAttributeBaseArgTypes);
package/lib/index.js CHANGED
@@ -109,6 +109,8 @@ export { default as Input } from './components/Input';
109
109
  export * from './components/Input';
110
110
  export { default as Label } from './components/Label';
111
111
  export * from './components/Label';
112
+ export { default as LabelValuePairs } from './components/LabelValuePairs';
113
+ export * from './components/LabelValuePairs';
112
114
  export { default as Link } from './components/Link';
113
115
  export * from './components/Link';
114
116
  export { default as LinkSelectField } from './components/LinkSelectField';
@@ -11,11 +11,11 @@ import AccountIcon from '@pingux/mdi-react/AccountIcon';
11
11
  import ChevronRightIcon from '@pingux/mdi-react/ChevronRightIcon';
12
12
  import PlusIcon from '@pingux/mdi-react/PlusIcon';
13
13
  import { useOverlappingMenuHoverState, useOverlayPanelState } from '../hooks';
14
- import { AccordionGroup, Badge, Box, Breadcrumbs, Button, ButtonBar, EditButton, Icon, IconButton, Image, ImageUploadField, Link, ListView, ListViewItem, ListViewItemMenu, ListViewItemSwitchField, OverlayPanel, PanelHeader, PanelHeaderCloseButton, PanelHeaderMenu, PanelHeaderSwitchField, SearchField, SelectField, Separator, Tab, Tabs, Text, TextField } from '../index';
14
+ import { AccordionGroup, Badge, Box, Breadcrumbs, Button, ButtonBar, EditButton, Icon, IconButton, Image, ImageUploadField, LabelValuePairs, Link, ListView, ListViewItem, ListViewItemMenu, ListViewItemSwitchField, OverlayPanel, PanelHeader, PanelHeaderCloseButton, PanelHeaderMenu, PanelHeaderSwitchField, SearchField, SelectField, Separator, Tab, Tabs, Text, TextField } from '../index';
15
15
  import { FIGMA_LINKS } from '../utils/designUtils/figmaLinks';
16
16
  import UserImage from '../utils/devUtils/assets/UserImage.png';
17
17
  import { colorBlockButtons, editData, items, personalData } from './items';
18
- import { AddAttributeButton, ColorBlockButton, LabelValuePairs } from './PanelContent.stories';
18
+ import { AddAttributeButton, ColorBlockButton } from './PanelContent.stories';
19
19
  import { jsx as ___EmotionJSX } from "@emotion/react";
20
20
  export default {
21
21
  title: 'Recipes/List And Panel',
@@ -46,17 +46,6 @@ var sx = {
46
46
  top: 0,
47
47
  right: 0
48
48
  },
49
- itemLabel: {
50
- fontSize: 'sm',
51
- fontWeight: 3,
52
- lineHeight: '16px',
53
- mb: 'xs'
54
- },
55
- itemValue: {
56
- fontWeight: 0,
57
- lineHeight: '18px',
58
- mb: 'md'
59
- },
60
49
  panelHeader: {
61
50
  container: {
62
51
  bg: 'accent.99',
@@ -198,11 +187,7 @@ export var ListAndPanel = function ListAndPanel() {
198
187
  }, ___EmotionJSX(Image, {
199
188
  src: UserImage,
200
189
  alt: "user"
201
- }), ___EmotionJSX(LabelValuePairs, {
202
- fields: personalData[item].fields
203
- })) : ___EmotionJSX(LabelValuePairs, {
204
- fields: personalData[item].fields
205
- }), personalData[item].badges && ___EmotionJSX(Box, {
190
+ }), ___EmotionJSX(LabelValuePairs, null, personalData[item].rows)) : ___EmotionJSX(LabelValuePairs, null, personalData[item].rows), personalData[item].badges && ___EmotionJSX(Box, {
206
191
  isRow: true,
207
192
  gap: "sm"
208
193
  }, _mapInstanceProperty(_context3 = personalData[item].badges).call(_context3, function (badge) {