@weavix/tracker-components 0.1.0 → 0.1.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.
Files changed (48) hide show
  1. package/README.md +191 -19
  2. package/build/cjs/components/Icon/EntityIcon/EntityIcon.js +2 -3
  3. package/build/cjs/components/Icon/EntityIcon/EntityIcon.js.map +1 -1
  4. package/build/cjs/components/Icon/GoalIcon/README.md +123 -0
  5. package/build/cjs/components/Icon/IconRefuge/IconRefuge.classname.js.map +1 -1
  6. package/build/cjs/components/Icon/IconRefuge/IconRefuge.css +0 -3
  7. package/build/cjs/components/Icon/IconRefuge/IconRefuge.css.map +1 -1
  8. package/build/cjs/components/Icon/IssueTypeIcon/IssueTypeIcon.js +30 -50
  9. package/build/cjs/components/Icon/IssueTypeIcon/IssueTypeIcon.js.map +1 -1
  10. package/build/cjs/components/Icon/IssueTypeIcon/README.md +146 -22
  11. package/build/cjs/components/Icon/KeyResultIcon/README.md +73 -0
  12. package/build/cjs/components/Icon/MetaEntityIcon/README.md +136 -0
  13. package/build/cjs/components/Icon/PortfolioIcon/PortfolioIcon.d.ts +4 -1
  14. package/build/cjs/components/Icon/PortfolioIcon/PortfolioIcon.js +1 -0
  15. package/build/cjs/components/Icon/PortfolioIcon/PortfolioIcon.js.map +1 -1
  16. package/build/cjs/components/Icon/PortfolioIcon/README.md +94 -9
  17. package/build/cjs/components/Icon/ProjectIcon/README.md +133 -9
  18. package/build/cjs/components/MetaEntitiesSelect/README.md +10 -0
  19. package/build/cjs/components/PluginFieldsSelect/README.md +18 -0
  20. package/build/cjs/components/QueueSelect/README.md +10 -0
  21. package/build/cjs/components/TrackerDisclosure/README.md +205 -0
  22. package/build/esm/components/Icon/EntityIcon/EntityIcon.js +2 -3
  23. package/build/esm/components/Icon/EntityIcon/EntityIcon.js.map +1 -1
  24. package/build/esm/components/Icon/GoalIcon/README.md +123 -0
  25. package/build/esm/components/Icon/IconRefuge/IconRefuge.classname.js.map +1 -1
  26. package/build/esm/components/Icon/IconRefuge/IconRefuge.css +0 -3
  27. package/build/esm/components/Icon/IconRefuge/IconRefuge.css.map +1 -1
  28. package/build/esm/components/Icon/IconRefuge/IconRefuge.scss +0 -4
  29. package/build/esm/components/Icon/IssueTypeIcon/IssueTypeIcon.js +30 -50
  30. package/build/esm/components/Icon/IssueTypeIcon/IssueTypeIcon.js.map +1 -1
  31. package/build/esm/components/Icon/IssueTypeIcon/README.md +146 -22
  32. package/build/esm/components/Icon/KeyResultIcon/README.md +73 -0
  33. package/build/esm/components/Icon/MetaEntityIcon/README.md +136 -0
  34. package/build/esm/components/Icon/PortfolioIcon/PortfolioIcon.d.ts +4 -1
  35. package/build/esm/components/Icon/PortfolioIcon/PortfolioIcon.js +1 -0
  36. package/build/esm/components/Icon/PortfolioIcon/PortfolioIcon.js.map +1 -1
  37. package/build/esm/components/Icon/PortfolioIcon/README.md +94 -9
  38. package/build/esm/components/Icon/ProjectIcon/README.md +133 -9
  39. package/build/esm/components/MetaEntitiesSelect/README.md +10 -0
  40. package/build/esm/components/PluginFieldsSelect/README.md +18 -0
  41. package/build/esm/components/QueueSelect/README.md +10 -0
  42. package/build/esm/components/TrackerDisclosure/README.md +205 -0
  43. package/package.json +1 -1
  44. package/build/cjs/components/Icon/Icon.css +0 -33
  45. package/build/cjs/components/Icon/Icon.css.map +0 -1
  46. package/build/esm/components/Icon/Icon.css +0 -33
  47. package/build/esm/components/Icon/Icon.css.map +0 -1
  48. package/build/esm/components/Icon/Icon.scss +0 -46
package/README.md CHANGED
@@ -1,45 +1,217 @@
1
1
  # @weavix/tracker-components
2
2
 
3
+ Shared UI component library for **Yandex Tracker plugins**. Provides ready-made React components for selecting queues, fields, and meta entities (projects, portfolios, goals), displaying issue-type and entity icons, and building collapsible sections — all styled to match the Tracker design system.
4
+
5
+ ---
6
+
3
7
  ## Installation
4
8
 
5
9
  ```bash
6
10
  pnpm add @weavix/tracker-components
7
11
  ```
8
12
 
