@eccenca/gui-elements 25.0.0-bugfixcenterednodecontentmenuitemscmem7184.0 → 25.0.0-featurecolorwheelinputcmem7327.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 (101) hide show
  1. package/CHANGELOG.md +34 -4
  2. package/dist/cjs/cmem/ActivityControl/ActivityControlWidget.js +17 -13
  3. package/dist/cjs/cmem/ActivityControl/ActivityControlWidget.js.map +1 -1
  4. package/dist/cjs/common/index.js +1 -0
  5. package/dist/cjs/common/index.js.map +1 -1
  6. package/dist/cjs/common/utils/colorHash.js +25 -11
  7. package/dist/cjs/common/utils/colorHash.js.map +1 -1
  8. package/dist/cjs/components/ColorField/ColorField.js +114 -0
  9. package/dist/cjs/components/ColorField/ColorField.js.map +1 -0
  10. package/dist/cjs/components/ContextOverlay/ContextOverlay.js +6 -6
  11. package/dist/cjs/components/ContextOverlay/ContextOverlay.js.map +1 -1
  12. package/dist/cjs/components/DecoupledOverlay/DecoupledOverlay.js +47 -0
  13. package/dist/cjs/components/DecoupledOverlay/DecoupledOverlay.js.map +1 -0
  14. package/dist/cjs/components/Icon/canonicalIconNames.js +3 -0
  15. package/dist/cjs/components/Icon/canonicalIconNames.js.map +1 -1
  16. package/dist/cjs/components/Icon/transformIcon.js +14 -0
  17. package/dist/cjs/components/Icon/transformIcon.js.map +1 -0
  18. package/dist/cjs/components/MultiSelect/MultiSelect.js +2 -1
  19. package/dist/cjs/components/MultiSelect/MultiSelect.js.map +1 -1
  20. package/dist/cjs/components/RadioButton/RadioButton.js +5 -2
  21. package/dist/cjs/components/RadioButton/RadioButton.js.map +1 -1
  22. package/dist/cjs/components/VisualTour/VisualTour.js +24 -32
  23. package/dist/cjs/components/VisualTour/VisualTour.js.map +1 -1
  24. package/dist/cjs/components/index.js +2 -0
  25. package/dist/cjs/components/index.js.map +1 -1
  26. package/dist/cjs/extensions/codemirror/CodeMirror.js +10 -1
  27. package/dist/cjs/extensions/codemirror/CodeMirror.js.map +1 -1
  28. package/dist/cjs/extensions/react-flow/edges/EdgeLabel.js +1 -1
  29. package/dist/cjs/extensions/react-flow/edges/EdgeLabel.js.map +1 -1
  30. package/dist/esm/cmem/ActivityControl/ActivityControlWidget.js +19 -14
  31. package/dist/esm/cmem/ActivityControl/ActivityControlWidget.js.map +1 -1
  32. package/dist/esm/common/index.js +2 -1
  33. package/dist/esm/common/index.js.map +1 -1
  34. package/dist/esm/common/utils/colorHash.js +25 -12
  35. package/dist/esm/common/utils/colorHash.js.map +1 -1
  36. package/dist/esm/components/ColorField/ColorField.js +139 -0
  37. package/dist/esm/components/ColorField/ColorField.js.map +1 -0
  38. package/dist/esm/components/ContextOverlay/ContextOverlay.js +3 -3
  39. package/dist/esm/components/ContextOverlay/ContextOverlay.js.map +1 -1
  40. package/dist/esm/components/DecoupledOverlay/DecoupledOverlay.js +41 -0
  41. package/dist/esm/components/DecoupledOverlay/DecoupledOverlay.js.map +1 -0
  42. package/dist/esm/components/Icon/canonicalIconNames.js +3 -0
  43. package/dist/esm/components/Icon/canonicalIconNames.js.map +1 -1
  44. package/dist/esm/components/Icon/transformIcon.js +21 -0
  45. package/dist/esm/components/Icon/transformIcon.js.map +1 -0
  46. package/dist/esm/components/MultiSelect/MultiSelect.js +3 -2
  47. package/dist/esm/components/MultiSelect/MultiSelect.js.map +1 -1
  48. package/dist/esm/components/RadioButton/RadioButton.js +6 -2
  49. package/dist/esm/components/RadioButton/RadioButton.js.map +1 -1
  50. package/dist/esm/components/VisualTour/VisualTour.js +25 -33
  51. package/dist/esm/components/VisualTour/VisualTour.js.map +1 -1
  52. package/dist/esm/components/index.js +2 -0
  53. package/dist/esm/components/index.js.map +1 -1
  54. package/dist/esm/extensions/codemirror/CodeMirror.js +10 -1
  55. package/dist/esm/extensions/codemirror/CodeMirror.js.map +1 -1
  56. package/dist/esm/extensions/react-flow/edges/EdgeLabel.js +1 -1
  57. package/dist/esm/extensions/react-flow/edges/EdgeLabel.js.map +1 -1
  58. package/dist/types/cmem/ActivityControl/ActivityControlWidget.d.ts +9 -0
  59. package/dist/types/common/index.d.ts +2 -1
  60. package/dist/types/common/utils/colorHash.d.ts +4 -3
  61. package/dist/types/components/ColorField/ColorField.d.ts +31 -0
  62. package/dist/types/components/ContextOverlay/ContextOverlay.d.ts +7 -1
  63. package/dist/types/components/DecoupledOverlay/DecoupledOverlay.d.ts +20 -0
  64. package/dist/types/components/Icon/canonicalIconNames.d.ts +2 -0
  65. package/dist/types/components/Icon/transformIcon.d.ts +2 -0
  66. package/dist/types/components/MultiSelect/MultiSelect.d.ts +1 -1
  67. package/dist/types/components/RadioButton/RadioButton.d.ts +8 -2
  68. package/dist/types/components/index.d.ts +2 -0
  69. package/package.json +1 -1
  70. package/src/cmem/ActivityControl/ActivityControlWidget.tsx +68 -35
  71. package/src/common/index.ts +2 -1
  72. package/src/common/utils/colorHash.ts +36 -18
  73. package/src/components/Application/_colors.scss +15 -0
  74. package/src/components/ColorField/ColorField.stories.tsx +69 -0
  75. package/src/components/ColorField/ColorField.tsx +200 -0
  76. package/src/components/ColorField/_colorfield.scss +56 -0
  77. package/src/components/ContextOverlay/ContextOverlay.tsx +20 -1
  78. package/src/components/DecoupledOverlay/DecoupledOverlay.stories.tsx +30 -0
  79. package/src/components/DecoupledOverlay/DecoupledOverlay.tsx +97 -0
  80. package/src/components/DecoupledOverlay/_decoupledoverlay.scss +46 -0
  81. package/src/components/Icon/canonicalIconNames.tsx +3 -0
  82. package/src/components/Icon/transformIcon.tsx +17 -0
  83. package/src/components/Link/Link.stories.tsx +30 -0
  84. package/src/components/Link/link.scss +28 -2
  85. package/src/components/MultiSelect/MultiSelect.tsx +12 -3
  86. package/src/components/RadioButton/RadioButton.tsx +15 -3
  87. package/src/components/RadioButton/radiobutton.scss +13 -0
  88. package/src/components/Tabs/stories/TabTitle.stories.tsx +7 -2
  89. package/src/components/Typography/_reset.scss +1 -0
  90. package/src/components/Typography/typography.scss +5 -0
  91. package/src/components/VisualTour/VisualTour.tsx +30 -50
  92. package/src/components/VisualTour/visualTour.scss +0 -34
  93. package/src/components/index.scss +2 -0
  94. package/src/components/index.ts +2 -0
  95. package/src/configuration/_customproperties.scss +32 -0
  96. package/src/configuration/stories/customproperties.stories.tsx +118 -0
  97. package/src/extensions/codemirror/CodeMirror.tsx +14 -6
  98. package/src/extensions/react-flow/_config.scss +3 -3
  99. package/src/extensions/react-flow/edges/EdgeLabel.tsx +5 -3
  100. package/src/extensions/react-flow/edges/_edges.scss +3 -2
  101. package/src/index.scss +1 -0
