@macrostrat/feedback-components 1.1.10 → 2.0.1

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 (136) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/extractions/index.cjs +201 -0
  3. package/dist/extractions/index.cjs.map +1 -0
  4. package/dist/extractions/index.d.ts +30 -0
  5. package/dist/extractions/index.js +198 -0
  6. package/dist/extractions/index.js.map +1 -0
  7. package/dist/extractions/main.module.sass.cjs +12 -0
  8. package/dist/extractions/main.module.sass.cjs.map +1 -0
  9. package/dist/extractions/main.module.sass.js +12 -0
  10. package/dist/extractions/main.module.sass.js.map +1 -0
  11. package/dist/extractions/types.d.ts +32 -0
  12. package/dist/feedback/edit-state.cjs +384 -0
  13. package/dist/feedback/edit-state.cjs.map +1 -0
  14. package/dist/feedback/edit-state.d.ts +127 -0
  15. package/dist/feedback/edit-state.js +382 -0
  16. package/dist/feedback/edit-state.js.map +1 -0
  17. package/dist/feedback/feedback.module.sass.cjs +47 -0
  18. package/dist/feedback/feedback.module.sass.cjs.map +1 -0
  19. package/dist/feedback/feedback.module.sass.js +47 -0
  20. package/dist/feedback/feedback.module.sass.js.map +1 -0
  21. package/dist/feedback/graph.cjs +126 -0
  22. package/dist/feedback/graph.cjs.map +1 -0
  23. package/dist/feedback/graph.d.ts +9 -0
  24. package/dist/feedback/graph.js +124 -0
  25. package/dist/feedback/graph.js.map +1 -0
  26. package/dist/feedback/index.cjs +350 -0
  27. package/dist/feedback/index.cjs.map +1 -0
  28. package/dist/feedback/index.d.ts +15 -0
  29. package/dist/feedback/index.js +348 -0
  30. package/dist/feedback/index.js.map +1 -0
  31. package/dist/feedback/matches.cjs +246 -0
  32. package/dist/feedback/matches.cjs.map +1 -0
  33. package/dist/feedback/matches.d.ts +17 -0
  34. package/dist/feedback/matches.js +244 -0
  35. package/dist/feedback/matches.js.map +1 -0
  36. package/dist/feedback/node.cjs +64 -0
  37. package/dist/feedback/node.cjs.map +1 -0
  38. package/dist/feedback/node.d.ts +5 -0
  39. package/dist/feedback/node.js +63 -0
  40. package/dist/feedback/node.js.map +1 -0
  41. package/dist/feedback/text-visualizer.cjs +290 -0
  42. package/dist/feedback/text-visualizer.cjs.map +1 -0
  43. package/dist/feedback/text-visualizer.d.ts +36 -0
  44. package/dist/feedback/text-visualizer.js +288 -0
  45. package/dist/feedback/text-visualizer.js.map +1 -0
  46. package/dist/feedback/type-selector/index.cjs +50 -0
  47. package/dist/feedback/type-selector/index.cjs.map +1 -0
  48. package/dist/feedback/type-selector/index.d.ts +20 -0
  49. package/dist/feedback/type-selector/index.js +47 -0
  50. package/dist/feedback/type-selector/index.js.map +1 -0
  51. package/dist/feedback/type-selector/main.module.sass.cjs +13 -0
  52. package/dist/feedback/type-selector/main.module.sass.cjs.map +1 -0
  53. package/dist/feedback/type-selector/main.module.sass.js +13 -0
  54. package/dist/feedback/type-selector/main.module.sass.js.map +1 -0
  55. package/dist/feedback/typelist.cjs +295 -0
  56. package/dist/feedback/typelist.cjs.map +1 -0
  57. package/dist/feedback/typelist.d.ts +8 -0
  58. package/dist/feedback/typelist.js +293 -0
  59. package/dist/feedback/typelist.js.map +1 -0
  60. package/dist/feedback/types.d.ts +64 -0
  61. package/dist/feedback-components.css +343 -0
  62. package/dist/index.cjs +14 -0
  63. package/dist/index.cjs.map +1 -0
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.js +14 -0
  66. package/dist/index.js.map +1 -0
  67. package/package.json +48 -41
  68. package/src/extractions/index.ts +2 -2
  69. package/src/feedback/text-visualizer.ts +0 -1
  70. package/src/feedback/types.ts +2 -2
  71. package/dist/esm/feedback-components.2364179b.js +0 -287
  72. package/dist/esm/feedback-components.2364179b.js.map +0 -1
  73. package/dist/esm/feedback-components.6d32ee91.js +0 -16
  74. package/dist/esm/feedback-components.6d32ee91.js.map +0 -1
  75. package/dist/esm/feedback-components.7dd42a9f.js +0 -248
  76. package/dist/esm/feedback-components.7dd42a9f.js.map +0 -1
  77. package/dist/esm/feedback-components.7f72e5e9.js +0 -64
  78. package/dist/esm/feedback-components.7f72e5e9.js.map +0 -1
  79. package/dist/esm/feedback-components.ad9f284e.js +0 -63
  80. package/dist/esm/feedback-components.ad9f284e.js.map +0 -1
  81. package/dist/esm/feedback-components.ba79c0ef.js +0 -204
  82. package/dist/esm/feedback-components.ba79c0ef.js.map +0 -1
  83. package/dist/esm/feedback-components.bf93773c.css +0 -17
  84. package/dist/esm/feedback-components.bf93773c.css.map +0 -1
  85. package/dist/esm/feedback-components.c6e2c296.js +0 -148
  86. package/dist/esm/feedback-components.c6e2c296.js.map +0 -1
  87. package/dist/esm/feedback-components.ca78c2d4.js +0 -287
  88. package/dist/esm/feedback-components.ca78c2d4.js.map +0 -1
  89. package/dist/esm/feedback-components.d769ffa5.css +0 -205
  90. package/dist/esm/feedback-components.d769ffa5.css.map +0 -1
  91. package/dist/esm/feedback-components.e273ed5b.css +0 -14
  92. package/dist/esm/feedback-components.e273ed5b.css.map +0 -1
  93. package/dist/esm/feedback-components.e702eece.js +0 -97
  94. package/dist/esm/feedback-components.e702eece.js.map +0 -1
  95. package/dist/esm/feedback-components.edc606bb.js +0 -360
  96. package/dist/esm/feedback-components.edc606bb.js.map +0 -1
  97. package/dist/esm/feedback-components.f9850d85.js +0 -19
  98. package/dist/esm/feedback-components.f9850d85.js.map +0 -1
  99. package/dist/esm/feedback-components.fa847634.js +0 -453
  100. package/dist/esm/feedback-components.fa847634.js.map +0 -1
  101. package/dist/esm/index.d.ts +0 -96
  102. package/dist/esm/index.d.ts.map +0 -1
  103. package/dist/esm/index.js +0 -9
  104. package/dist/esm/index.js.map +0 -1
  105. package/dist/node/feedback-components.1bd49bf0.js +0 -2
  106. package/dist/node/feedback-components.1bd49bf0.js.map +0 -1
  107. package/dist/node/feedback-components.2f391fa4.js +0 -2
  108. package/dist/node/feedback-components.2f391fa4.js.map +0 -1
  109. package/dist/node/feedback-components.6a4a1290.js +0 -2
  110. package/dist/node/feedback-components.6a4a1290.js.map +0 -1
  111. package/dist/node/feedback-components.70780da4.js +0 -2
  112. package/dist/node/feedback-components.70780da4.js.map +0 -1
  113. package/dist/node/feedback-components.794f429b.js +0 -2
  114. package/dist/node/feedback-components.794f429b.js.map +0 -1
  115. package/dist/node/feedback-components.83c21466.css +0 -2
  116. package/dist/node/feedback-components.83c21466.css.map +0 -1
  117. package/dist/node/feedback-components.97518e90.css +0 -2
  118. package/dist/node/feedback-components.97518e90.css.map +0 -1
  119. package/dist/node/feedback-components.9eb1d41a.css +0 -2
  120. package/dist/node/feedback-components.9eb1d41a.css.map +0 -1
  121. package/dist/node/feedback-components.acac789b.js +0 -2
  122. package/dist/node/feedback-components.acac789b.js.map +0 -1
  123. package/dist/node/feedback-components.c84ff10e.js +0 -2
  124. package/dist/node/feedback-components.c84ff10e.js.map +0 -1
  125. package/dist/node/feedback-components.db72d0e1.js +0 -2
  126. package/dist/node/feedback-components.db72d0e1.js.map +0 -1
  127. package/dist/node/feedback-components.dc76072c.js +0 -2
  128. package/dist/node/feedback-components.dc76072c.js.map +0 -1
  129. package/dist/node/feedback-components.ddd11fe8.js +0 -2
  130. package/dist/node/feedback-components.ddd11fe8.js.map +0 -1
  131. package/dist/node/feedback-components.e59a061f.js +0 -2
  132. package/dist/node/feedback-components.e59a061f.js.map +0 -1
  133. package/dist/node/feedback-components.feab0bd0.js +0 -2
  134. package/dist/node/feedback-components.feab0bd0.js.map +0 -1
  135. package/dist/node/index.js +0 -2
  136. package/dist/node/index.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format
