@redocly/theme 0.18.0 → 0.18.2

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.
@@ -45,7 +45,7 @@ const Dropdown = ({ children, className, items, withArrow, triggerEvent = 'click
45
45
  onChange === null || onChange === void 0 ? void 0 : onChange(value);
46
46
  };
47
47
  (0, hooks_1.useOutsideClick)(dropdownRef, handleClose);
48
- return (react_1.default.createElement(DropdownContainer, Object.assign({}, dataAttributes, { "data-testId": "dropdown", className: className, ref: dropdownRef, onPointerEnter: triggerEvent === 'hover' ? handleOpen : undefined, onPointerLeave: handleClose, onClick: triggerEvent === 'click' ? handleToggle : undefined }),
48
+ return (react_1.default.createElement(DropdownContainer, Object.assign({}, dataAttributes, { "data-testid": "dropdown", className: className, ref: dropdownRef, onPointerEnter: triggerEvent === 'hover' ? handleOpen : undefined, onPointerLeave: handleClose, onClick: triggerEvent === 'click' ? handleToggle : undefined }),
49
49
  react_1.default.createElement(exports.DropdownHeader, null,
50
50
  children,
51
51
  withArrow ? isOpen ? react_1.default.createElement(icons_1.ArrowIcon, { direction: "up" }) : react_1.default.createElement(icons_1.ArrowIcon, { direction: "down" }) : null),
@@ -35,6 +35,7 @@ const SearchTrigger_1 = require("../../components/Search/SearchTrigger");
35
35
  const MobileSearchTrigger_1 = require("../../components/Search/MobileSearchTrigger");
36
36
  const SearchDialog_1 = require("../../components/Search/SearchDialog");
37
37
  const hooks_1 = require("../../hooks");
38
+ const telemetry_1 = require("../../mocks/telemetry");
38
39
  function Search({ className }) {
39
40
  var _a, _b;
40
41
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
@@ -46,6 +47,7 @@ function Search({ className }) {
46
47
  if (hotkeysKeys) {
47
48
  (0, hotkeys_js_1.default)(hotkeysKeys, (ev) => {
48
49
  setIsOpen(true);
50
+ telemetry_1.telemetry.send('search_opened', { method: 'shortcut' });
49
51
  ev.preventDefault();
50
52
  });
51
53
  return () => hotkeys_js_1.default.unbind(hotkeysKeys);
@@ -56,8 +58,14 @@ function Search({ className }) {
56
58
  }, []);
57
59
  (0, react_1.useEffect)(onClose, [location, onClose]);
58
60
  return (react_1.default.createElement(Wrapper, { "data-component-name": "Search/Search", className: className },
59
- react_1.default.createElement(SearchTrigger_1.SearchTrigger, { onClick: () => setIsOpen(true) }),
60
- react_1.default.createElement(MobileSearchTrigger_1.MobileSearchTrigger, { onClick: () => setIsOpen(true) }),
61
+ react_1.default.createElement(SearchTrigger_1.SearchTrigger, { onClick: () => {
62
+ telemetry_1.telemetry.send('search_opened', { method: 'click' });
63
+ setIsOpen(true);
64
+ } }),
65
+ react_1.default.createElement(MobileSearchTrigger_1.MobileSearchTrigger, { onClick: () => {
66
+ telemetry_1.telemetry.send('search_opened', { method: 'click' });
67
+ setIsOpen(true);
68
+ } }),
61
69
  isOpen && react_1.default.createElement(SearchDialog_1.SearchDialog, { onClose: onClose })));
62
70
  }
63
71
  exports.Search = Search;
@@ -54,7 +54,7 @@ const Select = ({ className, selected, options, dataAttributes, withArrow, trigg
54
54
  handleSelect(selected);
55
55
  // eslint-disable-next-line react-hooks/exhaustive-deps
56
56
  }, [selected]);
57
- return (react_1.default.createElement(exports.SelectContainer, Object.assign({}, dataAttributes, { "data-testId": "select", className: className, ref: selectRef, onPointerEnter: triggerEvent === 'hover' ? handleOpen : undefined, onPointerLeave: triggerEvent === 'hover' ? handleClose : undefined, onClick: triggerEvent === 'click' ? handleToggle : undefined }),
57
+ return (react_1.default.createElement(exports.SelectContainer, Object.assign({}, dataAttributes, { "data-testid": "select", className: className, ref: selectRef, onPointerEnter: triggerEvent === 'hover' ? handleOpen : undefined, onPointerLeave: triggerEvent === 'hover' ? handleClose : undefined, onClick: triggerEvent === 'click' ? handleToggle : undefined }),
58
58
  react_1.default.createElement(exports.SelectInput, null,
59
59
  react_1.default.createElement(exports.SelectInputValue, { withArrow: withArrow }, _selected),
60
60
  withArrow ? isOpen ? react_1.default.createElement(icons_1.ArrowIcon, { direction: "up" }) : react_1.default.createElement(icons_1.ArrowIcon, { direction: "down" }) : null),
@@ -2,6 +2,7 @@ import type { PropsWithChildren } from 'react';
2
2
  type Child = {
3
3
  props: {
4
4
  label: string;
5
+ key?: string;
5
6
  } & TabsProps;
6
7
  };
7
8
  type TabsProps = PropsWithChildren<{
@@ -36,9 +36,9 @@ function Tabs(props) {
36
36
  const [activeTab, setActiveTab] = (0, react_1.useState)((_a = children[0]) === null || _a === void 0 ? void 0 : _a.props.label);
37
37
  const onTabSelect = (label) => setActiveTab(label);
38
38
  return (react_1.default.createElement(TabsContainer, { "data-component-name": "Markdown/Tabs/Tabs", className: props.className },
39
- react_1.default.createElement(TabList, null, children.map((child) => {
40
- const { label } = child.props;
41
- return react_1.default.createElement(Tabs_1.Tab, { activeTab: activeTab, key: label, label: label, onClick: onTabSelect });
39
+ react_1.default.createElement(TabList, null, children.map((child, idx) => {
40
+ const { label, key } = child.props;
41
+ return (react_1.default.createElement(Tabs_1.Tab, { activeTab: activeTab, key: `${key || label}-${idx}`, label: label, onClick: onTabSelect }));
42
42
  })),
43
43
  react_1.default.createElement(TabContent, null, children.map((child) => {
44
44
  if (child.props.label !== activeTab)
package/lib/config.d.ts CHANGED
@@ -352,6 +352,10 @@ declare const scorecardConfigSchema: {
352
352
  readonly additionalProperties: true;
353
353
  readonly required: readonly ["levels"];
354
354
  readonly properties: {
355
+ readonly failBuildIfBelowMinimum: {
356
+ readonly type: "boolean";
357
+ readonly default: false;
358
+ };
355
359
  readonly levels: {
356
360
  readonly type: "array";
357
361
  readonly items: {
@@ -1829,6 +1833,10 @@ export declare const themeConfigSchema: {
1829
1833
  readonly additionalProperties: true;
1830
1834
  readonly required: readonly ["levels"];
1831
1835
  readonly properties: {
1836
+ readonly failBuildIfBelowMinimum: {
1837
+ readonly type: "boolean";
1838
+ readonly default: false;
1839
+ };
1832
1840
  readonly levels: {
1833
1841
  readonly type: "array";
1834
1842
  readonly items: {
package/lib/config.js CHANGED
@@ -278,6 +278,7 @@ const scorecardConfigSchema = {
278
278
  additionalProperties: true,
279
279
  required: ['levels'],
280
280
  properties: {
281
+ failBuildIfBelowMinimum: { type: 'boolean', default: false },
281
282
  levels: {
282
283
  type: 'array',
283
284
  items: {
@@ -0,0 +1,2 @@
1
+ import type { ClientTelemetry } from '@redocly/portal-types';
2
+ export declare const telemetry: ClientTelemetry;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.telemetry = void 0;
4
+ exports.telemetry = {
5
+ send: () => undefined,
6
+ };
7
+ //# sourceMappingURL=telemetry.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/theme",
3
- "version": "0.18.0",
3
+ "version": "0.18.2",
4
4
  "description": "Shared UI components lib",
5
5
  "keywords": [
6
6
  "theme",
@@ -80,7 +80,8 @@
80
80
  "tsconfig-paths": "^4.2.0",
81
81
  "tsconfig-paths-webpack-plugin": "^3.5.2",
82
82
  "typescript": "^4.8.4",
83
- "webpack": "^5.72.0"
83
+ "webpack": "^5.72.0",
84
+ "@redocly/portal-types": "1.0.1"
84
85
  },
85
86
  "dependencies": {
86
87
  "@redocly/ajv": "^8.11.0",
@@ -49,7 +49,7 @@ export const Dropdown = ({
49
49
  return (
50
50
  <DropdownContainer
51
51
  {...dataAttributes}
52
- data-testId="dropdown"
52
+ data-testid="dropdown"
53
53
  className={className}
54
54
  ref={dropdownRef}
55
55
  onPointerEnter={triggerEvent === 'hover' ? handleOpen : undefined}
@@ -7,6 +7,7 @@ import { SearchTrigger } from '@theme/components/Search/SearchTrigger';
7
7
  import { MobileSearchTrigger } from '@theme/components/Search/MobileSearchTrigger';
8
8
  import { SearchDialog } from '@theme/components/Search/SearchDialog';
9
9
  import { useThemeConfig } from '@theme/hooks';
10
+ import { telemetry } from '@portal/telemetry';
10
11
 
11
12
  export function Search({ className }: { className?: string }): JSX.Element {
12
13
  const [isOpen, setIsOpen] = useState(false);
@@ -19,6 +20,7 @@ export function Search({ className }: { className?: string }): JSX.Element {
19
20
  if (hotkeysKeys) {
20
21
  hotkeys(hotkeysKeys, (ev) => {
21
22
  setIsOpen(true);
23
+ telemetry.send('search_opened', { method: 'shortcut' });
22
24
  ev.preventDefault();
23
25
  });
24
26
 
@@ -34,8 +36,18 @@ export function Search({ className }: { className?: string }): JSX.Element {
34
36
 
35
37
  return (
36
38
  <Wrapper data-component-name="Search/Search" className={className}>
37
- <SearchTrigger onClick={() => setIsOpen(true)} />
38
- <MobileSearchTrigger onClick={() => setIsOpen(true)} />
39
+ <SearchTrigger
40
+ onClick={() => {
41
+ telemetry.send('search_opened', { method: 'click' });
42
+ setIsOpen(true);
43
+ }}
44
+ />
45
+ <MobileSearchTrigger
46
+ onClick={() => {
47
+ telemetry.send('search_opened', { method: 'click' });
48
+ setIsOpen(true);
49
+ }}
50
+ />
39
51
 
40
52
  {isOpen && <SearchDialog onClose={onClose} />}
41
53
  </Wrapper>
@@ -56,7 +56,7 @@ export const Select = ({
56
56
  return (
57
57
  <SelectContainer
58
58
  {...dataAttributes}
59
- data-testId="select"
59
+ data-testid="select"
60
60
  className={className}
61
61
  ref={selectRef}
62
62
  onPointerEnter={triggerEvent === 'hover' ? handleOpen : undefined}
@@ -5,7 +5,7 @@ import type { PropsWithChildren } from 'react';
5
5
 
6
6
  import { Tab } from '@theme/components/Tabs';
7
7
 
8
- type Child = { props: { label: string } & TabsProps };
8
+ type Child = { props: { label: string; key?: string } & TabsProps };
9
9
  type TabsProps = PropsWithChildren<{ children: Child[]; className?: string }>;
10
10
 
11
11
  export function Tabs(props: TabsProps): JSX.Element {
@@ -16,9 +16,16 @@ export function Tabs(props: TabsProps): JSX.Element {
16
16
  return (
17
17
  <TabsContainer data-component-name="Markdown/Tabs/Tabs" className={props.className}>
18
18
  <TabList>
19
- {children.map((child) => {
20
- const { label } = child.props;
21
- return <Tab activeTab={activeTab} key={label} label={label} onClick={onTabSelect} />;
19
+ {children.map((child, idx) => {
20
+ const { label, key } = child.props;
21
+ return (
22
+ <Tab
23
+ activeTab={activeTab}
24
+ key={`${key || label}-${idx}`}
25
+ label={label}
26
+ onClick={onTabSelect}
27
+ />
28
+ );
22
29
  })}
23
30
  </TabList>
24
31
  <TabContent>
package/src/config.ts CHANGED
@@ -318,6 +318,7 @@ const scorecardConfigSchema = {
318
318
  additionalProperties: true,
319
319
  required: ['levels'],
320
320
  properties: {
321
+ failBuildIfBelowMinimum: { type: 'boolean', default: false },
321
322
  levels: {
322
323
  type: 'array',
323
324
  items: {
@@ -0,0 +1,5 @@
1
+ import type { ClientTelemetry } from '@redocly/portal-types';
2
+
3
+ export const telemetry = {
4
+ send: () => undefined,
5
+ } as unknown as ClientTelemetry;