@@ -1,13 +1,25 @@
1
1
  import React from "react";
2
2
  import { Radio as BlueprintRadioButton, RadioProps as BlueprintRadioProps } from "@blueprintjs/core";
3
+ import classNames from "classnames";
3
4
 
4
5
  import { CLASSPREFIX as eccgui } from "../../configuration/constants";
5
6
 
6
- export type RadioButtonProps = BlueprintRadioProps;
7
+ export interface RadioButtonProps extends BlueprintRadioProps {
8
+ /**
9
+ * Hide the indicator.
10
+ * The element cannot be identified as radio input then but a click on the children can be easily processed via `onChange` event.
11
+ */
12
+ hideIndicator?: boolean;
13
+ }
7
14
 
8
- export const RadioButton = ({ children, className = "", ...restProps }: RadioButtonProps) => {
15
+ export const RadioButton = ({ children, className = "", hideIndicator = false, ...restProps }: RadioButtonProps) => {
9
16
  return (
10
- <BlueprintRadioButton {...restProps} className={`${eccgui}-radiobutton ` + className}>
17
+ <BlueprintRadioButton
18
+ {...restProps}
19
+ className={classNames(`${eccgui}-radiobutton`, className, {
20
+ [`${eccgui}-radiobutton--hidden-indicator`]: hideIndicator,
21
+ })}
22
+ >
11
23
  {children}
12
24
  </BlueprintRadioButton>
13
25
  );
@@ -29,3 +29,16 @@
29
29
  }
30
30
  }
