@spaced-out/ui-design-system 0.5.9 → 0.5.11

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 (66) hide show
  1. package/.github/workflows/publish_to_npm.yml +21 -27
  2. package/.storybook/main.ts +1 -1
  3. package/.storybook/public/component-parent-levels.json +77 -77
  4. package/CHANGELOG.md +25 -0
  5. package/eslint.config.mjs +41 -25
  6. package/lib/components/Card/Card.d.ts +7 -5
  7. package/lib/components/Card/Card.d.ts.map +1 -1
  8. package/lib/components/Card/Card.js +33 -1
  9. package/lib/components/CircularLoader/CircularLoader.d.ts +1 -0
  10. package/lib/components/CircularLoader/CircularLoader.d.ts.map +1 -1
  11. package/lib/components/CircularLoader/CircularLoader.js +7 -1
  12. package/lib/components/EmptyState/EmptyState.d.ts +1 -0
  13. package/lib/components/EmptyState/EmptyState.d.ts.map +1 -1
  14. package/lib/components/EmptyState/EmptyState.js +26 -1
  15. package/lib/components/ErrorMessage/ErrorMessage.d.ts +1 -0
  16. package/lib/components/ErrorMessage/ErrorMessage.d.ts.map +1 -1
  17. package/lib/components/ErrorMessage/ErrorMessage.js +30 -1
  18. package/lib/components/FocusManager/FocusManager.d.ts +1 -0
  19. package/lib/components/FocusManager/FocusManager.d.ts.map +1 -1
  20. package/lib/components/FocusManager/FocusManager.js +6 -1
  21. package/lib/components/Grid/Grid.d.ts +4 -2
  22. package/lib/components/Grid/Grid.d.ts.map +1 -1
  23. package/lib/components/Grid/Grid.js +13 -3
  24. package/lib/components/Icon/Icon.d.ts +1 -0
  25. package/lib/components/Icon/Icon.d.ts.map +1 -1
  26. package/lib/components/Icon/Icon.js +7 -1
  27. package/lib/components/Input/Input.d.ts +1 -0
  28. package/lib/components/Input/Input.d.ts.map +1 -1
  29. package/lib/components/Input/Input.js +64 -0
  30. package/lib/components/LinearLoader/LinearLoader.d.ts +1 -0
  31. package/lib/components/LinearLoader/LinearLoader.d.ts.map +1 -1
  32. package/lib/components/LinearLoader/LinearLoader.js +7 -1
  33. package/lib/components/PromptChip/PromptChip.d.ts +2 -0
  34. package/lib/components/PromptChip/PromptChip.d.ts.map +1 -1
  35. package/lib/components/PromptChip/PromptChip.js +2 -2
  36. package/lib/components/Separator/Separator.d.ts +1 -0
  37. package/lib/components/Separator/Separator.d.ts.map +1 -1
  38. package/lib/components/Separator/Separator.js +7 -2
  39. package/lib/components/Shimmer/Shimmer.d.ts +5 -2
  40. package/lib/components/Shimmer/Shimmer.d.ts.map +1 -1
  41. package/lib/components/Shimmer/Shimmer.js +39 -8
  42. package/lib/components/StatusIndicator/StatusIndicator.d.ts +1 -0
  43. package/lib/components/StatusIndicator/StatusIndicator.d.ts.map +1 -1
  44. package/lib/components/StatusIndicator/StatusIndicator.js +6 -1
  45. package/lib/components/StickyBar/StickyBar.d.ts +4 -2
  46. package/lib/components/StickyBar/StickyBar.d.ts.map +1 -1
  47. package/lib/components/StickyBar/StickyBar.js +16 -1
  48. package/lib/components/Text/Text.d.ts +2 -0
  49. package/lib/components/Text/Text.d.ts.map +1 -1
  50. package/lib/components/Text/Text.js +189 -27
  51. package/lib/components/Toggle/Toggle.d.ts +1 -0
  52. package/lib/components/Toggle/Toggle.d.ts.map +1 -1
  53. package/lib/components/Toggle/Toggle.js +18 -0
  54. package/lib/components/Truncate/Truncate.d.ts +1 -0
  55. package/lib/components/Truncate/Truncate.d.ts.map +1 -1
  56. package/lib/components/Truncate/Truncate.js +12 -3
  57. package/lib/utils/index.d.ts +1 -0
  58. package/lib/utils/index.d.ts.map +1 -1
  59. package/lib/utils/index.js +11 -0
  60. package/lib/utils/qa/index.d.ts +2 -0
  61. package/lib/utils/qa/index.d.ts.map +1 -0
  62. package/lib/utils/qa/index.js +16 -0
  63. package/lib/utils/qa/qa.d.ts +30 -0
  64. package/lib/utils/qa/qa.d.ts.map +1 -0
  65. package/lib/utils/qa/qa.js +52 -0
  66. package/package.json +2 -1