9
- Peer-зависимости:
13
+ ### Peer dependencies
14
+
15
+ | Package | Version |
16
+ |---|---|
17
+ | `react`, `react-dom` | `^18` |
18
+ | `@gravity-ui/uikit` | `^7` |
19
+ | `@gravity-ui/icons` | `^2` |
20
+
21
+ ---
22
+
23
+ ## Component catalogue
24
+
25
+ ### Select components
26
+
27
+ | Component | Description | README |
28
+ |---|---|---|
29
+ | [`QueueSelect`](#queueselect) | Dropdown for choosing a Tracker queue. Supports static lists, async suggest, icons, loading states, and confirmation dialogs. | [→ README](src/components/QueueSelect/README.md) |
30
+ | [`MetaEntitiesSelect`](#metaentitiesselect) | Suggest-based select for projects, portfolios, goals, or reports. Async item fetching, loading states, error display, clear button. | [→ README](src/components/MetaEntitiesSelect/README.md) |
31
+ | [`PluginFieldsSelect`](#pluginfieldsselect) | Dropdown for choosing Tracker fields inside a plugin. Auto-groups fields by category, supports search, multi-select, submit/reset, loading states. | [→ README](src/components/PluginFieldsSelect/README.md) |
32
+
33
+ ### Icon components
34
+
35
+ | Component | Description | README |
36
+ |---|---|---|
37
+ | [`IssueTypeIcon`](#issuetypeicon) | Icon for a Tracker issue type (task, bug, epic, …). | [→ README](src/components/Icon/IssueTypeIcon/README.md) |
38
+ | [`MetaEntityIcon`](#metaentityicon) | Dispatcher icon that renders the correct icon for any meta entity type (project, portfolio, goal, key result). | [→ README](src/components/Icon/MetaEntityIcon/README.md) |
39
+ | [`ProjectIcon`](#projecticon) | Colored icon for a project entity. Color is deterministically derived from the project ID. | [→ README](src/components/Icon/ProjectIcon/README.md) |
40
+ | [`PortfolioIcon`](#portfolioicon) | Colored icon for a portfolio entity. Color is deterministically derived from the portfolio ID. | [→ README](src/components/Icon/PortfolioIcon/README.md) |
41
+ | [`GoalIcon`](#goalicon) | Colored icon for a goal entity. Color is deterministically derived from the goal ID. | [→ README](src/components/Icon/GoalIcon/README.md) |
42
+ | [`KeyResultIcon`](#keyresulticon) | Icon for a key result entity, with a built-in tooltip. | [→ README](src/components/Icon/KeyResultIcon/README.md) |
43
+
44
+ ### Layout components
45
+
46
+ | Component | Description | README |
47
+ |---|---|---|
48
+ | [`TrackerDisclosure`](#trackerdisclosure) | Collapsible section with Tracker-specific styling. Extends Gravity UI `Disclosure` with configurable arrow position, size, and an optional toolbar slot. | [→ README](src/components/TrackerDisclosure/README.md) |
49
+
50
+ ---
51
+
52
+ ## Quick start
53
+
54
+ ### QueueSelect
55
+
56
+ ```tsx
57
+ import {QueueSelect} from '@weavix/tracker-components';
58
+ import type {QueueInfo} from '@weavix/tracker-components';
59
+
60
+ const queues: QueueInfo[] = [
61
+ {key: 'DEV', display: 'Development'},
62
+ {key: 'DESIGN', display: 'Design'},
63
+ ];
64
+
65
+ <QueueSelect
66
+ queues={queues}
67
+ defaultQueue={queues[0]}
68
+ onChange={(queue) => console.log(queue)}
69
+ />;
70
+ ```
71
+
72
+ → Full documentation including async suggest and Tracker API integration: [src/components/QueueSelect/README.md](src/components/QueueSelect/README.md)
73
+
74
+ ---
75
+
76
+ ### MetaEntitiesSelect
77
+
78
+ ```tsx
79
+ import {MetaEntitiesSelect} from '@weavix/tracker-components';
80
+
81
+ <MetaEntitiesSelect
82
+ getItems={(text) => fetchProjects(text)}
83
+ onChange={(entity) => console.log('selected', entity)}
84
+ />;
85
+ ```
86
+
87
+ → Full documentation including Tracker API integration: [src/components/MetaEntitiesSelect/README.md](src/components/MetaEntitiesSelect/README.md)
88
+
89
+ ---
90
+
91
+ ### PluginFieldsSelect
92
+
93
+ ```tsx
94
+ import {PluginFieldsSelect} from '@weavix/tracker-components';
95
+ import type {PluginFieldsSelectField} from '@weavix/tracker-components';
96
+
97
+ const fields: PluginFieldsSelectField[] = [
98
+ {id: 'summary', name: 'Summary', category: {id: '1', display: 'System Fields'}},
99
+ {id: 'sprint', name: 'Sprint', category: {id: '2', display: 'Custom Fields'}},
100
+ ];
101
+
102
+ <PluginFieldsSelect
103
+ open={true}
104
+ fields={fields}
105
+ onOpenChange={setOpen}
106
+ onItemSelect={(item) => console.log('selected', item)}
107
+ onItemDeselect={(item) => console.log('deselected', item)}
108
+ />;
109
+ ```
110
+
111
+ → Full documentation including 3 Tracker API fetch flows: [src/components/PluginFieldsSelect/README.md](src/components/PluginFieldsSelect/README.md)
112
+
113
+ ---
114
+
115
+ ### IssueTypeIcon
116
+
117
+ ```tsx
118
+ import {IssueTypeIcon} from '@weavix/tracker-components';
119
+
120
+ <IssueTypeIcon issueType="bug" />
121
+ <IssueTypeIcon issueType="epic" size={24} />
122
+ ```
123
+
124
+ → Full documentation: [src/components/Icon/IssueTypeIcon/README.md](src/components/Icon/IssueTypeIcon/README.md)
125
+
126
+ ---
127
+
128
+ ### MetaEntityIcon
129
+
130
+ ```tsx
131
+ import {MetaEntityIcon} from '@weavix/tracker-components';
132
+
133
+ // Automatically renders the correct icon based on entityType
134
+ <MetaEntityIcon entity={{entityType: 'project', id: 'proj-1', shortId: 42}} />
135
+ <MetaEntityIcon entity={{entityType: 'portfolio', id: 'port-1', shortId: 7}} size={24} />
136
+ ```
137
+
138
+ → Full documentation: [src/components/Icon/MetaEntityIcon/README.md](src/components/Icon/MetaEntityIcon/README.md)
139
+
140
+ ---
141
+
142
+ ### ProjectIcon / PortfolioIcon / GoalIcon
143
+
144
+ ```tsx
145
+ import {ProjectIcon, PortfolioIcon, GoalIcon} from '@weavix/tracker-components';
146
+
147
+ <ProjectIcon projectId={123} />
148
+ <PortfolioIcon portfolioId="portfolio-abc" />
149
+ <GoalIcon goalId={456} />
150
+ ```
151
+
152
+ → [ProjectIcon README](src/components/Icon/ProjectIcon/README.md) · [PortfolioIcon README](src/components/Icon/PortfolioIcon/README.md) · [GoalIcon README](src/components/Icon/GoalIcon/README.md)
153
+
154
+ ---
155
+
156
+ ### KeyResultIcon
157
+
158
+ ```tsx
159
+ import {KeyResultIcon} from '@weavix/tracker-components';
160
+
161
+ <KeyResultIcon size={16} />
162
+ ```
163
+
164
+ → Full documentation: [src/components/Icon/KeyResultIcon/README.md](src/components/Icon/KeyResultIcon/README.md)
10
165
 
11
- - `react`, `react-dom` ^18
12
- - `@gravity-ui/uikit` ^7
13
- - `@gravity-ui/icons` ^2
166
+ ---
14
167
 
15
- ## Usage
168
+ ### TrackerDisclosure
16
169
 
17
170
  ```tsx
18
- import {Hello} from '@weavix/tracker-components';
171
+ import {TrackerDisclosure} from '@weavix/tracker-components';
19
172
 
20
- <Hello name="Tracker" />;
173
+ <TrackerDisclosure summary="Section title" defaultExpanded>
174
+ Content goes here
175
+ </TrackerDisclosure>
21
176
  ```
22
177
 
178
+ → Full documentation: [src/components/TrackerDisclosure/README.md](src/components/TrackerDisclosure/README.md)
179
+
180
+ ---
181
+
182
+ ## Architecture notes
183
+
184
+ ### Data-agnostic pattern
185
+
186
+ All select components (`QueueSelect`, `MetaEntitiesSelect`, `PluginFieldsSelect`) are **data-agnostic**: they accept data via props and callbacks. You are responsible for fetching data from the Tracker API and passing it to the component. This keeps the components reusable and testable without a live API.
187
+
188
+ ### Tracker API integration
189
+
190
+ Each select component's README contains a dedicated **Tracker API** section with:
191
+ - The exact API endpoints to call
192
+ - Ready-to-copy fetch functions
193
+ - Complete working examples
194
+
195
+ ### Styling
196
+
197
+ Components use [Gravity UI](https://gravity-ui.com/) design tokens and BEM class names. Import the component CSS by ensuring your bundler processes `.scss` files from this package (the package declares `sideEffects: ["*.scss"]`).
198
+
199
+ ---
200
+
23
201
  ## Development
24
202
 
25
203
  ```bash
26
204
  pnpm install
27
- pnpm run build
28
- pnpm run typecheck
29
- pnpm run lint
30
- pnpm run test
205
+ pnpm run build # compile to build/
206
+ pnpm run typecheck # TypeScript type check
207
+ pnpm run lint # ESLint + Stylelint + Prettier
208
+ pnpm run test # Jest unit tests
31
209
  ```
32
210
 
33
211
  ### Storybook
34
212
 
35
- Для запуска Storybook-сервера:
36
-
37
213
  ```bash
38
- pnpm run storybook
214
+ pnpm run storybook # starts at http://localhost:7008
39
215
  ```
40
216
 
41
- Storybook запустится по адресу `http://localhost:7008` для просмотра и взаимодействия с историями компонентов.
42
-
43
- To build a static version of Storybook:
44
-
45
- Истории компонентов находятся в директориях `__stories__` в папках компонентов.
217
+ Component stories live in `__stories__/` directories inside each component folder.
@@ -15,8 +15,7 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
15
15
  var EntityIcon = exports.EntityIcon = /*#__PURE__*/(0, _react.memo)(function (_ref) {
16
16
  var data = _ref.data,
17
17
  className = _ref.className,
18
- _ref$id = _ref.id,
19
- id = _ref$id === void 0 ? ' ' : _ref$id,
18
+ id = _ref.id,
20
19
  type = _ref.type,
21
20
  _ref$refugeSize = _ref.refugeSize,
22
21
  refugeSize = _ref$refugeSize === void 0 ? 24 : _ref$refugeSize,
@@ -32,7 +31,7 @@ var EntityIcon = exports.EntityIcon = /*#__PURE__*/(0, _react.memo)(function (_r
32
31
  colorAlpha = _ref$colorAlpha === void 0 ? 1 : _ref$colorAlpha;
33
32
  var theme = (0, _uikit.useThemeType)();
34
33
  var randomColor = (0, _uikit.useColorGenerator)({
35
- seed: String(id),
34
+ seed: id !== undefined ? String(id) : ' ',
36
35
  theme: theme
37
36
  });
38
37
  var color = "rgba(".concat(randomColor.rgb.r, ",").concat(randomColor.rgb.g, ",").concat(randomColor.rgb.b, ",").concat(colorAlpha, ")");
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_uikit","_IconRefuge","_EntityIcon","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","EntityIcon","exports","memo","_ref","data","className","_ref$id","id","type","_ref$refugeSize","refugeSize","_ref$size","size","_ref$alpha","alpha","_ref$withBackground","withBackground","_ref$radius","radius","_ref$colorAlpha","colorAlpha","theme","useThemeType","randomColor","useColorGenerator","seed","String","color","concat","rgb","g","b","backgroundColor","containerStyle","background","_jsx","IconRefuge","containerClassName","cnEntityIcon","displayName"],"sources":["EntityIcon.tsx"],"sourcesContent":["import type {FC} from 'react';\nimport React, {memo} from 'react';\n\nimport {type IconData, useColorGenerator, useThemeType} from '@gravity-ui/uikit';\n\nimport {IconRefuge} from '../IconRefuge';\n\nimport {cnEntityIcon} from './EntityIcon.classname';\n\nimport './EntityIcon.scss';\n\nexport type EntityIconProps = {\n data: IconData;\n className?: string;\n id?: number | string;\n type?: string;\n refugeSize?: number;\n size?: number;\n alpha?: number;\n withBackground?: boolean;\n radius?: 'm' | 'l';\n colorAlpha?: number;\n};\n\nexport const EntityIcon: FC<EntityIconProps> = memo(\n ({\n data,\n className,\n id = ' ',\n type,\n refugeSize = 24,\n size = 16,\n alpha = 0.15,\n withBackground = true,\n radius = 'm',\n colorAlpha = 1,\n }) => {\n const theme = useThemeType();\n\n const randomColor = useColorGenerator({seed: String(id), theme});\n\n const color = `rgba(${randomColor.rgb.r},${randomColor.rgb.g},${randomColor.rgb.b},${colorAlpha})`;\n const backgroundColor = `rgba(${randomColor.rgb.r},${randomColor.rgb.g},${randomColor.rgb.b},${alpha})`;\n\n const containerStyle: {\n background?: string;\n color?: string;\n } = {};\n\n if (withBackground) {\n containerStyle.background = backgroundColor;\n containerStyle.color = color;\n } else {\n containerStyle.color = backgroundColor;\n }\n\n return (\n <IconRefuge\n data={data}\n containerClassName={cnEntityIcon({type, radius}, className)}\n refugeSize={refugeSize}\n size={size}\n containerStyle={containerStyle}\n />\n );\n },\n);\n\nEntityIcon.displayName = 'EntityIcon';\n"],"mappings":";;;;;;;AACA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AAEA,IAAAE,WAAA,GAAAF,OAAA;AAEA,IAAAG,WAAA,GAAAH,OAAA;AAEAA,OAAA;AAA2B,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAD,wBAAAM,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAR,uBAAA,YAAAA,CAAAM,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAepB,IAAMkB,UAA+B,GAAAC,OAAA,CAAAD,UAAA,gBAAG,IAAAE,WAAI,EAC/C,UAAAC,IAAA,EAWM;EAAA,IAVFC,IAAI,GAAAD,IAAA,CAAJC,IAAI;IACJC,SAAS,GAAAF,IAAA,CAATE,SAAS;IAAAC,OAAA,GAAAH,IAAA,CACTI,EAAE;IAAFA,EAAE,GAAAD,OAAA,cAAG,GAAG,GAAAA,OAAA;IACRE,IAAI,GAAAL,IAAA,CAAJK,IAAI;IAAAC,eAAA,GAAAN,IAAA,CACJO,UAAU;IAAVA,UAAU,GAAAD,eAAA,cAAG,EAAE,GAAAA,eAAA;IAAAE,SAAA,GAAAR,IAAA,CACfS,IAAI;IAAJA,IAAI,GAAAD,SAAA,cAAG,EAAE,GAAAA,SAAA;IAAAE,UAAA,GAAAV,IAAA,CACTW,KAAK;IAALA,KAAK,GAAAD,UAAA,cAAG,IAAI,GAAAA,UAAA;IAAAE,mBAAA,GAAAZ,IAAA,CACZa,cAAc;IAAdA,cAAc,GAAAD,mBAAA,cAAG,IAAI,GAAAA,mBAAA;IAAAE,WAAA,GAAAd,IAAA,CACrBe,MAAM;IAANA,MAAM,GAAAD,WAAA,cAAG,GAAG,GAAAA,WAAA;IAAAE,eAAA,GAAAhB,IAAA,CACZiB,UAAU;IAAVA,UAAU,GAAAD,eAAA,cAAG,CAAC,GAAAA,eAAA;EAEd,IAAME,KAAK,GAAG,IAAAC,mBAAY,EAAC,CAAC;EAE5B,IAAMC,WAAW,GAAG,IAAAC,wBAAiB,EAAC;IAACC,IAAI,EAAEC,MAAM,CAACnB,EAAE,CAAC;IAAEc,KAAK,EAALA;EAAK,CAAC,CAAC;EAEhE,IAAMM,KAAK,WAAAC,MAAA,CAAWL,WAAW,CAACM,GAAG,CAAC7C,CAAC,OAAA4C,MAAA,CAAIL,WAAW,CAACM,GAAG,CAACC,CAAC,OAAAF,MAAA,CAAIL,WAAW,CAACM,GAAG,CAACE,CAAC,OAAAH,MAAA,CAAIR,UAAU,MAAG;EAClG,IAAMY,eAAe,WAAAJ,MAAA,CAAWL,WAAW,CAACM,GAAG,CAAC7C,CAAC,OAAA4C,MAAA,CAAIL,WAAW,CAACM,GAAG,CAACC,CAAC,OAAAF,MAAA,CAAIL,WAAW,CAACM,GAAG,CAACE,CAAC,OAAAH,MAAA,CAAId,KAAK,MAAG;EAEvG,IAAMmB,cAGL,GAAG,CAAC,CAAC;EAEN,IAAIjB,cAAc,EAAE;IAChBiB,cAAc,CAACC,UAAU,GAAGF,eAAe;IAC3CC,cAAc,CAACN,KAAK,GAAGA,KAAK;EAChC,CAAC,MAAM;IACHM,cAAc,CAACN,KAAK,GAAGK,eAAe;EAC1C;EAEA,oBACI,IAAAG,eAAA,EAACC,sBAAU;IACPhC,IAAI,EAAEA,IAAK;IACXiC,kBAAkB,EAAE,IAAAC,wBAAY,EAAC;MAAC9B,IAAI,EAAJA,IAAI;MAAEU,MAAM,EAANA;IAAM,CAAC,EAAEb,SAAS,CAAE;IAC5DK,UAAU,EAAEA,UAAW;IACvBE,IAAI,EAAEA,IAAK;IACXqB,cAAc,EAAEA;EAAe,CAClC,CAAC;AAEV,CACJ,CAAC;AAEDjC,UAAU,CAACuC,WAAW,GAAG,YAAY","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_uikit","_IconRefuge","_EntityIcon","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","EntityIcon","exports","memo","_ref","data","className","id","type","_ref$refugeSize","refugeSize","_ref$size","size","_ref$alpha","alpha","_ref$withBackground","withBackground","_ref$radius","radius","_ref$colorAlpha","colorAlpha","theme","useThemeType","randomColor","useColorGenerator","seed","undefined","String","color","concat","rgb","g","b","backgroundColor","containerStyle","background","_jsx","IconRefuge","containerClassName","cnEntityIcon","displayName"],"sources":["EntityIcon.tsx"],"sourcesContent":["import type {FC} from 'react';\nimport React, {memo} from 'react';\n\nimport {type IconData, useColorGenerator, useThemeType} from '@gravity-ui/uikit';\n\nimport {IconRefuge} from '../IconRefuge';\n\nimport {cnEntityIcon} from './EntityIcon.classname';\n\nimport './EntityIcon.scss';\n\nexport type EntityIconProps = {\n data: IconData;\n className?: string;\n id?: number | string;\n type?: string;\n refugeSize?: number;\n size?: number;\n alpha?: number;\n withBackground?: boolean;\n radius?: 'm' | 'l';\n colorAlpha?: number;\n};\n\nexport const EntityIcon: FC<EntityIconProps> = memo(\n ({\n data,\n className,\n id,\n type,\n refugeSize = 24,\n size = 16,\n alpha = 0.15,\n withBackground = true,\n radius = 'm',\n colorAlpha = 1,\n }) => {\n const theme = useThemeType();\n\n const randomColor = useColorGenerator({seed: id !== undefined ? String(id) : ' ', theme});\n\n const color = `rgba(${randomColor.rgb.r},${randomColor.rgb.g},${randomColor.rgb.b},${colorAlpha})`;\n const backgroundColor = `rgba(${randomColor.rgb.r},${randomColor.rgb.g},${randomColor.rgb.b},${alpha})`;\n\n const containerStyle: {\n background?: string;\n color?: string;\n } = {};\n\n if (withBackground) {\n containerStyle.background = backgroundColor;\n containerStyle.color = color;\n } else {\n containerStyle.color = backgroundColor;\n }\n\n return (\n <IconRefuge\n data={data}\n containerClassName={cnEntityIcon({type, radius}, className)}\n refugeSize={refugeSize}\n size={size}\n containerStyle={containerStyle}\n />\n );\n },\n);\n\nEntityIcon.displayName = 'EntityIcon';\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,123 @@
1
+ # GoalIcon
2
+
3
+ <!-- description:start -->
4
+ Displays a colored icon for a Tracker goal entity. The icon color is deterministically derived from the `goalId`, so the same goal always renders the same color across sessions and environments.
5
+ <!-- description:end -->
6
+
7
+ ## Usage
8
+
9
+ ```tsx
10
+ import {GoalIcon} from '@weavix/tracker-components';
11
+
12
+ <GoalIcon goalId={456} />
13
+ ```
14
+
15
+ ## Component props
16
+
17
+ <!-- props:start -->
18
+ ```ts
19
+ {
20
+ /**
21
+ * Goal ID used to generate a deterministic color.
22
+ * Accepts either a numeric shortId or a string entity ID.
23
+ */
24
+ goalId: number | string;
25
+
26
+ /**
27
+ * Additional CSS class applied to the root element.
28
+ */
29
+ className?: string;
30
+
31
+ /**
32
+ * Entity type label. Defaults to "goal".
33
+ */
34
+ type?: string;
35
+
36
+ /**
37
+ * Size of the SVG icon inside the container in pixels.
38
+ * @default 16
39
+ */
40
+ size?: number;
41
+
42
+ /**
43
+ * Size of the icon container (the colored square) in pixels.
44
+ * @default 24
45
+ */
46
+ refugeSize?: number;
47
+
48
+ /**
49
+ * Whether to render a colored background behind the icon.
50
+ * @default true
51
+ */
52
+ withBackground?: boolean;
53
+
54
+ /**
55
+ * Border radius variant of the icon container.
56
+ * @default 'm'
57
+ */
58
+ radius?: 'm' | 'l';
59
+
60
+ /**
61
+ * Alpha (opacity) of the icon foreground color.
62
+ * @default 1
63
+ */
64
+ colorAlpha?: number;
65
+ }
66
+ ```
67
+ <!-- props:end -->
68
+
69
+ ---
70
+
71
+ ## Examples
72
+
73
+ ### Default
74
+
75
+ ```tsx
76
+ import {GoalIcon} from '@weavix/tracker-components';
77
+
78
+ <GoalIcon goalId={456} />
79
+ ```
80
+
81
+ ### Custom size
82
+
83
+ ```tsx
84
+ // Larger icon container with a larger SVG inside
85
+ <GoalIcon goalId={456} size={20} refugeSize={32} />
86
+ ```
87
+
88
+ ### Without background
89
+
90
+ ```tsx
91
+ // Renders only the colored SVG, no background square
92
+ <GoalIcon goalId={456} withBackground={false} />
93
+ ```
94
+
95
+ ### Alongside goal name
96
+
97
+ ```tsx
98
+ import {GoalIcon} from '@weavix/tracker-components';
99
+
100
+ export const GoalLabel = ({goal}: {goal: {shortId: number; summary: string}}) => (
101
+ <div style={{display: 'flex', alignItems: 'center', gap: 8}}>
102
+ <GoalIcon goalId={goal.shortId} />
103
+ <span>{goal.summary}</span>
104
+ </div>
105
+ );
106
+ ```
107
+
108
+ ### Multiple goals (each gets a unique color)
109
+
110
+ ```tsx
111
+ const goals = [
112
+ {shortId: 1, summary: 'Increase retention'},
113
+ {shortId: 2, summary: 'Launch mobile app'},
114
+ {shortId: 3, summary: 'Reduce churn'},
115
+ ];
116
+
117
+ goals.map((g) => (
118
+ <div key={g.shortId} style={{display: 'flex', alignItems: 'center', gap: 8}}>
119
+ <GoalIcon goalId={g.shortId} />
120
+ <span>{g.summary}</span>
121
+ </div>
122
+ ));
123
+ ```
@@ -1 +1 @@
1
- {"version":3,"names":["_cn","require","cnIconRefuge","exports","block"],"sources":["IconRefuge.classname.tsx"],"sourcesContent":["import {block} from '~/src/components/cn';\n\nexport const cnIconRefuge = block('icon-refuge');\n"],"mappings":";;;;;;AAAA,IAAAA,GAAA,GAAAC,OAAA;AAEO,IAAMC,YAAY,GAAAC,OAAA,CAAAD,YAAA,GAAG,IAAAE,SAAK,EAAC,aAAa,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_cn","require","cnIconRefuge","exports","block"],"sources":["IconRefuge.classname.ts"],"sourcesContent":["import {block} from '~/src/components/cn';\n\nexport const cnIconRefuge = block('icon-refuge');\n"],"mappings":";;;;;;AAAA,IAAAA,GAAA,GAAAC,OAAA;AAEO,IAAMC,YAAY,GAAAC,OAAA,CAAAD,YAAA,GAAG,IAAAE,SAAK,EAAC,aAAa,CAAC","ignoreList":[]}
@@ -3,9 +3,6 @@
3
3
  align-items: center;
4
4
  justify-content: center;
5
5
  }
6
- .tpc-icon-refuge_inline {
7
- display: inline-flex;
8
- }
9
6
  .tpc-icon-refuge__hidden-label {
10
7
  position: absolute;
11
8
  overflow: hidden;
@@ -1 +1 @@
1
- {"version":3,"sources":["IconRefuge.scss"],"names":[],"mappings":"AAAA;EACI,oBAAA;EACA,mBAAA;EACA,uBAAA;AACJ;AACI;EACI,oBAAA;AACR;AAEI;EACI,kBAAA;EAEA,gBAAA;EACA,mBAAA;EAEA,UAAA;EACA,WAAA;EACA,UAAA;EACA,YAAA;EAEA,mBAAA;AAHR","file":"IconRefuge.css","sourcesContent":[".tpc-icon-refuge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n &_inline {\n display: inline-flex;\n }\n\n &__hidden-label {\n position: absolute;\n\n overflow: hidden;\n clip: rect(0 0 0 0);\n\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n\n white-space: nowrap;\n }\n}\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["IconRefuge.scss"],"names":[],"mappings":"AAAA;EACI,oBAAA;EACA,mBAAA;EACA,uBAAA;AACJ;AACI;EACI,kBAAA;EAEA,gBAAA;EACA,mBAAA;EAEA,UAAA;EACA,WAAA;EACA,UAAA;EACA,YAAA;EAEA,mBAAA;AAFR","file":"IconRefuge.css","sourcesContent":[".tpc-icon-refuge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n &__hidden-label {\n position: absolute;\n\n overflow: hidden;\n clip: rect(0 0 0 0);\n\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n\n white-space: nowrap;\n }\n}\n"],"sourceRoot":""}
@@ -7,7 +7,6 @@ exports.IssueTypeIcon = void 0;
7
7
  var _react = _interopRequireDefault(require("react"));
8
8
  var _uikit = require("@gravity-ui/uikit");
9
9
  var _useLocalizedString2 = require("./../../../hooks/useLocalizedString");
10
- var _Icon = require("../Icon.classname");
11
10
  var _IconRefuge = require("../IconRefuge");
12
11
  var _IssueTypeIcon = require("./IssueTypeIcon.classname");
13
12
  var _i18n = require("./i18n");
@@ -32,47 +31,28 @@ var _technicalDebt = _interopRequireDefault(require("../../../assets/icons/issue
32
31
  require("./IssueTypeIcon.css");
33
32
  var _jsxRuntime = require("react/jsx-runtime");
34
33
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
35
- var getIconData = function getIconData(issueType) {
36
- switch (issueType) {
37
- case 'bug':
38
- return _bug.default;
39
- case 'design':
40
- return _design.default;
41
- case 'epic':
42
- return _epic.default;
43
- case 'improvement':
44
- return _improvement.default;
45
- case 'incident':
46
- return _incident.default;
47
- case 'info':
48
- return _info.default;
49
- case 'newFeature':
50
- return _newFeature.default;
51
- case 'query':
52
- return _query.default;
53
- case 'refactoring':
54
- return _refactoring.default;
55
- case 'release':
56
- return _release.default;
57
- case 'research':
58
- return _research.default;
59
- case 'serviceRequest':
60
- return _serviceRequest.default;
61
- case 'story':
62
- return _story.default;
63
- case 'subBug':
64
- return _subbug.default;
65
- case 'subTask':
66
- return _subtask.default;
67
- case 'technicalDebt':
68
- return _technicalDebt.default;
69
- case 'milestone':
70
- return _milestone.default;
71
- default:
72
- return _task.default;
73
- }
34
+ var ISSUE_TYPE_ICONS = {
35
+ bug: _bug.default,
36
+ design: _design.default,
37
+ epic: _epic.default,
38
+ improvement: _improvement.default,
39
+ incident: _incident.default,
40
+ info: _info.default,
41
+ milestone: _milestone.default,
42
+ newFeature: _newFeature.default,
43
+ query: _query.default,
44
+ refactoring: _refactoring.default,
45
+ release: _release.default,
46
+ research: _research.default,
47
+ serviceRequest: _serviceRequest.default,
48
+ story: _story.default,
49
+ subBug: _subbug.default,
50
+ subTask: _subtask.default,
51
+ task: _task.default,
52
+ technicalDebt: _technicalDebt.default
74
53
  };
75
54
  var IssueTypeIcon = exports.IssueTypeIcon = function IssueTypeIcon(_ref) {
55
+ var _ISSUE_TYPE_ICONS$iss;
76
56
  var className = _ref.className,
77
57
  containerClassName = _ref.containerClassName,
78
58
  _ref$issueType = _ref.issueType,
@@ -83,20 +63,20 @@ var IssueTypeIcon = exports.IssueTypeIcon = function IssueTypeIcon(_ref) {
83
63
  var config = (0, _uikit.getConfig)();
84
64
  var _useLocalizedString = (0, _useLocalizedString2.useLocalizedString)(_i18n.defaultMessages, config.lang),
85
65
  t = _useLocalizedString.t;
86
- var ariaLabel = title && t('type-label', {
87
- type: title
88
- });
66
+ var ariaLabel = title ? t('type-label', {
67
+ type: issueType
68
+ }) : undefined;
89
69
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconRefuge.IconRefuge, {
90
- className: (0, _Icon.cnIcon)({
91
- issueType: issueType
92
- }, [(0, _IssueTypeIcon.cnIssueTypeIcon)({
70
+ className: (0, _IssueTypeIcon.cnIssueTypeIcon)({
93
71
  type: issueType
94
- }, className)]),
72
+ }, className),
95
73
  containerClassName: containerClassName,
96
- data: getIconData(issueType),
74
+ data: (_ISSUE_TYPE_ICONS$iss = ISSUE_TYPE_ICONS[issueType]) !== null && _ISSUE_TYPE_ICONS$iss !== void 0 ? _ISSUE_TYPE_ICONS$iss : _task.default,
97
75
  refugeSize: size,
98
- "aria-label": ariaLabel
76
+ title: title,
77
+ "aria-label": ariaLabel,
78
+ "aria-hidden": !title || undefined
99
79
  });
100
80
  };
101
- IssueTypeIcon.displayName = (0, _Icon.cnIcon)();
81
+ IssueTypeIcon.displayName = 'IssueTypeIcon';
102
82
  // #sourceMappingURL=IssueTypeIcon.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_uikit","_useLocalizedString2","_Icon","_IconRefuge","_IssueTypeIcon","_i18n","_bug","_design","_epic","_improvement","_incident","_info","_milestone","_newFeature","_query","_refactoring","_release","_research","_serviceRequest","_story","_subbug","_subtask","_task","_technicalDebt","_jsxRuntime","e","__esModule","default","getIconData","issueType","bugIcon","designIcon","epicIcon","improvementIcon","incidentIcon","infoIcon","newFeatureIcon","queryIcon","refactoringIcon","releaseIcon","researchIcon","serviceRequestIcon","storyIcon","subbugIcon","subtaskIcon","technicalDebtIcon","milestoneIcon","taskIcon","IssueTypeIcon","exports","_ref","className","containerClassName","_ref$issueType","_ref$size","size","title","config","getConfig","_useLocalizedString","useLocalizedString","defaultMessages","lang","t","ariaLabel","type","_jsx","IconRefuge","cnIcon","cnIssueTypeIcon","data","refugeSize","displayName"],"sources":["IssueTypeIcon.tsx"],"sourcesContent":["import type {FC} from 'react';\nimport React from 'react';\n\nimport {getConfig} from '@gravity-ui/uikit';\n\nimport {useLocalizedString} from '~/src/hooks/useLocalizedString';\n\nimport {cnIcon} from '../Icon.classname';\nimport type {IconRefugeProps} from '../IconRefuge';\nimport {IconRefuge} from '../IconRefuge';\n\nimport {cnIssueTypeIcon} from './IssueTypeIcon.classname';\nimport {defaultMessages} from './i18n';\nimport type {IssueType} from './types';\n\nimport bugIcon from '../../../../assets/icons/issue-type/bug.svg';\nimport designIcon from '../../../../assets/icons/issue-type/design.svg';\nimport epicIcon from '../../../../assets/icons/issue-type/epic.svg';\nimport improvementIcon from '../../../../assets/icons/issue-type/improvement.svg';\nimport incidentIcon from '../../../../assets/icons/issue-type/incident.svg';\nimport infoIcon from '../../../../assets/icons/issue-type/info.svg';\nimport milestoneIcon from '../../../../assets/icons/issue-type/milestone.svg';\nimport newFeatureIcon from '../../../../assets/icons/issue-type/new-feature.svg';\nimport queryIcon from '../../../../assets/icons/issue-type/query.svg';\nimport refactoringIcon from '../../../../assets/icons/issue-type/refactoring.svg';\nimport releaseIcon from '../../../../assets/icons/issue-type/release.svg';\nimport researchIcon from '../../../../assets/icons/issue-type/research.svg';\nimport serviceRequestIcon from '../../../../assets/icons/issue-type/service-request.svg';\nimport storyIcon from '../../../../assets/icons/issue-type/story.svg';\nimport subbugIcon from '../../../../assets/icons/issue-type/subbug.svg';\nimport subtaskIcon from '../../../../assets/icons/issue-type/subtask.svg';\nimport taskIcon from '../../../../assets/icons/issue-type/task.svg';\nimport technicalDebtIcon from '../../../../assets/icons/issue-type/technical-debt.svg';\n\nimport './IssueTypeIcon.scss';\n\nexport type IssueTypeIconProps = Partial<Pick<IconRefugeProps, 'containerClassName' | 'title'>> & {\n className?: string;\n size?: number;\n issueType?: IssueType;\n};\n\nconst getIconData = (issueType: string) => {\n switch (issueType) {\n case 'bug':\n return bugIcon;\n case 'design':\n return designIcon;\n case 'epic':\n return epicIcon;\n case 'improvement':\n return improvementIcon;\n case 'incident':\n return incidentIcon;\n case 'info':\n return infoIcon;\n case 'newFeature':\n return newFeatureIcon;\n case 'query':\n return queryIcon;\n case 'refactoring':\n return refactoringIcon;\n case 'release':\n return releaseIcon;\n case 'research':\n return researchIcon;\n case 'serviceRequest':\n return serviceRequestIcon;\n case 'story':\n return storyIcon;\n case 'subBug':\n return subbugIcon;\n case 'subTask':\n return subtaskIcon;\n case 'technicalDebt':\n return technicalDebtIcon;\n case 'milestone':\n return milestoneIcon;\n\n default:\n return taskIcon;\n }\n};\n\nexport const IssueTypeIcon: FC<IssueTypeIconProps> = ({\n className,\n containerClassName,\n issueType = 'task',\n size = 16,\n title,\n}) => {\n const config = getConfig();\n const {t} = useLocalizedString(defaultMessages, config.lang);\n const ariaLabel = title && t('type-label', {type: title});\n\n return (\n <IconRefuge\n className={cnIcon({issueType}, [cnIssueTypeIcon({type: issueType}, className)])}\n containerClassName={containerClassName}\n data={getIconData(issueType)}\n refugeSize={size}\n aria-label={ariaLabel}\n />\n );\n};\n\nIssueTypeIcon.displayName = cnIcon();\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_uikit","_useLocalizedString2","_IconRefuge","_IssueTypeIcon","_i18n","_bug","_design","_epic","_improvement","_incident","_info","_milestone","_newFeature","_query","_refactoring","_release","_research","_serviceRequest","_story","_subbug","_subtask","_task","_technicalDebt","_jsxRuntime","e","__esModule","default","ISSUE_TYPE_ICONS","bug","bugIcon","design","designIcon","epic","epicIcon","improvement","improvementIcon","incident","incidentIcon","info","infoIcon","milestone","milestoneIcon","newFeature","newFeatureIcon","query","queryIcon","refactoring","refactoringIcon","release","releaseIcon","research","researchIcon","serviceRequest","serviceRequestIcon","story","storyIcon","subBug","subbugIcon","subTask","subtaskIcon","task","taskIcon","technicalDebt","technicalDebtIcon","IssueTypeIcon","exports","_ref","_ISSUE_TYPE_ICONS$iss","className","containerClassName","_ref$issueType","issueType","_ref$size","size","title","config","getConfig","_useLocalizedString","useLocalizedString","defaultMessages","lang","t","ariaLabel","type","undefined","_jsx","IconRefuge","cnIssueTypeIcon","data","refugeSize","displayName"],"sources":["IssueTypeIcon.tsx"],"sourcesContent":["import type {FC} from 'react';\nimport React from 'react';\n\nimport {type IconData, getConfig} from '@gravity-ui/uikit';\n\nimport {useLocalizedString} from '~/src/hooks/useLocalizedString';\n\nimport type {IconRefugeProps} from '../IconRefuge';\nimport {IconRefuge} from '../IconRefuge';\n\nimport {cnIssueTypeIcon} from './IssueTypeIcon.classname';\nimport {defaultMessages} from './i18n';\nimport type {IssueType} from './types';\n\nimport bugIcon from '../../../../assets/icons/issue-type/bug.svg';\nimport designIcon from '../../../../assets/icons/issue-type/design.svg';\nimport epicIcon from '../../../../assets/icons/issue-type/epic.svg';\nimport improvementIcon from '../../../../assets/icons/issue-type/improvement.svg';\nimport incidentIcon from '../../../../assets/icons/issue-type/incident.svg';\nimport infoIcon from '../../../../assets/icons/issue-type/info.svg';\nimport milestoneIcon from '../../../../assets/icons/issue-type/milestone.svg';\nimport newFeatureIcon from '../../../../assets/icons/issue-type/new-feature.svg';\nimport queryIcon from '../../../../assets/icons/issue-type/query.svg';\nimport refactoringIcon from '../../../../assets/icons/issue-type/refactoring.svg';\nimport releaseIcon from '../../../../assets/icons/issue-type/release.svg';\nimport researchIcon from '../../../../assets/icons/issue-type/research.svg';\nimport serviceRequestIcon from '../../../../assets/icons/issue-type/service-request.svg';\nimport storyIcon from '../../../../assets/icons/issue-type/story.svg';\nimport subbugIcon from '../../../../assets/icons/issue-type/subbug.svg';\nimport subtaskIcon from '../../../../assets/icons/issue-type/subtask.svg';\nimport taskIcon from '../../../../assets/icons/issue-type/task.svg';\nimport technicalDebtIcon from '../../../../assets/icons/issue-type/technical-debt.svg';\n\nimport './IssueTypeIcon.scss';\n\nexport type IssueTypeIconProps = Partial<Pick<IconRefugeProps, 'containerClassName' | 'title'>> & {\n className?: string;\n size?: number;\n issueType?: IssueType;\n};\n\nconst ISSUE_TYPE_ICONS: Record<IssueType, IconData> = {\n bug: bugIcon,\n design: designIcon,\n epic: epicIcon,\n improvement: improvementIcon,\n incident: incidentIcon,\n info: infoIcon,\n milestone: milestoneIcon,\n newFeature: newFeatureIcon,\n query: queryIcon,\n refactoring: refactoringIcon,\n release: releaseIcon,\n research: researchIcon,\n serviceRequest: serviceRequestIcon,\n story: storyIcon,\n subBug: subbugIcon,\n subTask: subtaskIcon,\n task: taskIcon,\n technicalDebt: technicalDebtIcon,\n};\n\nexport const IssueTypeIcon: FC<IssueTypeIconProps> = ({\n className,\n containerClassName,\n issueType = 'task',\n size = 16,\n title,\n}) => {\n const config = getConfig();\n const {t} = useLocalizedString(defaultMessages, config.lang);\n const ariaLabel = title ? t('type-label', {type: issueType}) : undefined;\n\n return (\n <IconRefuge\n className={cnIssueTypeIcon({type: issueType}, className)}\n containerClassName={containerClassName}\n data={ISSUE_TYPE_ICONS[issueType] ?? taskIcon}\n refugeSize={size}\n title={title}\n aria-label={ariaLabel}\n aria-hidden={!title || undefined}\n />\n );\n};\n\nIssueTypeIcon.displayName = 'IssueTypeIcon';\n"],"mappings":"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","ignoreList":[]}