31
31
  }
32
+
33
+ .#{$eccgui}-radiobutton--hidden-indicator {
34
+ &:not(.#{$ns}-align-right) {
35
+ padding-inline-start: 0;
36
+ }
37
+ &:not(.#{$ns}-align-left) {
38
+ padding-inline-end: 0;
39
+ }
40
+
41
+ input ~ .#{$ns}-control-indicator {
42
+ visibility: hidden;
43
+ }
44
+ }
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { Meta, StoryFn } from "@storybook/react";
3
3
 
4
- import { Tabs, TabTitle as TabTitleOrg } from "./../../../";
4
+ import { Tabs, TabTitle as TabTitleOrg, TabTitleProps } from "./../../../";
5
5
 
6
6
  export default {
7
7
  title: "Components/Tabs/TabTitle",
@@ -9,7 +9,7 @@ export default {
9
9
  argTypes: {},
10
10
  } as Meta<typeof TabTitleOrg>;
11
11
 
12
- const TabTitle = (args) => {
12
+ const TabTitle = (args: React.JSX.IntrinsicAttributes & TabTitleProps) => {
13
13
  return (
14
14
  <Tabs
15
15
  id="titledemo"
@@ -31,3 +31,8 @@ TabTitleElement.args = {
31
31
  titlePrefix: "[",
32
32
  titleSuffix: <span>]</span>,
33
33
  };
34
+
35
+ export const TabTitleSymbolElement = TemplateFull.bind({});
36
+ TabTitleSymbolElement.args = {
37
+ text: "★",
38
+ };
@@ -7,6 +7,7 @@ select,
7
7
  input,
8
8
  textarea {
9
9
  font-family: inherit;
10
+ font-size-adjust: inherit;
10
11
  border-radius: 0;
11
12
  }
12
13
 
@@ -17,6 +17,11 @@ body {
17
17
  text-rendering: optimizelegibility;
18
18
  -webkit-font-smoothing: antialiased;
19
19
  -moz-osx-font-smoothing: grayscale;
20
+ // User-facing text may contain Unicode symbols (e.g. "★") that fall outside the primary font stack.
21
+ // Browsers pick different system fallback fonts for such characters, causing glyphs to render at
22
+ // different optical sizes (smaller in Firefox). font-size-adjust normalises the fallback font size
23
+ // by matching the primary font's x-height, reducing the visual size discrepancy across browsers.
24
+ font-size-adjust: from-font;
20
25
  }
21
26
 
22
27
  code {
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  import { createPortal } from "react-dom";
3
- import { Classes as BlueprintClasses } from "@blueprintjs/core";
4
- import { createPopper } from "@popperjs/core";
5
3
 
6
4
  import { CLASSPREFIX as eccgui } from "../../configuration/constants";
7
5
  import {
@@ -14,6 +12,7 @@ import {
14
12
  CardHeader,
15
13
  CardOptions,
16
14
  CardTitle,
15
+ DecoupledOverlay,
17
16
  IconButton,
18
17
  Markdown,
19
18
  ModalSize,
@@ -130,7 +129,7 @@ export const VisualTour = ({
130
129
  <Button
131
130
  key={"next"}
132
131
  variant="outlined"
133
- intent={"primary"}
132
+ elevated
134
133
  onClick={() => {
135
134
  setCurrentStepIndex(currentStepIndex + 1);
136
135
  }}
@@ -144,7 +143,7 @@ export const VisualTour = ({
144
143
  text={closeLabel}
145
144
  onClick={closeTour}
146
145
  variant="outlined"
147
- intent={"primary"}
146
+ elevated
148
147
  rightIcon={"navigation-close"}
149
148
  />
150
149
  ),
@@ -292,25 +291,6 @@ interface StepPopoverProps {
292
291
 
293
292
  /** Popover that is displayed and points at the highlighted element. */
294
293
  const StepPopover = ({ highlightedElement, step, titleOption, actionButtons }: StepPopoverProps) => {
295
- const tooltipRef = React.useCallback(
296
- (tooltip: HTMLDivElement | null) => {
297
- if (tooltip) {
298
- createPopper(highlightedElement, tooltip, {
299
- placement: "auto",
300
- modifiers: [
301
- {
302
- name: "offset",
303
- options: {
304
- offset: [0, 15],
305
- },
306
- },
307
- ],
308
- });
309
- }
310
- },
311
- [highlightedElement]
312
- );
313
-
314
294
  const backdropRef = React.useCallback(
315
295
  (backdrop: HTMLDivElement | null) => {
316
296
  const highlightStencil = () => {
@@ -340,39 +320,39 @@ const StepPopover = ({ highlightedElement, step, titleOption, actionButtons }: S
340
320
  [highlightedElement]
341
321
  );
342
322
 
323
+ // map to only tooltip size because the `DecoupledOverlay` only supports them
324
+ let overlaySize: TooltipSize = "large";
325
+ switch (step.size) {
326
+ case "tiny":
327
+ overlaySize = "small";
328
+ break;
329
+ case "regular":
330
+ overlaySize = "medium";
331
+ break;
332
+ case "xlarge":
333
+ case "fullscreen":
334
+ overlaySize = "large";
335
+ break;
336
+ }
337
+
343
338
  return createPortal(
344
339
  <div className={`${eccgui}-visual-tour`}>
345
340
  <div className={`${eccgui}-visual-tour__focushelper`} ref={backdropRef} />
346
341
  <div>
347
342
  <div className={`${eccgui}-visual-tour__backdrop`} />
348
343
  </div>
349
- <div
350
- className={
351
- `${eccgui}-visual-tour__overlay` +
352
- ` ${eccgui}-visual-tour__overlay--${step.size ?? "large"}` +
353
- ` ${BlueprintClasses.POPOVER}`
354
- }
355
- role="tooltip"
356
- ref={tooltipRef}
357
- >
358
- <div
359
- className={`${eccgui}-visual-tour__arrow ${BlueprintClasses.POPOVER_ARROW}`}
360
- data-popper-arrow
361
- aria-hidden
362
- />
363
- <div className={`${BlueprintClasses.POPOVER_CONTENT} ${eccgui}-visual-tour__overlay__content`}>
364
- <Card isOnlyLayout elevation={-1} whitespaceAmount="small">
365
- <CardHeader>
366
- <CardTitle>{step.title}</CardTitle>
367
- <CardOptions>{titleOption}</CardOptions>
368
- </CardHeader>
369
- <CardContent>
370
- <StepContent step={step} />
371
- </CardContent>
372
- <CardActions inverseDirection>{actionButtons}</CardActions>
373
- </Card>
374
- </div>
375
- </div>
344
+ <DecoupledOverlay targetSelectorOrElement={highlightedElement} size={overlaySize} usePortal={false}>
345
+ <Card isOnlyLayout elevation={-1} whitespaceAmount="small">
346
+ <CardHeader>
347
+ <CardTitle>{step.title}</CardTitle>
348
+ <CardOptions>{titleOption}</CardOptions>
349
+ </CardHeader>
350
+ <CardContent>
351
+ <StepContent step={step} />
352
+ </CardContent>
353
+ <CardActions inverseDirection>{actionButtons}</CardActions>
354
+ </Card>
355
+ </DecoupledOverlay>
376
356
  </div>,
377
357
  document.body
378
358
  );
@@ -31,40 +31,6 @@
31
31
  opacity: 0;
32
32
  }
33
33
 
34
- .#{$eccgui}-visual-tour__arrow {
35
- &::before {
36
- background: $card-background-color;
37
- }
38
-
39
- .#{$eccgui}-visual-tour__overlay[data-popper-placement="top"] & {
40
- bottom: -0.5 * $eccgui-size-block-whitespace;
41
- }
42
- .#{$eccgui}-visual-tour__overlay[data-popper-placement="right"] & {
43
- left: -0.5 * $eccgui-size-block-whitespace;
44
- }
45
- .#{$eccgui}-visual-tour__overlay[data-popper-placement="bottom"] & {
46
- top: -0.5 * $eccgui-size-block-whitespace;
47
- }
48
- .#{$eccgui}-visual-tour__overlay[data-popper-placement="left"] & {
49
- right: -0.5 * $eccgui-size-block-whitespace;
50
- }
51
- }
52
-
53
- .#{$eccgui}-visual-tour__overlay {
54
- z-index: 8002; // 2 over application header
55
- &--small {
56
- @extend .#{$eccgui}-tooltip--small;
57
- }
58
-
59
- &--medium {
60
- @extend .#{$eccgui}-tooltip--medium;
61
- }
62
-
63
- &--large {
64
- @extend .#{$eccgui}-tooltip--large;
65
- }
66
- }
67
-
68
34
  .#{$eccgui}-card__content {
69
35
  .#{$eccgui}-visual-tour__overlay__content & {
70
36
  max-height: 45vh;
@@ -5,6 +5,7 @@
5
5
  @import "./Card/card";
6
6
  @import "./Chat/chat";
7
7
  @import "./Checkbox/checkbox";
8
+ @import "./DecoupledOverlay/decoupledoverlay";
8
9
  @import "./Depiction/depiction";
9
10
  @import "./Dialog/dialog";
10
11
  @import "./FlexibleLayout/flexiblelayout";
@@ -32,6 +33,7 @@
32
33
  @import "./Tabs/tabs";
33
34
  @import "./Tag/tag";
34
35
  @import "./TextField/textfield";
36
+ @import "./ColorField/colorfield";
35
37
  @import "./TagInput/taginput";
36
38
  @import "./Toolbar/toolbar";
37
39
  @import "./Tooltip/tooltip";
@@ -7,8 +7,10 @@ export * from "./Card";
7
7
  export * from "./Chat";
8
8
  export * from "./Checkbox/Checkbox";
9
9
  export * from "./CodeAutocompleteField";
10
+ export * from "./ColorField/ColorField";
10
11
  export * from "./ContentGroup/ContentGroup";
11
12
  export * from "./ContextOverlay";
13
+ export * from "./DecoupledOverlay/DecoupledOverlay";
12
14
  export * from "./Depiction/Depiction";
13
15
  export * from "./Dialog";
14
16
  export * from "./FlexibleLayout";
@@ -0,0 +1,32 @@
1
+ /**
2
+ * We mirror our SCSS variables here to improve availability in inline styles
3
+ * and module styles without included SCSS config stack.
4
+ * Colors are set in `src/components/Application/_colors.scss`.
5
+ */
6
+
7
+ :root {
8
+ --#{$eccgui}-size-typo-caption: #{$eccgui-size-typo-caption};
9
+ --#{$eccgui}-size-typo-caption-lineheight: #{$eccgui-size-typo-caption-lineheight};
10
+ --#{$eccgui}-size-typo-text: #{$eccgui-size-typo-text};
11
+ --#{$eccgui}-size-typo-text-lineheight: #{$eccgui-size-typo-text-lineheight};
12
+ --#{$eccgui}-size-typo-subtitle: #{$eccgui-size-typo-subtitle};
13
+ --#{$eccgui}-size-typo-subtitle-lineheight: #{$eccgui-size-typo-subtitle-lineheight};
14
+ --#{$eccgui}-size-typo-title: #{$eccgui-size-typo-title};
15
+ --#{$eccgui}-size-typo-title-lineheight: #{$eccgui-size-typo-title-lineheight};
16
+ --#{$eccgui}-size-typo-headline: #{$eccgui-size-typo-headline};
17
+ --#{$eccgui}-size-typo-headline-lineheight: #{$eccgui-size-typo-headline-lineheight};
18
+ --#{$eccgui}-font-weight-light: #{$eccgui-font-weight-light};
19
+ --#{$eccgui}-font-weight-regular: #{$eccgui-font-weight-regular};
20
+ --#{$eccgui}-font-weight-bold: #{$eccgui-font-weight-bold};
21
+ --#{$eccgui}-font-spacing-condensed: #{$eccgui-font-spacing-condensed};
22
+ --#{$eccgui}-font-spacing-regular: #{$eccgui-font-spacing-regular};
23
+ --#{$eccgui}-font-spacing-wide: #{$eccgui-font-spacing-wide};
24
+ --#{$eccgui}-size-block-whitespace: #{$eccgui-size-block-whitespace};
25
+ --#{$eccgui}-size-inline-whitespace: #{$eccgui-size-inline-whitespace};
26
+ --#{$eccgui}-opacity-regular: #{$eccgui-opacity-regular};
27
+ --#{$eccgui}-opacity-narrow: #{$eccgui-opacity-narrow};
28
+ --#{$eccgui}-opacity-muted: #{$eccgui-opacity-muted};
29
+ --#{$eccgui}-opacity-disabled: #{$eccgui-opacity-disabled};
30
+ --#{$eccgui}-opacity-ghostly: #{$eccgui-opacity-ghostly};
31
+ --#{$eccgui}-opacity-invisible: #{$eccgui-opacity-invisible};
32
+ }
@@ -0,0 +1,118 @@
1
+ import React from "react";
2
+ import { Meta, StoryFn } from "@storybook/react";
3
+
4
+ import CssCustomProperties from "../../common/utils/CssCustomProperties";
5
+ import {
6
+ Section,
7
+ SectionHeader,
8
+ Spacing,
9
+ Table,
10
+ TableBody,
11
+ TableCell,
12
+ TableContainer,
13
+ TableHead,
14
+ TableHeader,
15
+ TableRow,
16
+ TitleSubsection,
17
+ } from "../../components";
18
+ import { CLASSPREFIX as eccgui } from "../../index";
19
+
20
+ const groups: { title: string; filterName: (name: string) => boolean }[] = [
21
+ {
22
+ title: "Typography",
23
+ filterName: (name) => name.startsWith(`--${eccgui}-size-typo`),
24
+ },
25
+ {
26
+ title: "Font weights and spacing",
27
+ filterName: (name) => name.startsWith(`--${eccgui}-font`),
28
+ },
29
+ {
30
+ title: "Whitespace",
31
+ filterName: (name) => name.startsWith(`--${eccgui}-size-block`) || name.startsWith(`--${eccgui}-size-inline`),
32
+ },
33
+ {
34
+ title: "Color aliases",
35
+ filterName: (name) => name.startsWith(`--${eccgui}-color`) && !name.startsWith(`--${eccgui}-color-palette`),
36
+ },
37
+ {
38
+ title: "Opacity",
39
+ filterName: (name) => name.startsWith(`--${eccgui}-opacity`),
40
+ },
41
+ {
42
+ title: "Palette colors",
43
+ filterName: (name) => name.startsWith(`--${eccgui}-color-palette`),
44
+ },
45
+ ];
46
+
47
+ const CssCustomPropertiesOverview = () => {
48
+ return (
49
+ <>
50
+ {groups.map(({ title, filterName }) => {
51
+ const properties = new CssCustomProperties({
52
+ selectorText: ":root",
53
+ filterName,
54
+ removeDashPrefix: false,
55
+ returnObject: false,
56
+ }).customProperties() as string[][];
57
+
58
+ return (
59
+ <React.Fragment key={title}>
60
+ <Section>
61
+ <SectionHeader>
62
+ <TitleSubsection>{title}</TitleSubsection>
63
+ </SectionHeader>
64
+ <Spacing size="tiny" />
65
+ <TableContainer>
66
+ <Table columnWidths={["60%", "40%"]}>
67
+ <TableHead>
68
+ <TableRow>
69
+ <TableHeader>CSS custom property</TableHeader>
70
+ <TableHeader>Current value</TableHeader>
71
+ </TableRow>
72
+ </TableHead>
73
+ <TableBody>
74
+ {properties.map(([name, value]) => (
75
+ <TableRow key={name}>
76
+ <TableCell>
77
+ <code>{name}</code>
78
+ </TableCell>
79
+ <TableCell>
80
+ {name.startsWith(`--${eccgui}-color`) && (
81
+ <span
82
+ style={{
83
+ display: "inline-block",
84
+ width: `var(--${eccgui}-size-block-whitespace)`,
85
+ height: `var(--${eccgui}-size-block-whitespace)`,
86
+ backgroundColor: value,
87
+ verticalAlign: "middle",
88
+ marginRight: `var(--${eccgui}-size-inline-whitespace)`,
89
+ border: "1px solid currentColor",
90
+ }}
91
+ />
92
+ )}
93
+ <code>{value}</code>
94
+ </TableCell>
95
+ </TableRow>
96
+ ))}
97
+ </TableBody>
98
+ </Table>
99
+ </TableContainer>
100
+ </Section>
101
+ <Spacing size="large" />
102
+ </React.Fragment>
103
+ );
104
+ })}
105
+ </>
106
+ );
107
+ };
108
+
109
+ /**
110
+ * We mirror our SCSS configuration variables as CSS custom vars.
111
+ * This way they can be easily used for inline styles or in CSS modules without SCSS includes.
112
+ */
113
+ export default {
114
+ title: "Configuration/CSS Custom Properties",
115
+ component: CssCustomPropertiesOverview,
116
+ } as Meta<typeof CssCustomPropertiesOverview>;
117
+
118
+ export const Default: StoryFn = () => <CssCustomPropertiesOverview />;
@@ -227,10 +227,11 @@ export const CodeEditor = ({
227
227
  }: CodeEditorProps) => {
228
228
  const parent = useRef<any>(undefined);
229
229
  const [view, setView] = React.useState<EditorView | undefined>();
230
- const currentView = React.useRef<EditorView>()
231
- currentView.current = view
232
- const currentReadOnly = React.useRef(readOnly)
233
- currentReadOnly.current = readOnly
230
+ const currentView = React.useRef<EditorView>();
231
+ currentView.current = view;
232
+ const currentReadOnly = React.useRef(readOnly);
233
+ currentReadOnly.current = readOnly;
234
+ //const currentDisabled = React.useRef(disabled);
234
235
  const [showPreview, setShowPreview] = React.useState<boolean>(false);
235
236
  // CodeMirror Compartments in order to allow for re-configuration after initialization
236
237
  const readOnlyCompartment = React.useRef<Compartment>(compartment())
@@ -377,7 +378,7 @@ export const CodeEditor = ({
377
378
  }
378
379
 
379
380
  if (disabled) {
380
- view.dom.className += ` ${eccgui}-disabled`;
381
+ view.dom.classList.add(`${eccgui}-disabled`);
381
382
  }
382
383
 
383
384
  if (intent) {
@@ -432,7 +433,14 @@ export const CodeEditor = ({
432
433
  }, [tabIntentSize])
433
434
 
434
435
  React.useEffect(() => {
435
- updateExtension(EditorView?.editable.of(!disabled), disabledCompartment.current)
436
+ updateExtension(EditorView?.editable.of(!disabled), disabledCompartment.current);
437
+ if (view?.dom) {
438
+ if (disabled) {
439
+ view.dom.classList.add(`${eccgui}-disabled`);
440
+ } else {
441
+ view.dom.classList.remove(`${eccgui}-disabled`);
442
+ }
443
+ }
436
444
  }, [disabled])
437
445
 
438
446
  React.useEffect(() => {
@@ -8,9 +8,9 @@ $reactflow-node-font-size: $eccgui-size-typo-caption !default;
8
8
  $reactflow-node-border-width: 2 * $button-border-width !default;
9
9
  $reactflow-node-border-radius: $button-border-radius !default;
10
10
  $reactflow-edge-rendering: geometricprecision !default;
11
- $reactflow-edge-stroke-width-default: 2px !default;
12
- $reactflow-edge-stroke-width-hover: 2px !default;
13
- $reactflow-edge-stroke-width-selected: 2px !default;
11
+ $reactflow-edge-stroke-width-default: 1px !default;
12
+ $reactflow-edge-stroke-width-hover: 1px !default;
13
+ $reactflow-edge-stroke-width-selected: 1px !default;
14
14
  $reactflow-edge-stroke-opacity-default: $eccgui-opacity-muted !default;
15
15
  $reactflow-edge-stroke-opacity-hover: $eccgui-opacity-narrow !default;
16
16
  $reactflow-edge-stroke-opacity-selected: $eccgui-opacity-regular !default;
@@ -81,9 +81,11 @@ export const EdgeLabel = memo(
81
81
  })}
82
82
  </div>
83
83
  )}
84
- <div className={`${eccgui}-graphviz__edge-label__text`} title={title}>
85
- {typeof text === "string" ? <OverflowText>{text}</OverflowText> : text}
86
- </div>
84
+ {(title || text) && (
85
+ <div className={`${eccgui}-graphviz__edge-label__text`} title={title??undefined}>
86
+ {text && (typeof text === "string" ? <OverflowText>{text}</OverflowText> : text)}
87
+ </div>
88
+ )}
87
89
  {!!actions && <div className={`${eccgui}-graphviz__edge-label__aux`}>{actions}</div>}
88
90
  </div>
89
91
  );
@@ -258,6 +258,7 @@ path.react-flow__edge-path-highlight {
258
258
  min-height: $reactflow-node-basesize;
259
259
  max-height: $reactflow-node-basesize * 13;
260
260
  padding: $eccgui-size-block-whitespace * 0.5;
261
+ overflow-y: auto;
261
262
  }
262
263
 
263
264
  // Arrows
@@ -288,6 +289,7 @@ path.react-flow__edge-path-highlight {
288
289
  width: auto;
289
290
  max-width: 20rem;
290
291
  height: 0.5 * $reactflow-node-largesize;
292
+ padding: 0 $eccgui-size-block-whitespace * 0.25;
291
293
  font-size: $reactflow-node-font-size;
292
294
  color: var(--#{$eccgui}-reactflow-edge-label-color, currentColor);
293
295
  background-color: var(--#{$eccgui}-reactflow-edge-label-color-background, #{$card-background-color});
@@ -330,7 +332,6 @@ path.react-flow__edge-path-highlight {
330
332
  display: inline-flex;
331
333
  flex-grow: 0;
332
334
  flex-shrink: 0;
333
- margin-left: 2px;
334
335
  .#{$eccgui}-depiction__image {
335
336
  height: calc(#{0.5 * $reactflow-node-largesize} - 4px);
336
337
 
@@ -342,7 +343,7 @@ path.react-flow__edge-path-highlight {
342
343
  .#{$eccgui}-graphviz__edge-label__text {
343
344
  flex-grow: 1;
344
345
  flex-shrink: 1;
345
- margin: 0 $eccgui-size-block-whitespace * 0.25;
346
+ margin: 0 0 0 $eccgui-size-block-whitespace * 0.25;
346
347
  overflow: hidden;
347
348
  text-overflow: ellipsis;
348
349
  text-align: center;
package/src/index.scss CHANGED
@@ -9,6 +9,7 @@
9
9
  // == load default configuration ===============================================
10
10
 
11
11
  @import "./configuration/variables";
12
+ @import "./configuration/customproperties"; // mirror config as custom properties
12
13
 
13
14
  // == Necessary imports from libraries =========================================
14
15