@@ -24,6 +24,7 @@ export interface ToggleProps {
24
24
  value?: string;
25
25
  ariaLabel?: string;
26
26
  labelPosition?: 'left' | 'right';
27
+ testId?: string;
27
28
  }
28
29
  export declare const Toggle: Flow.AbstractComponent<ToggleProps, HTMLInputElement>;
29
30
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"Toggle.d.ts","sourceRoot":"","sources":["../../../src/components/Toggle/Toggle.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,4BAA4B,CAAC;AAMrD;;;;;GAKG;AACH,KAAK,UAAU,GAAG,QAAQ,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAC,KAAK,OAAO,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC;AAED,eAAO,MAAM,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,CAoFtE,CAAC"}
1
+ {"version":3,"file":"Toggle.d.ts","sourceRoot":"","sources":["../../../src/components/Toggle/Toggle.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,4BAA4B,CAAC;AAOrD;;;;;GAKG;AACH,KAAK,UAAU,GAAG,QAAQ,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAC,KAAK,OAAO,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,CA6FtE,CAAC"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.Toggle = void 0;
7
7
  var React = _interopRequireWildcard(require("react"));
8
8
  var _classify = _interopRequireDefault(require("../../utils/classify"));
9
+ var _qa = require("../../utils/qa");
9
10
  var _ToggleModule = _interopRequireDefault(require("./Toggle.module.css"));
10
11
  var _jsxRuntime = require("react/jsx-runtime");
11
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -29,6 +30,7 @@ const Toggle = exports.Toggle = /*#__PURE__*/React.forwardRef((_ref, forwardRef)
29
30
  onChange,
30
31
  ariaLabel,
31
32
  labelPosition = 'right',
33
+ testId,
32
34
  ...props
33
35
  } = _ref;
34
36
  const toggleInput = /*#__PURE__*/React.createRef();
@@ -51,17 +53,29 @@ const Toggle = exports.Toggle = /*#__PURE__*/React.forwardRef((_ref, forwardRef)
51
53
  }
52
54
  }, [focused]);
53
55
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
56
+ "data-testid": (0, _qa.generateTestId)({
57
+ base: testId,
58
+ slot: 'toggle'
59
+ }),
54
60
  className: (0, _classify.default)(_ToggleModule.default.container, {
55
61
  [_ToggleModule.default.disabled]: disabled
56
62
  }, classNames?.wrapper),
57
63
  onClick: onWrapClickHandler,
58
64
  children: [labelPosition === 'left' && React.Children.count(children) > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
65
+ "data-testid": (0, _qa.generateTestId)({
66
+ base: testId,
67
+ slot: 'label'
68
+ }),
59
69
  className: (0, _classify.default)(_ToggleModule.default.toggleLabel, classNames?.label),
60
70
  children: children
61
71
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
62
72
  className: _ToggleModule.default.toggleWrap,
63
73
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
64
74
  type: "checkbox",
75
+ "data-testid": (0, _qa.generateTestId)({
76
+ base: testId,
77
+ slot: 'input'
78
+ }),
65
79
  name: name,
66
80
  value: value,
67
81
  checked: checked,
@@ -76,6 +90,10 @@ const Toggle = exports.Toggle = /*#__PURE__*/React.forwardRef((_ref, forwardRef)
76
90
  })
77
91
  })]
78
92
  }), labelPosition === 'right' && React.Children.count(children) > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
93
+ "data-testid": (0, _qa.generateTestId)({
94
+ base: testId,
95
+ slot: 'label'
96
+ }),
79
97
  className: (0, _classify.default)(_ToggleModule.default.toggleLabel, classNames?.label),
80
98
  children: children
81
99
  })]