4
4
  is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this
5
5
  project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.0.1] - 2026-01-29
8
+
9
+ - Change layout of `package.json`
10
+
11
+ ## [2.0.0] - 2026-01-26
12
+
13
+ - Update peer dependencies to React 18
14
+ - Update bundling process to `@macrostrat/web-components-bundler`
15
+ - Import of `@macrostrat/feedback-components/styles.css` is now required.
16
+
7
17
  ## [1.1.10] - 2025-11-28
8
18
 
9
19
  - Upgrade `parcel` bundler
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const main_module = require("./main.module.sass.cjs");
4
+ const classNames = require("classnames");
5
+ const core = require("@blueprintjs/core");
6
+ const colorUtils = require("@macrostrat/color-utils");
7
+ const hyper = require("@macrostrat/hyper");
8
+ const uiComponents = require("@macrostrat/ui-components");
9
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
10
+ const classNames__default = /* @__PURE__ */ _interopDefault(classNames);
11
+ const hyper__default = /* @__PURE__ */ _interopDefault(hyper);
12
+ const h = hyper__default.default.styled(main_module.default);
13
+ function buildHighlights(entities, parent) {
14
+ let highlights = [];
15
+ let parents = [];
16
+ if (parent != null) {
17
+ parents = [parent.id, ...parent.parents ?? []];
18
+ }
19
+ for (const entity of entities) {
20
+ highlights.push({
21
+ start: entity.indices[0],
22
+ end: entity.indices[1],
23
+ text: entity.name,
24
+ backgroundColor: entity.type?.color,
25
+ tag: entity.type?.name ?? "lith",
26
+ id: entity.id,
27
+ parents,
28
+ match: entity.match
29
+ });
30
+ highlights.push(...buildHighlights(entity.children ?? [], entity));
31
+ }
32
+ return highlights;
33
+ }
34
+ function enhanceData(extractionData, models, entityTypes) {
35
+ return {
36
+ ...extractionData,
37
+ model: models.get(extractionData.model_id),
38
+ entities: extractionData.entities?.map(
39
+ (d) => enhanceEntity(d, entityTypes)
40
+ )
41
+ };
42
+ }
43
+ function getTagStyle(baseColor, options = {}) {
44
+ const _baseColor = colorUtils.asChromaColor(baseColor ?? "#fff");
45
+ const {
46
+ highlighted = true,
47
+ inDarkMode = uiComponents.useDarkMode().isEnabled,
48
+ active = false
49
+ } = options;
50
+ let mixAmount = highlighted ? 0.8 : 0.5;
51
+ let backgroundAlpha = highlighted ? 0.8 : 0.2;
52
+ if (active) {
53
+ mixAmount = 1;
54
+ backgroundAlpha = 1;
55
+ }
56
+ const mixTarget = "black";
57
+ const color = active ? "#000" : _baseColor.mix(mixTarget, mixAmount).hex();
58
+ const borderColor = highlighted ? _baseColor.mix(mixTarget, mixAmount / 1.1).hex() : "transparent";
59
+ let backgroundColor = active ? _baseColor.alpha(backgroundAlpha).hex() : normalizeColor(_baseColor.alpha(backgroundAlpha).hex());
60
+ if (!inDarkMode && backgroundColor === "#ffffff") {
61
+ backgroundColor = "#f0f0f0";
62
+ }
63
+ return {
64
+ color,
65
+ backgroundColor,
66
+ boxSizing: "border-box",
67
+ borderStyle: "solid",
68
+ borderColor,
69
+ borderWidth: "1.5px",
70
+ fontWeight: active ? "bold" : "normal",
71
+ fontSize: "0.9em"
72
+ };
73
+ }
74
+ function enhanceEntity(entity, entityTypes) {
75
+ return {
76
+ ...entity,
77
+ type: addColor(entityTypes.get(entity.type), entity.match != null),
78
+ children: entity.children?.map((d) => enhanceEntity(d, entityTypes))
79
+ };
80
+ }
81
+ function addColor(entityType, match = false) {
82
+ const color = colorUtils.asChromaColor(entityType.color ?? "#fff").brighten(
83
+ match ? 1 : 2
84
+ );
85
+ return { ...entityType, color: color.css() };
86
+ }
87
+ function ExtractionContext({
88
+ data,
89
+ entityTypes,
90
+ matchComponent
91
+ }) {
92
+ const highlights = buildHighlights(data.entities, null);
93
+ return h("div", [
94
+ h("p", h(HighlightedText, { text: data.paragraph_text, highlights })),
95
+ h(ModelInfo, { data: data.model }),
96
+ h(
97
+ "ul.entities",
98
+ data.entities.map((d) => h(ExtractionInfo, { data: d, matchComponent }))
99
+ )
100
+ ]);
101
+ }
102
+ function ModelInfo({ data }) {
103
+ if (!data) return null;
104
+ return h("p.model-name", ["Model: ", h("code.bp6-code", data.name)]);
105
+ }
106
+ function EntityTag({
107
+ data,
108
+ highlighted = true,
109
+ active = false,
110
+ onClickType,
111
+ matchComponent = null
112
+ }) {
113
+ const { name, type, match } = data;
114
+ const className = classNames__default.default(
115
+ {
116
+ matched: match != null,
117
+ type: data.type?.name ?? "lith"
118
+ },
119
+ "entity"
120
+ );
121
+ const style = getTagStyle(type?.color, { highlighted, active });
122
+ let _matchLink = null;
123
+ if (match != null && matchComponent != null) {
124
+ _matchLink = h(matchComponent, { data: match });
125
+ }
126
+ return h(core.Tag, { style, className }, [
127
+ h("span.entity-name", name),
128
+ " ",
129
+ h(
130
+ "code.entity-type.bp6-code",
131
+ {
132
+ onClick(evt) {
133
+ if (active && onClickType != null) {
134
+ onClickType(type);
135
+ evt.stopPropagation();
136
+ }
137
+ }
138
+ },
139
+ [type?.name, _matchLink]
140
+ )
141
+ ]);
142
+ }
143
+ function ExtractionInfo({
144
+ data,
145
+ matchComponent = null
146
+ }) {
147
+ const children = data.children ?? [];
148
+ return h("li.entity-row", [
149
+ h(EntityTag, { data, matchComponent }),
150
+ h.if(children.length > 0)([
151
+ h(
152
+ "ul.children",
153
+ children.map((d) => h(ExtractionInfo, { data: d, matchComponent }))
154
+ )
155
+ ])
156
+ ]);
157
+ }
158
+ function HighlightedText(props) {
159
+ const { text, highlights = [] } = props;
160
+ const parts = [];
161
+ let start = 0;
162
+ const sortedHighlights = highlights.sort((a, b) => a.start - b.start);
163
+ const deconflictedHighlights = sortedHighlights.map((highlight, i) => {
164
+ if (i === 0) return highlight;
165
+ const prev = sortedHighlights[i - 1];
166
+ if (highlight.start < prev.end) {
167
+ highlight.start = prev.end;
168
+ }
169
+ return highlight;
170
+ });
171
+ for (const highlight of deconflictedHighlights) {
172
+ const { start: s, end, ...rest } = highlight;
173
+ parts.push(text.slice(start, s));
174
+ parts.push(h("span.highlight", { style: rest }, text.slice(s, end)));
175
+ start = end;
176
+ }
177
+ parts.push(text.slice(start));
178
+ return h("span", parts);
179
+ }
180
+ function normalizeColor(hex8) {
181
+ const background = uiComponents.useDarkMode().isEnabled ? "#000000" : "#ffffff";
182
+ const r = parseInt(hex8.slice(1, 3), 16);
183
+ const g = parseInt(hex8.slice(3, 5), 16);
184
+ const b = parseInt(hex8.slice(5, 7), 16);
185
+ const a = parseInt(hex8.slice(7, 9), 16) / 255;
186
+ const bgR = parseInt(background.slice(1, 3), 16);
187
+ const bgG = parseInt(background.slice(3, 5), 16);
188
+ const bgB = parseInt(background.slice(5, 7), 16);
189
+ const blend = (fg, bg) => Math.round((1 - a) * bg + a * fg);
190
+ const blendedR = blend(r, bgR);
191
+ const blendedG = blend(g, bgG);
192
+ const blendedB = blend(b, bgB);
193
+ return "#" + blendedR.toString(16).padStart(2, "0") + blendedG.toString(16).padStart(2, "0") + blendedB.toString(16).padStart(2, "0");
194
+ }
195
+ exports.EntityTag = EntityTag;
196
+ exports.ExtractionContext = ExtractionContext;
197
+ exports.ModelInfo = ModelInfo;
198
+ exports.buildHighlights = buildHighlights;
199
+ exports.enhanceData = enhanceData;
200
+ exports.getTagStyle = getTagStyle;
201
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/extractions/index.ts"],"sourcesContent":["import styles from \"./main.module.sass\";\nimport classNames from \"classnames\";\nimport { Tag } from \"@blueprintjs/core\";\nimport type { Entity, EntityExt, Highlight, EntityType } from \"./types\";\nimport { CSSProperties } from \"react\";\nimport { asChromaColor } from \"@macrostrat/color-utils\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useDarkMode } from \"@macrostrat/ui-components\";\n\nexport type { Entity, EntityExt };\n\nconst h = hyper.styled(styles);\n\nexport function buildHighlights(\n entities: EntityExt[],\n parent: EntityExt | null,\n): Highlight[] {\n let highlights = [];\n let parents = [];\n if (parent != null) {\n parents = [parent.id, ...(parent.parents ?? [])];\n }\n\n for (const entity of entities) {\n highlights.push({\n start: entity.indices[0],\n end: entity.indices[1],\n text: entity.name,\n backgroundColor: entity.type?.color,\n tag: entity.type?.name ?? \"lith\",\n id: entity.id,\n parents,\n match: entity.match,\n });\n highlights.push(...buildHighlights(entity.children ?? [], entity));\n }\n return highlights;\n}\n\nexport function enhanceData(extractionData, models, entityTypes) {\n return {\n ...extractionData,\n model: models.get(extractionData.model_id),\n entities: extractionData.entities?.map((d) =>\n enhanceEntity(d, entityTypes),\n ),\n };\n}\n\nexport function getTagStyle(\n baseColor: string,\n options: {\n highlighted?: boolean;\n inDarkMode?: boolean;\n active?: boolean;\n showMatches?: boolean;\n } = {},\n): CSSProperties {\n const _baseColor = asChromaColor(baseColor ?? \"#fff\");\n const {\n highlighted = true,\n inDarkMode = useDarkMode().isEnabled,\n active = false,\n } = options;\n\n let mixAmount = highlighted ? 0.8 : 0.5;\n let backgroundAlpha = highlighted ? 0.8 : 0.2;\n\n if (active) {\n mixAmount = 1;\n backgroundAlpha = 1;\n }\n\n const mixTarget = \"black\";\n\n const color = active ? \"#000\" : _baseColor.mix(mixTarget, mixAmount).hex();\n const borderColor = highlighted\n ? _baseColor.mix(mixTarget, mixAmount / 1.1).hex()\n : \"transparent\";\n\n let backgroundColor = active\n ? _baseColor.alpha(backgroundAlpha).hex()\n : normalizeColor(_baseColor.alpha(backgroundAlpha).hex());\n\n // handle white backgrounds in light mode\n if (!inDarkMode && backgroundColor === \"#ffffff\") {\n backgroundColor = \"#f0f0f0\";\n }\n\n return {\n color,\n backgroundColor,\n boxSizing: \"border-box\",\n borderStyle: \"solid\",\n borderColor,\n borderWidth: \"1.5px\",\n fontWeight: active ? \"bold\" : \"normal\",\n fontSize: \"0.9em\",\n };\n}\n\nfunction enhanceEntity(\n entity: Entity,\n entityTypes: Map<number, EntityType>,\n): EntityExt {\n return {\n ...entity,\n type: addColor(entityTypes.get(entity.type), entity.match != null),\n children: entity.children?.map((d) => enhanceEntity(d, entityTypes)),\n };\n}\n\nfunction addColor(entityType: EntityType, match = false) {\n const color = asChromaColor(entityType.color ?? \"#fff\").brighten(\n match ? 1 : 2,\n );\n\n return { ...entityType, color: color.css() };\n}\n\nexport function ExtractionContext({\n data,\n entityTypes,\n matchComponent,\n}: {\n data: any;\n entityTypes: Map<number, EntityType>;\n matchComponent: MatchComponent;\n}) {\n const highlights = buildHighlights(data.entities, null);\n\n return h(\"div\", [\n h(\"p\", h(HighlightedText, { text: data.paragraph_text, highlights })),\n h(ModelInfo, { data: data.model }),\n h(\n \"ul.entities\",\n data.entities.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]);\n}\n\nexport function ModelInfo({ data }) {\n if (!data) return null;\n return h(\"p.model-name\", [\"Model: \", h(\"code.bp6-code\", data.name)]);\n}\n\nexport type MatchComponent = (props: { data: any }) => any;\n\ntype EntityTagProps = {\n data: EntityExt;\n highlighted?: boolean;\n active?: boolean;\n onClickType?: (type: EntityType) => void;\n matchComponent?: MatchComponent;\n};\n\nexport function EntityTag({\n data,\n highlighted = true,\n active = false,\n onClickType,\n matchComponent = null,\n}: EntityTagProps) {\n const { name, type, match } = data;\n\n const className = classNames(\n {\n matched: match != null,\n type: data.type?.name ?? \"lith\",\n },\n \"entity\",\n );\n\n const style = getTagStyle(type?.color, { highlighted, active });\n\n let _matchLink = null;\n if (match != null && matchComponent != null) {\n _matchLink = h(matchComponent, { data: match });\n }\n\n return h(Tag, { style, className }, [\n h(\"span.entity-name\", name),\n \" \",\n h(\n \"code.entity-type.bp6-code\",\n {\n onClick(evt) {\n if (active && onClickType != null) {\n onClickType(type);\n evt.stopPropagation();\n }\n },\n },\n [type?.name, _matchLink],\n ),\n ]);\n}\n\nfunction ExtractionInfo({\n data,\n matchComponent = null,\n}: {\n data: EntityExt;\n matchComponent: MatchComponent;\n}) {\n const children = data.children ?? [];\n\n return h(\"li.entity-row\", [\n h(EntityTag, { data, matchComponent }),\n h.if(children.length > 0)([\n h(\n \"ul.children\",\n children.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]),\n ]);\n}\n\nfunction HighlightedText(props: { text: string; highlights: Highlight[] }) {\n const { text, highlights = [] } = props;\n const parts = [];\n let start = 0;\n\n const sortedHighlights = highlights.sort((a, b) => a.start - b.start);\n const deconflictedHighlights = sortedHighlights.map((highlight, i) => {\n if (i === 0) return highlight;\n const prev = sortedHighlights[i - 1];\n if (highlight.start < prev.end) {\n highlight.start = prev.end;\n }\n return highlight;\n });\n\n for (const highlight of deconflictedHighlights) {\n const { start: s, end, ...rest } = highlight;\n parts.push(text.slice(start, s));\n parts.push(h(\"span.highlight\", { style: rest }, text.slice(s, end)));\n start = end;\n }\n parts.push(text.slice(start));\n return h(\"span\", parts);\n}\n\nfunction normalizeColor(hex8) {\n const background = useDarkMode().isEnabled ? \"#000000\" : \"#ffffff\";\n\n const r = parseInt(hex8.slice(1, 3), 16);\n const g = parseInt(hex8.slice(3, 5), 16);\n const b = parseInt(hex8.slice(5, 7), 16);\n const a = parseInt(hex8.slice(7, 9), 16) / 255;\n\n const bgR = parseInt(background.slice(1, 3), 16);\n const bgG = parseInt(background.slice(3, 5), 16);\n const bgB = parseInt(background.slice(5, 7), 16);\n\n const blend = (fg, bg) => Math.round((1 - a) * bg + a * fg);\n\n const blendedR = blend(r, bgR);\n const blendedG = blend(g, bgG);\n const blendedB = blend(b, bgB);\n\n return (\n \"#\" +\n blendedR.toString(16).padStart(2, \"0\") +\n blendedG.toString(16).padStart(2, \"0\") +\n blendedB.toString(16).padStart(2, \"0\")\n );\n}\n\nfunction isHighlighted(id: number, selectedNodes: number[], nodes: any[]) {\n if (selectedNodes?.length === 0) return true;\n return (\n selectedNodes?.includes(id) ||\n nodes?.some(\n (node) =>\n selectedNodes?.includes(node.id) &&\n node.children.some((child) => child.id === id),\n )\n );\n}\n"],"names":["hyper","styles","asChromaColor","useDarkMode","classNames","Tag"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Entity, EntityExt, Highlight, EntityType } from './types';
2
+ import { CSSProperties } from 'react';
3
+ export type { Entity, EntityExt };
4
+ export declare function buildHighlights(entities: EntityExt[], parent: EntityExt | null): Highlight[];
5
+ export declare function enhanceData(extractionData: any, models: any, entityTypes: any): any;
6
+ export declare function getTagStyle(baseColor: string, options?: {
7
+ highlighted?: boolean;
8
+ inDarkMode?: boolean;
9
+ active?: boolean;
10
+ showMatches?: boolean;
11
+ }): CSSProperties;
12
+ export declare function ExtractionContext({ data, entityTypes, matchComponent, }: {
13
+ data: any;
14
+ entityTypes: Map<number, EntityType>;
15
+ matchComponent: MatchComponent;
16
+ }): import('react').DetailedReactHTMLElement<import('react').HTMLAttributes<HTMLElement>, HTMLElement>;
17
+ export declare function ModelInfo({ data }: {
18
+ data: any;
19
+ }): import('react').DOMElement<import('react').DOMAttributes<Element>, Element>;
20
+ export type MatchComponent = (props: {
21
+ data: any;
22
+ }) => any;
23
+ type EntityTagProps = {
24
+ data: EntityExt;
25
+ highlighted?: boolean;
26
+ active?: boolean;
27
+ onClickType?: (type: EntityType) => void;
28
+ matchComponent?: MatchComponent;
29
+ };
30
+ export declare function EntityTag({ data, highlighted, active, onClickType, matchComponent, }: EntityTagProps): import('react').FunctionComponentElement<import('@blueprintjs/core').TagProps>;
@@ -0,0 +1,198 @@
1
+ import styles from "./main.module.sass.js";
2
+ import classNames from "classnames";
3
+ import { Tag } from "@blueprintjs/core";
4
+ import { asChromaColor } from "@macrostrat/color-utils";
5
+ import hyper from "@macrostrat/hyper";
6
+ import { useDarkMode } from "@macrostrat/ui-components";
7
+ const h = hyper.styled(styles);
8
+ function buildHighlights(entities, parent) {
9
+ let highlights = [];
10
+ let parents = [];
11
+ if (parent != null) {
12
+ parents = [parent.id, ...parent.parents ?? []];
13
+ }
14
+ for (const entity of entities) {
15
+ highlights.push({
16
+ start: entity.indices[0],
17
+ end: entity.indices[1],
18
+ text: entity.name,
19
+ backgroundColor: entity.type?.color,
20
+ tag: entity.type?.name ?? "lith",
21
+ id: entity.id,
22
+ parents,
23
+ match: entity.match
24
+ });
25
+ highlights.push(...buildHighlights(entity.children ?? [], entity));
26
+ }
27
+ return highlights;
28
+ }
29
+ function enhanceData(extractionData, models, entityTypes) {
30
+ return {
31
+ ...extractionData,
32
+ model: models.get(extractionData.model_id),
33
+ entities: extractionData.entities?.map(
34
+ (d) => enhanceEntity(d, entityTypes)
35
+ )
36
+ };
37
+ }
38
+ function getTagStyle(baseColor, options = {}) {
39
+ const _baseColor = asChromaColor(baseColor ?? "#fff");
40
+ const {
41
+ highlighted = true,
42
+ inDarkMode = useDarkMode().isEnabled,
43
+ active = false
44
+ } = options;
45
+ let mixAmount = highlighted ? 0.8 : 0.5;
46
+ let backgroundAlpha = highlighted ? 0.8 : 0.2;
47
+ if (active) {
48
+ mixAmount = 1;
49
+ backgroundAlpha = 1;
50
+ }
51
+ const mixTarget = "black";
52
+ const color = active ? "#000" : _baseColor.mix(mixTarget, mixAmount).hex();
53
+ const borderColor = highlighted ? _baseColor.mix(mixTarget, mixAmount / 1.1).hex() : "transparent";
54
+ let backgroundColor = active ? _baseColor.alpha(backgroundAlpha).hex() : normalizeColor(_baseColor.alpha(backgroundAlpha).hex());
55
+ if (!inDarkMode && backgroundColor === "#ffffff") {
56
+ backgroundColor = "#f0f0f0";
57
+ }
58
+ return {
59
+ color,
60
+ backgroundColor,
61
+ boxSizing: "border-box",
62
+ borderStyle: "solid",
63
+ borderColor,
64
+ borderWidth: "1.5px",
65
+ fontWeight: active ? "bold" : "normal",
66
+ fontSize: "0.9em"
67
+ };
68
+ }
69
+ function enhanceEntity(entity, entityTypes) {
70
+ return {
71
+ ...entity,
72
+ type: addColor(entityTypes.get(entity.type), entity.match != null),
73
+ children: entity.children?.map((d) => enhanceEntity(d, entityTypes))
74
+ };
75
+ }
76
+ function addColor(entityType, match = false) {
77
+ const color = asChromaColor(entityType.color ?? "#fff").brighten(
78
+ match ? 1 : 2
79
+ );
80
+ return { ...entityType, color: color.css() };
81
+ }
82
+ function ExtractionContext({
83
+ data,
84
+ entityTypes,
85
+ matchComponent
86
+ }) {
87
+ const highlights = buildHighlights(data.entities, null);
88
+ return h("div", [
89
+ h("p", h(HighlightedText, { text: data.paragraph_text, highlights })),
90
+ h(ModelInfo, { data: data.model }),
91
+ h(
92
+ "ul.entities",
93
+ data.entities.map((d) => h(ExtractionInfo, { data: d, matchComponent }))
94
+ )
95
+ ]);
96
+ }
97
+ function ModelInfo({ data }) {
98
+ if (!data) return null;
99
+ return h("p.model-name", ["Model: ", h("code.bp6-code", data.name)]);
100
+ }
101
+ function EntityTag({
102
+ data,
103
+ highlighted = true,
104
+ active = false,
105
+ onClickType,
106
+ matchComponent = null
107
+ }) {
108
+ const { name, type, match } = data;
109
+ const className = classNames(
110
+ {
111
+ matched: match != null,
112
+ type: data.type?.name ?? "lith"
113
+ },
114
+ "entity"
115
+ );
116
+ const style = getTagStyle(type?.color, { highlighted, active });
117
+ let _matchLink = null;
118
+ if (match != null && matchComponent != null) {
119
+ _matchLink = h(matchComponent, { data: match });
120
+ }
121
+ return h(Tag, { style, className }, [
122
+ h("span.entity-name", name),
123
+ " ",
124
+ h(
125
+ "code.entity-type.bp6-code",
126
+ {
127
+ onClick(evt) {
128
+ if (active && onClickType != null) {
129
+ onClickType(type);
130
+ evt.stopPropagation();
131
+ }
132
+ }
133
+ },
134
+ [type?.name, _matchLink]
135
+ )
136
+ ]);
137
+ }
138
+ function ExtractionInfo({
139
+ data,
140
+ matchComponent = null
141
+ }) {
142
+ const children = data.children ?? [];
143
+ return h("li.entity-row", [
144
+ h(EntityTag, { data, matchComponent }),
145
+ h.if(children.length > 0)([
146
+ h(
147
+ "ul.children",
148
+ children.map((d) => h(ExtractionInfo, { data: d, matchComponent }))
149
+ )
150
+ ])
151
+ ]);
152
+ }
153
+ function HighlightedText(props) {
154
+ const { text, highlights = [] } = props;
155
+ const parts = [];
156
+ let start = 0;
157
+ const sortedHighlights = highlights.sort((a, b) => a.start - b.start);
158
+ const deconflictedHighlights = sortedHighlights.map((highlight, i) => {
159
+ if (i === 0) return highlight;
160
+ const prev = sortedHighlights[i - 1];
161
+ if (highlight.start < prev.end) {
162
+ highlight.start = prev.end;
163
+ }
164
+ return highlight;
165
+ });
166
+ for (const highlight of deconflictedHighlights) {
167
+ const { start: s, end, ...rest } = highlight;
168
+ parts.push(text.slice(start, s));
169
+ parts.push(h("span.highlight", { style: rest }, text.slice(s, end)));
170
+ start = end;
171
+ }
172
+ parts.push(text.slice(start));
173
+ return h("span", parts);
174
+ }
175
+ function normalizeColor(hex8) {
176
+ const background = useDarkMode().isEnabled ? "#000000" : "#ffffff";
177
+ const r = parseInt(hex8.slice(1, 3), 16);
178
+ const g = parseInt(hex8.slice(3, 5), 16);
179
+ const b = parseInt(hex8.slice(5, 7), 16);
180
+ const a = parseInt(hex8.slice(7, 9), 16) / 255;
181
+ const bgR = parseInt(background.slice(1, 3), 16);
182
+ const bgG = parseInt(background.slice(3, 5), 16);
183
+ const bgB = parseInt(background.slice(5, 7), 16);
184
+ const blend = (fg, bg) => Math.round((1 - a) * bg + a * fg);
185
+ const blendedR = blend(r, bgR);
186
+ const blendedG = blend(g, bgG);
187
+ const blendedB = blend(b, bgB);
188
+ return "#" + blendedR.toString(16).padStart(2, "0") + blendedG.toString(16).padStart(2, "0") + blendedB.toString(16).padStart(2, "0");
189
+ }
190
+ export {
191
+ EntityTag,
192
+ ExtractionContext,
193
+ ModelInfo,
194
+ buildHighlights,
195
+ enhanceData,
196
+ getTagStyle
197
+ };
198
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/extractions/index.ts"],"sourcesContent":["import styles from \"./main.module.sass\";\nimport classNames from \"classnames\";\nimport { Tag } from \"@blueprintjs/core\";\nimport type { Entity, EntityExt, Highlight, EntityType } from \"./types\";\nimport { CSSProperties } from \"react\";\nimport { asChromaColor } from \"@macrostrat/color-utils\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useDarkMode } from \"@macrostrat/ui-components\";\n\nexport type { Entity, EntityExt };\n\nconst h = hyper.styled(styles);\n\nexport function buildHighlights(\n entities: EntityExt[],\n parent: EntityExt | null,\n): Highlight[] {\n let highlights = [];\n let parents = [];\n if (parent != null) {\n parents = [parent.id, ...(parent.parents ?? [])];\n }\n\n for (const entity of entities) {\n highlights.push({\n start: entity.indices[0],\n end: entity.indices[1],\n text: entity.name,\n backgroundColor: entity.type?.color,\n tag: entity.type?.name ?? \"lith\",\n id: entity.id,\n parents,\n match: entity.match,\n });\n highlights.push(...buildHighlights(entity.children ?? [], entity));\n }\n return highlights;\n}\n\nexport function enhanceData(extractionData, models, entityTypes) {\n return {\n ...extractionData,\n model: models.get(extractionData.model_id),\n entities: extractionData.entities?.map((d) =>\n enhanceEntity(d, entityTypes),\n ),\n };\n}\n\nexport function getTagStyle(\n baseColor: string,\n options: {\n highlighted?: boolean;\n inDarkMode?: boolean;\n active?: boolean;\n showMatches?: boolean;\n } = {},\n): CSSProperties {\n const _baseColor = asChromaColor(baseColor ?? \"#fff\");\n const {\n highlighted = true,\n inDarkMode = useDarkMode().isEnabled,\n active = false,\n } = options;\n\n let mixAmount = highlighted ? 0.8 : 0.5;\n let backgroundAlpha = highlighted ? 0.8 : 0.2;\n\n if (active) {\n mixAmount = 1;\n backgroundAlpha = 1;\n }\n\n const mixTarget = \"black\";\n\n const color = active ? \"#000\" : _baseColor.mix(mixTarget, mixAmount).hex();\n const borderColor = highlighted\n ? _baseColor.mix(mixTarget, mixAmount / 1.1).hex()\n : \"transparent\";\n\n let backgroundColor = active\n ? _baseColor.alpha(backgroundAlpha).hex()\n : normalizeColor(_baseColor.alpha(backgroundAlpha).hex());\n\n // handle white backgrounds in light mode\n if (!inDarkMode && backgroundColor === \"#ffffff\") {\n backgroundColor = \"#f0f0f0\";\n }\n\n return {\n color,\n backgroundColor,\n boxSizing: \"border-box\",\n borderStyle: \"solid\",\n borderColor,\n borderWidth: \"1.5px\",\n fontWeight: active ? \"bold\" : \"normal\",\n fontSize: \"0.9em\",\n };\n}\n\nfunction enhanceEntity(\n entity: Entity,\n entityTypes: Map<number, EntityType>,\n): EntityExt {\n return {\n ...entity,\n type: addColor(entityTypes.get(entity.type), entity.match != null),\n children: entity.children?.map((d) => enhanceEntity(d, entityTypes)),\n };\n}\n\nfunction addColor(entityType: EntityType, match = false) {\n const color = asChromaColor(entityType.color ?? \"#fff\").brighten(\n match ? 1 : 2,\n );\n\n return { ...entityType, color: color.css() };\n}\n\nexport function ExtractionContext({\n data,\n entityTypes,\n matchComponent,\n}: {\n data: any;\n entityTypes: Map<number, EntityType>;\n matchComponent: MatchComponent;\n}) {\n const highlights = buildHighlights(data.entities, null);\n\n return h(\"div\", [\n h(\"p\", h(HighlightedText, { text: data.paragraph_text, highlights })),\n h(ModelInfo, { data: data.model }),\n h(\n \"ul.entities\",\n data.entities.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]);\n}\n\nexport function ModelInfo({ data }) {\n if (!data) return null;\n return h(\"p.model-name\", [\"Model: \", h(\"code.bp6-code\", data.name)]);\n}\n\nexport type MatchComponent = (props: { data: any }) => any;\n\ntype EntityTagProps = {\n data: EntityExt;\n highlighted?: boolean;\n active?: boolean;\n onClickType?: (type: EntityType) => void;\n matchComponent?: MatchComponent;\n};\n\nexport function EntityTag({\n data,\n highlighted = true,\n active = false,\n onClickType,\n matchComponent = null,\n}: EntityTagProps) {\n const { name, type, match } = data;\n\n const className = classNames(\n {\n matched: match != null,\n type: data.type?.name ?? \"lith\",\n },\n \"entity\",\n );\n\n const style = getTagStyle(type?.color, { highlighted, active });\n\n let _matchLink = null;\n if (match != null && matchComponent != null) {\n _matchLink = h(matchComponent, { data: match });\n }\n\n return h(Tag, { style, className }, [\n h(\"span.entity-name\", name),\n \" \",\n h(\n \"code.entity-type.bp6-code\",\n {\n onClick(evt) {\n if (active && onClickType != null) {\n onClickType(type);\n evt.stopPropagation();\n }\n },\n },\n [type?.name, _matchLink],\n ),\n ]);\n}\n\nfunction ExtractionInfo({\n data,\n matchComponent = null,\n}: {\n data: EntityExt;\n matchComponent: MatchComponent;\n}) {\n const children = data.children ?? [];\n\n return h(\"li.entity-row\", [\n h(EntityTag, { data, matchComponent }),\n h.if(children.length > 0)([\n h(\n \"ul.children\",\n children.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]),\n ]);\n}\n\nfunction HighlightedText(props: { text: string; highlights: Highlight[] }) {\n const { text, highlights = [] } = props;\n const parts = [];\n let start = 0;\n\n const sortedHighlights = highlights.sort((a, b) => a.start - b.start);\n const deconflictedHighlights = sortedHighlights.map((highlight, i) => {\n if (i === 0) return highlight;\n const prev = sortedHighlights[i - 1];\n if (highlight.start < prev.end) {\n highlight.start = prev.end;\n }\n return highlight;\n });\n\n for (const highlight of deconflictedHighlights) {\n const { start: s, end, ...rest } = highlight;\n parts.push(text.slice(start, s));\n parts.push(h(\"span.highlight\", { style: rest }, text.slice(s, end)));\n start = end;\n }\n parts.push(text.slice(start));\n return h(\"span\", parts);\n}\n\nfunction normalizeColor(hex8) {\n const background = useDarkMode().isEnabled ? \"#000000\" : \"#ffffff\";\n\n const r = parseInt(hex8.slice(1, 3), 16);\n const g = parseInt(hex8.slice(3, 5), 16);\n const b = parseInt(hex8.slice(5, 7), 16);\n const a = parseInt(hex8.slice(7, 9), 16) / 255;\n\n const bgR = parseInt(background.slice(1, 3), 16);\n const bgG = parseInt(background.slice(3, 5), 16);\n const bgB = parseInt(background.slice(5, 7), 16);\n\n const blend = (fg, bg) => Math.round((1 - a) * bg + a * fg);\n\n const blendedR = blend(r, bgR);\n const blendedG = blend(g, bgG);\n const blendedB = blend(b, bgB);\n\n return (\n \"#\" +\n blendedR.toString(16).padStart(2, \"0\") +\n blendedG.toString(16).padStart(2, \"0\") +\n blendedB.toString(16).padStart(2, \"0\")\n );\n}\n\nfunction isHighlighted(id: number, selectedNodes: number[], nodes: any[]) {\n if (selectedNodes?.length === 0) return true;\n return (\n selectedNodes?.includes(id) ||\n nodes?.some(\n (node) =>\n selectedNodes?.includes(node.id) &&\n node.children.some((child) => child.id === id),\n )\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const entities = "_entities_m1o0j_1";
4
+ const entity = "_entity_m1o0j_9";
5
+ const styles = {
6
+ entities,
7
+ entity
8
+ };
9
+ exports.default = styles;
10
+ exports.entities = entities;
11
+ exports.entity = entity;
12
+ //# sourceMappingURL=main.module.sass.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
@@ -0,0 +1,12 @@
1
+ const entities = "_entities_m1o0j_1";
2
+ const entity = "_entity_m1o0j_9";
3
+ const styles = {
4
+ entities,
5
+ entity
6
+ };
7
+ export {
8
+ styles as default,
9
+ entities,
10
+ entity
11
+ };
12
+ //# sourceMappingURL=main.module.sass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.module.sass.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,32 @@
1
+ type EntityType = {
2
+ name: string;
3
+ color: string;
4
+ id: number;
5
+ description?: string;
6
+ };
7
+ type Match = any;
8
+ export interface Entity {
9
+ id: number;
10
+ name: string;
11
+ type?: number;
12
+ indices: [number, number];
13
+ children: Entity[];
14
+ match?: Match;
15
+ }
16
+ export { EntityType };
17
+ export type Highlight = {
18
+ start: number;
19
+ end: number;
20
+ tag?: string;
21
+ text?: string;
22
+ backgroundColor?: string;
23
+ borderColor?: string;
24
+ id: number;
25
+ parents?: number[];
26
+ match?: Match;
27
+ };
28
+ export interface EntityExt extends Omit<Entity, "type" | "children"> {
29
+ type: EntityType;
30
+ children: EntityExt[];
31
+ parents?: number[];
32
+ }