@@ -6,6 +6,7 @@ export interface TruncateProps {
6
6
  showFullTextOnHover?: boolean;
7
7
  wordBreak?: string;
8
8
  className?: string;
9
+ testId?: string;
9
10
  }
10
11
  export declare const BaseTruncate: Flow.AbstractComponent<TruncateProps, HTMLSpanElement>;
11
12
  export declare const Truncate: Flow.AbstractComponent<TruncateProps, HTMLSpanElement>;
@@ -1 +1 @@
1
- {"version":3,"file":"Truncate.d.ts","sourceRoot":"","sources":["../../../src/components/Truncate/Truncate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,4BAA4B,CAAC;AAcrD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,iBAAiB,CAC/C,aAAa,EACb,eAAe,CAqBhB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,eAAe,CA2CzE,CAAC"}
1
+ {"version":3,"file":"Truncate.d.ts","sourceRoot":"","sources":["../../../src/components/Truncate/Truncate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,4BAA4B,CAAC;AAgBrD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,iBAAiB,CAC/C,aAAa,EACb,eAAe,CAuBhB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,eAAe,CA8CzE,CAAC"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.Truncate = exports.BaseTruncate = void 0;
7
7
  var React = _interopRequireWildcard(require("react"));
8
8
  var _classify = require("../../utils/classify");
9
+ var _qa = require("../../utils/qa");
9
10
  var _TruncateModule = _interopRequireDefault(require("./Truncate.module.css"));
10
11
  var _jsxRuntime = require("react/jsx-runtime");
11
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -19,9 +20,14 @@ const BaseTruncate = exports.BaseTruncate = /*#__PURE__*/React.forwardRef((_ref,
19
20
  line = 1,
20
21
  showFullTextOnHover = false,
21
22
  wordBreak = 'break-all',
22
- className
23
+ className,
24
+ testId
23
25
  } = _ref;
24
26
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
27
+ "data-testid": (0, _qa.generateTestId)({
28
+ base: testId,
29
+ slot: 'truncate'
30
+ }),
25
31
  className: (0, _classify.classify)(_TruncateModule.default.truncateLineClamp, className),
26
32
  style: {
27
33
  '--line-clamp': line,
@@ -38,7 +44,8 @@ const Truncate = exports.Truncate = /*#__PURE__*/React.forwardRef((_ref2, ref) =
38
44
  line = 1,
39
45
  showFullTextOnHover = false,
40
46
  wordBreak = 'break-all',
41
- className: truncateClassName
47
+ className: truncateClassName,
48
+ testId
42
49
  } = _ref2;
43
50
  const arrayChildren = React.Children.toArray(children);
44
51
  if (arrayChildren.length) {
@@ -55,7 +62,8 @@ const Truncate = exports.Truncate = /*#__PURE__*/React.forwardRef((_ref2, ref) =
55
62
  '--word-break': wordBreak
56
63
  },
57
64
  title: showFullTextOnHover ? children : '',
58
- ref
65
+ ref,
66
+ testId
59
67
  });
60
68
  }
61
69
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(BaseTruncate, {
@@ -64,6 +72,7 @@ const Truncate = exports.Truncate = /*#__PURE__*/React.forwardRef((_ref2, ref) =
64
72
  ref: ref,
65
73
  wordBreak: wordBreak,
66
74
  className: truncateClassName,
75
+ testId: testId,
67
76
  children: children
68
77
  });
69
78
  }
@@ -12,4 +12,5 @@ export * from '../utils/rating';
12
12
  export * from '../utils/score-bar';
13
13
  export * from '../utils/string';
14
14
  export * from '../utils/tokens';
15
+ export * from '../utils/qa';
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kCAAkC,CAAC;AACjD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kCAAkC,CAAC;AACjD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC"}
@@ -156,4 +156,15 @@ Object.keys(_tokens).forEach(function (key) {
156
156
  return _tokens[key];
157
157
  }
158
158
  });
159
+ });
160
+ var _qa = require("./qa");
161
+ Object.keys(_qa).forEach(function (key) {
162
+ if (key === "default" || key === "__esModule") return;
163
+ if (key in exports && exports[key] === _qa[key]) return;
164
+ Object.defineProperty(exports, key, {
165
+ enumerable: true,
166
+ get: function () {
167
+ return _qa[key];
168
+ }
169
+ });
159
170
  });
@@ -0,0 +1,2 @@
1
+ export * from '../../utils/qa/qa';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/qa/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _qa = require("./qa");
7
+ Object.keys(_qa).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _qa[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _qa[key];
14
+ }
15
+ });
16
+ });
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Generate a stable `data-testid` string.
3
+ *
4
+ * Format:
5
+ * <base>[__<slot>][--<index>][--<modifierA>--<modifierB>...]
6
+ *
7
+ * Examples:
8
+ * generateTestId({ base: "profile__email", slot: "input" })
9
+ * // "profile__email__input"
10
+ *
11
+ * generateTestId({ base: "users", slot: "item", index: "u-100" })
12
+ * // "users__item--u-100"
13
+ *
14
+ * generateTestId({ base: "filters", slot: "chip", modifiers: ["selected", "lg"] })
15
+ * // "filters__chip--selected--lg"
16
+ *
17
+ * Guidance:
18
+ * - Keep `base` stable and human-readable (don’t derive from user text or use UUIDs).
19
+ * - For repeated items, prefer stable business keys for `index` (e.g., `user.id`).
20
+ * - Use `modifiers` to encode state/variants cleanly in selectors.
21
+ */
22
+ export interface GenerateTestIdParams {
23
+ base?: string;
24
+ slot?: string;
25
+ index?: number | string;
26
+ modifiers?: ReadonlyArray<string | number | boolean | null | undefined>;
27
+ }
28
+ /** Returns the composed id, or `undefined` if `base` is missing. */
29
+ export declare function generateTestId(params: GenerateTestIdParams): string | undefined;
30
+ //# sourceMappingURL=qa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qa.d.ts","sourceRoot":"","sources":["../../../src/utils/qa/qa.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACzE;AAKD,oEAAoE;AACpE,wBAAgB,cAAc,CAC5B,MAAM,EAAE,oBAAoB,GAC3B,MAAM,GAAG,SAAS,CAsBpB"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.generateTestId = generateTestId;
7
+ /**
8
+ * Generate a stable `data-testid` string.
9
+ *
10
+ * Format:
11
+ * <base>[__<slot>][--<index>][--<modifierA>--<modifierB>...]
12
+ *
13
+ * Examples:
14
+ * generateTestId({ base: "profile__email", slot: "input" })
15
+ * // "profile__email__input"
16
+ *
17
+ * generateTestId({ base: "users", slot: "item", index: "u-100" })
18
+ * // "users__item--u-100"
19
+ *
20
+ * generateTestId({ base: "filters", slot: "chip", modifiers: ["selected", "lg"] })
21
+ * // "filters__chip--selected--lg"
22
+ *
23
+ * Guidance:
24
+ * - Keep `base` stable and human-readable (don’t derive from user text or use UUIDs).
25
+ * - For repeated items, prefer stable business keys for `index` (e.g., `user.id`).
26
+ * - Use `modifiers` to encode state/variants cleanly in selectors.
27
+ */
28
+
29
+ const SLOT_SEP = '__';
30
+ const MOD_SEP = '--';
31
+
32
+ /** Returns the composed id, or `undefined` if `base` is missing. */
33
+ function generateTestId(params) {
34
+ const {
35
+ base,
36
+ slot,
37
+ index,
38
+ modifiers = []
39
+ } = params;
40
+ if (!base) {
41
+ return undefined;
42
+ }
43
+ let id = slot ? `${base}${SLOT_SEP}${slot}` : base;
44
+ if (typeof index !== 'undefined') {
45
+ id += `${MOD_SEP}${String(index)}`;
46
+ }
47
+ const mods = modifiers.filter(m => Boolean(m)).map(String);
48
+ if (mods.length > 0) {
49
+ id += `${MOD_SEP}${mods.join(MOD_SEP)}`;
50
+ }
51
+ return id;
52
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spaced-out/ui-design-system",
3
- "version": "0.5.9",
3
+ "version": "0.5.11",
4
4
  "description": "Sense UI components library",
5
5
  "author": {
6
6
  "name": "Spaced Out"
@@ -143,6 +143,7 @@
143
143
  "husky": "2.1.0",
144
144
  "invariant": "^2.2.4",
145
145
  "jest": "^29.3.1",
146
+ "jscodeshift": "^17.3.0",
146
147
  "lint-staged": "^10.5.1",
147
148
  "paths.macro": "^3.0.1",
148
149
  "prettier": "^2.5.1",