@x15ventures/x15-ui-library 3.16.1 → 3.17.0

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 (95) hide show
  1. package/dist/cjs/autoGenerated/libraryThemes.js +12 -12
  2. package/dist/cjs/autoGenerated/libraryThemes.js.map +1 -1
  3. package/dist/cjs/autoGenerated/libraryThemes.json +12 -12
  4. package/dist/cjs/components/design/dialog/Dialog.js +3 -1
  5. package/dist/cjs/components/design/dialog/Dialog.js.map +1 -1
  6. package/dist/cjs/components/design/dialog/dialog.css +5 -0
  7. package/dist/cjs/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.js +88 -0
  8. package/dist/cjs/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.js.map +1 -0
  9. package/dist/cjs/components/design/progressIndicators/circularProgressIndicator/circularProgressIndicator.css +301 -0
  10. package/dist/cjs/components/design/tooltip/Tooltip.js +42 -5
  11. package/dist/cjs/components/design/tooltip/Tooltip.js.map +1 -1
  12. package/dist/cjs/components/design/tooltip/index.js +6 -0
  13. package/dist/cjs/components/design/tooltip/index.js.map +1 -1
  14. package/dist/cjs/components/design/tooltip/tooltip.css +18 -7
  15. package/dist/cjs/components/index.js +7 -0
  16. package/dist/cjs/components/index.js.map +1 -1
  17. package/dist/cjs/hooks/InteractiveHostFocus.js +62 -0
  18. package/dist/cjs/hooks/InteractiveHostFocus.js.map +1 -0
  19. package/dist/cjs/hooks/index.js +7 -0
  20. package/dist/cjs/hooks/index.js.map +1 -1
  21. package/dist/cjs/index.js +22 -0
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/cjs/package.json +1 -1
  24. package/dist/cjs/widgets/index.js +14 -0
  25. package/dist/cjs/widgets/index.js.map +1 -0
  26. package/dist/cjs/widgets/processLauncher/ProcessLauncher.js +278 -0
  27. package/dist/cjs/widgets/processLauncher/ProcessLauncher.js.map +1 -0
  28. package/dist/cjs/widgets/processLauncher/index.js +13 -0
  29. package/dist/cjs/widgets/processLauncher/index.js.map +1 -0
  30. package/dist/cjs/widgets/processLauncher/processLauncher.interfaces.js +6 -0
  31. package/dist/cjs/widgets/processLauncher/processLauncher.interfaces.js.map +1 -0
  32. package/dist/components/design/dialog/Dialog.d.ts.map +1 -1
  33. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.d.ts +17 -0
  34. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.d.ts.map +1 -0
  35. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts +5 -0
  36. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts.map +1 -0
  37. package/dist/components/design/tooltip/Tooltip.d.ts +13 -0
  38. package/dist/components/design/tooltip/Tooltip.d.ts.map +1 -1
  39. package/dist/components/design/tooltip/Tooltip.test.d.ts +1 -1
  40. package/dist/components/design/tooltip/Tooltip.test.d.ts.map +1 -1
  41. package/dist/components/design/tooltip/index.d.ts +1 -1
  42. package/dist/components/design/tooltip/index.d.ts.map +1 -1
  43. package/dist/components/index.d.ts +2 -0
  44. package/dist/components/index.d.ts.map +1 -1
  45. package/dist/esm/autoGenerated/libraryThemes.js +12 -12
  46. package/dist/esm/autoGenerated/libraryThemes.js.map +1 -1
  47. package/dist/esm/autoGenerated/libraryThemes.json +12 -12
  48. package/dist/esm/components/design/dialog/Dialog.js +3 -1
  49. package/dist/esm/components/design/dialog/Dialog.js.map +1 -1
  50. package/dist/esm/components/design/dialog/dialog.css +5 -0
  51. package/dist/esm/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.js +81 -0
  52. package/dist/esm/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.js.map +1 -0
  53. package/dist/esm/components/design/progressIndicators/circularProgressIndicator/circularProgressIndicator.css +301 -0
  54. package/dist/esm/components/design/tooltip/Tooltip.js +40 -4
  55. package/dist/esm/components/design/tooltip/Tooltip.js.map +1 -1
  56. package/dist/esm/components/design/tooltip/index.js +1 -1
  57. package/dist/esm/components/design/tooltip/index.js.map +1 -1
  58. package/dist/esm/components/design/tooltip/tooltip.css +18 -7
  59. package/dist/esm/components/index.js +1 -0
  60. package/dist/esm/components/index.js.map +1 -1
  61. package/dist/esm/hooks/InteractiveHostFocus.js +56 -0
  62. package/dist/esm/hooks/InteractiveHostFocus.js.map +1 -0
  63. package/dist/esm/hooks/index.js +1 -0
  64. package/dist/esm/hooks/index.js.map +1 -1
  65. package/dist/esm/index.js +3 -2
  66. package/dist/esm/index.js.map +1 -1
  67. package/dist/esm/package.json +1 -1
  68. package/dist/esm/widgets/index.js +4 -0
  69. package/dist/esm/widgets/index.js.map +1 -0
  70. package/dist/esm/widgets/processLauncher/ProcessLauncher.js +269 -0
  71. package/dist/esm/widgets/processLauncher/ProcessLauncher.js.map +1 -0
  72. package/dist/esm/widgets/processLauncher/index.js +2 -0
  73. package/dist/esm/widgets/processLauncher/index.js.map +1 -0
  74. package/dist/esm/widgets/processLauncher/processLauncher.interfaces.js +2 -0
  75. package/dist/esm/widgets/processLauncher/processLauncher.interfaces.js.map +1 -0
  76. package/dist/hooks/InteractiveHostFocus.d.ts +12 -0
  77. package/dist/hooks/InteractiveHostFocus.d.ts.map +1 -0
  78. package/dist/hooks/InteractiveHostFocus.test.d.ts +5 -0
  79. package/dist/hooks/InteractiveHostFocus.test.d.ts.map +1 -0
  80. package/dist/hooks/index.d.ts +1 -0
  81. package/dist/hooks/index.d.ts.map +1 -1
  82. package/dist/index.d.ts +5 -3
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/package.json +1 -1
  85. package/dist/widgets/index.d.ts +3 -0
  86. package/dist/widgets/index.d.ts.map +1 -0
  87. package/dist/widgets/processLauncher/ProcessLauncher.d.ts +21 -0
  88. package/dist/widgets/processLauncher/ProcessLauncher.d.ts.map +1 -0
  89. package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts +5 -0
  90. package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts.map +1 -0
  91. package/dist/widgets/processLauncher/index.d.ts +4 -0
  92. package/dist/widgets/processLauncher/index.d.ts.map +1 -0
  93. package/dist/widgets/processLauncher/processLauncher.interfaces.d.ts +45 -0
  94. package/dist/widgets/processLauncher/processLauncher.interfaces.d.ts.map +1 -0
  95. package/package.json +1 -1
@@ -10,8 +10,8 @@
10
10
  "map": "index.min.css.map"
11
11
  },
12
12
  "versioned": {
13
- "css": "base.min.3.16.1.css",
14
- "map": "base.min.3.16.1.css.map"
13
+ "css": "base.min.3.17.0.css",
14
+ "map": "base.min.3.17.0.css.map"
15
15
  }
16
16
  },
17
17
  "cba": {
@@ -25,8 +25,8 @@
25
25
  "map": "cba.min.css.map"
26
26
  },
27
27
  "versioned": {
28
- "css": "cba.min.3.16.1.css",
29
- "map": "cba.min.3.16.1.css.map"
28
+ "css": "cba.min.3.17.0.css",
29
+ "map": "cba.min.3.17.0.css.map"
30
30
  }
31
31
  },
32
32
  "creditSavvy": {
@@ -40,8 +40,8 @@
40
40
  "map": "creditSavvy.min.css.map"
41
41
  },
42
42
  "versioned": {
43
- "css": "creditSavvy.min.3.16.1.css",
44
- "map": "creditSavvy.min.3.16.1.css.map"
43
+ "css": "creditSavvy.min.3.17.0.css",
44
+ "map": "creditSavvy.min.3.17.0.css.map"
45
45
  }
46
46
  },
47
47
  "doshii": {
@@ -55,8 +55,8 @@
55
55
  "map": "doshii.min.css.map"
56
56
  },
57
57
  "versioned": {
58
- "css": "doshii.min.3.16.1.css",
59
- "map": "doshii.min.3.16.1.css.map"
58
+ "css": "doshii.min.3.17.0.css",
59
+ "map": "doshii.min.3.17.0.css.map"
60
60
  }
61
61
  },
62
62
  "homeIn": {
@@ -70,8 +70,8 @@
70
70
  "map": "homeIn.min.css.map"
71
71
  },
72
72
  "versioned": {
73
- "css": "homeIn.min.3.16.1.css",
74
- "map": "homeIn.min.3.16.1.css.map"
73
+ "css": "homeIn.min.3.17.0.css",
74
+ "map": "homeIn.min.3.17.0.css.map"
75
75
  }
76
76
  },
77
77
  "x15Core": {
@@ -85,8 +85,8 @@
85
85
  "map": "x15Core.min.css.map"
86
86
  },
87
87
  "versioned": {
88
- "css": "x15Core.min.3.16.1.css",
89
- "map": "x15Core.min.3.16.1.css.map"
88
+ "css": "x15Core.min.3.17.0.css",
89
+ "map": "x15Core.min.3.17.0.css.map"
90
90
  }
91
91
  }
92
92
  }
@@ -64,7 +64,9 @@ export const Dialog = ({
64
64
  } else {
65
65
  HandleClose();
66
66
  }
67
- }, [customCssClasses, createOverlay, open, isOpen, HandleOpen, HandleClose, dialogHeaderElement]);
67
+ // customCssClasses is intentionally excluded: it isn't read here, and including it (as a
68
+ // fresh object reference on every parent render) re-ran this effect and stole focus on each keystroke.
69
+ }, [createOverlay, open, isOpen, HandleOpen, HandleClose, dialogHeaderElement]);
68
70
  const DialogCloseButton = () => /*#__PURE__*/React.createElement("button", {
69
71
  ref: dialogCloseButton,
70
72
  className: "dialogClose",
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","names":["React","useCallback","useEffect","useRef","useState","useMemo","xmarkLarge","SvgIcon","EllipsisTooltip","useDialogOverlay","useFocusTrap","Dialog","id","size","position","animation","scrollBehaviour","onClose","open","overlay","header","footer","children","screenReaderInstruction","customCssClasses","showFocusOutline","isOpen","setIsOpen","dialogElement","dialogHeaderElement","TOGGLE_TEXT","dialogCloseButton","createOverlay","removeOverlay","HandleClose","dialogCssClass","dialog","HandleOpen","dialogOverlay","showOverlay","current","focus","DialogCloseButton","createElement","ref","className","title","type","onClick","svgDefinition","role","tabIndex","lineClamp","tooltipProps","customCssClass","content"],"sources":["../../../../../src/components/design/dialog/Dialog.tsx"],"sourcesContent":["/* eslint-disable jsxA11y/no-noninteractive-tabindex */\n'use client';\n\nimport React, { ReactNode, useCallback, useEffect, useRef, useState, useMemo } from 'react';\nimport { xmarkLarge } from '@x15ventures/x15-ui-library-icons/iconDefinitions/index';\nimport { SvgIcon } from '@x15ventures/x15-ui-library-icons/svgIcon/SvgIcon';\nimport { EllipsisTooltip } from '../tooltip';\nimport { GenericFunction } from '../../../interfaces';\nimport { useDialogOverlay } from '../../../hooks/DialogOverlay';\nimport { useFocusTrap } from '../../../hooks/FocusTrap';\n\nimport './dialog.scss';\n\nexport interface DialogInterface {\n id: string;\n size?: 'xs' | 's' | 'm' | 'l' | 'xl' | 'dynamic';\n position?: 'left' | 'right' | 'top' | 'bottom' | 'center' | 'topleft' | 'topright' | 'bottomleft' | 'bottomright';\n animation?: 'none' | 'grow' | 'reveal';\n scrollBehaviour?: 'contentOnly' | 'contentAndFooter' | 'all';\n onClose: GenericFunction;\n open?: boolean;\n overlay?: {\n parentNode?: HTMLElement;\n customCssClass?: string;\n };\n header: string | ReactNode;\n footer?: string | ReactNode;\n children: ReactNode;\n screenReaderInstruction?: string;\n showFocusOutline?: boolean;\n customCssClasses?: {\n dialog?: string;\n content?: string;\n header?: string;\n footer?: string;\n };\n}\n\nexport const Dialog: React.FC<DialogInterface> = ({\n id,\n size = 'm',\n position = 'center',\n animation = 'none',\n scrollBehaviour = 'contentOnly',\n onClose = () => {},\n open = false,\n overlay,\n header,\n footer,\n children,\n screenReaderInstruction = `The following content is in a dialog. \n You can press the Tab key to navigate through the elements, and press Escape to close the dialog.`,\n customCssClasses,\n showFocusOutline = false,\n}) => {\n const [isOpen, setIsOpen] = useState<boolean>(open);\n const dialogElement = useRef<HTMLDivElement>(null);\n const dialogHeaderElement = useRef<HTMLDivElement>(null);\n\n const TOGGLE_TEXT = 'Open and close dialog';\n const dialogCloseButton = useRef(null);\n\n const { createOverlay, removeOverlay } = useDialogOverlay(overlay || {});\n useFocusTrap(dialogElement, () => HandleClose());\n\n const dialogCssClass = useMemo(() => {\n return `dialog \n ${ isOpen || open ? 'isOpen' : '' }\n dialogSize_${ size }\n dialogPosition_${ position }\n dialogAnimation_${ animation }\n dialogScrollBehaviour_${ scrollBehaviour }\n ${ size === 'dynamic' ? 'dialogSize_dynamic' : '' }\n ${ customCssClasses?.dialog || '' }\n ${ showFocusOutline ? 'showFocusOutline' : '' }`;\n }, [open, isOpen, size, position, animation, scrollBehaviour, customCssClasses, showFocusOutline]);\n\n const HandleClose = useCallback(() => {\n setIsOpen(false);\n removeOverlay();\n onClose();\n }, [onClose, removeOverlay]);\n\n const HandleOpen = useCallback(() => {\n const dialogOverlay = createOverlay();\n dialogOverlay.showOverlay();\n }, [createOverlay]);\n\n useEffect(() => {\n if (open || isOpen) {\n if (dialogHeaderElement.current) {\n dialogHeaderElement.current.focus();\n }\n HandleOpen();\n } else {\n HandleClose();\n }\n }, [customCssClasses, createOverlay, open, isOpen, HandleOpen, HandleClose, dialogHeaderElement]);\n\n const DialogCloseButton: React.FC = () => (\n <button\n ref={ dialogCloseButton }\n className=\"dialogClose\"\n title={ TOGGLE_TEXT }\n type=\"button\"\n onClick={ () => HandleClose() }\n >\n <SvgIcon svgDefinition={ xmarkLarge } />\n <span className=\"sr-only\">Close dialog</span>\n </button>\n );\n\n return (\n <div\n className={ dialogCssClass }\n role=\"dialog\"\n aria-labelledby={ `dialogHeader_${ id }` }\n tabIndex={ 0 }\n aria-describedby={ `dialogSRInstruction_${ id }` }\n aria-modal=\"true\"\n ref={ dialogElement }\n >\n <div className=\"dialogFullScroller\">\n <div\n ref={ dialogHeaderElement }\n id={ `dialogHeader_${ id }` }\n className={ `dialogHeader ${ customCssClasses?.header || '' }` }\n tabIndex={ 0 }\n >\n <span id={ `dialogSRInstruction_${ id }` } className=\"sr-only\">\n { screenReaderInstruction }\n </span>\n <div className=\"dialogHeaderTextWrapper\">\n <EllipsisTooltip \n lineClamp={ 2 } \n tooltipProps={ { \n customCssClass: 'shiftDown large dialogEllipsisTooltip'\n } }\n >\n { typeof header === 'string' ? <span className=\"dialogHeaderText\">{ header }</span> : header }\n </EllipsisTooltip>\n </div>\n <DialogCloseButton />\n </div>\n\n <div className=\"dialogContentAndFooterScroller\">\n <section className={ `dialogContent ${ customCssClasses?.content || '' }` } tabIndex={ 0 }>\n { children }\n </section>\n\n {\n footer && (\n <div className={ `dialogFooter ${ customCssClasses?.footer || '' }` } tabIndex={ 0 }>\n { typeof footer === 'string' ? <span className=\"dialogFooterText\">{ footer }</span> : footer }\n </div>\n )\n }\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Dialog.js","names":["React","useCallback","useEffect","useRef","useState","useMemo","xmarkLarge","SvgIcon","EllipsisTooltip","useDialogOverlay","useFocusTrap","Dialog","id","size","position","animation","scrollBehaviour","onClose","open","overlay","header","footer","children","screenReaderInstruction","customCssClasses","showFocusOutline","isOpen","setIsOpen","dialogElement","dialogHeaderElement","TOGGLE_TEXT","dialogCloseButton","createOverlay","removeOverlay","HandleClose","dialogCssClass","dialog","HandleOpen","dialogOverlay","showOverlay","current","focus","DialogCloseButton","createElement","ref","className","title","type","onClick","svgDefinition","role","tabIndex","lineClamp","tooltipProps","customCssClass","content"],"sources":["../../../../../src/components/design/dialog/Dialog.tsx"],"sourcesContent":["/* eslint-disable jsxA11y/no-noninteractive-tabindex */\n'use client';\n\nimport React, { ReactNode, useCallback, useEffect, useRef, useState, useMemo } from 'react';\nimport { xmarkLarge } from '@x15ventures/x15-ui-library-icons/iconDefinitions/index';\nimport { SvgIcon } from '@x15ventures/x15-ui-library-icons/svgIcon/SvgIcon';\nimport { EllipsisTooltip } from '../tooltip';\nimport { GenericFunction } from '../../../interfaces';\nimport { useDialogOverlay } from '../../../hooks/DialogOverlay';\nimport { useFocusTrap } from '../../../hooks/FocusTrap';\n\nimport './dialog.scss';\n\nexport interface DialogInterface {\n id: string;\n size?: 'xs' | 's' | 'm' | 'l' | 'xl' | 'dynamic';\n position?: 'left' | 'right' | 'top' | 'bottom' | 'center' | 'topleft' | 'topright' | 'bottomleft' | 'bottomright';\n animation?: 'none' | 'grow' | 'reveal';\n scrollBehaviour?: 'contentOnly' | 'contentAndFooter' | 'all';\n onClose: GenericFunction;\n open?: boolean;\n overlay?: {\n parentNode?: HTMLElement;\n customCssClass?: string;\n };\n header: string | ReactNode;\n footer?: string | ReactNode;\n children: ReactNode;\n screenReaderInstruction?: string;\n showFocusOutline?: boolean;\n customCssClasses?: {\n dialog?: string;\n content?: string;\n header?: string;\n footer?: string;\n };\n}\n\nexport const Dialog: React.FC<DialogInterface> = ({\n id,\n size = 'm',\n position = 'center',\n animation = 'none',\n scrollBehaviour = 'contentOnly',\n onClose = () => {},\n open = false,\n overlay,\n header,\n footer,\n children,\n screenReaderInstruction = `The following content is in a dialog. \n You can press the Tab key to navigate through the elements, and press Escape to close the dialog.`,\n customCssClasses,\n showFocusOutline = false,\n}) => {\n const [isOpen, setIsOpen] = useState<boolean>(open);\n const dialogElement = useRef<HTMLDivElement>(null);\n const dialogHeaderElement = useRef<HTMLDivElement>(null);\n\n const TOGGLE_TEXT = 'Open and close dialog';\n const dialogCloseButton = useRef(null);\n\n const { createOverlay, removeOverlay } = useDialogOverlay(overlay || {});\n useFocusTrap(dialogElement, () => HandleClose());\n\n const dialogCssClass = useMemo(() => {\n return `dialog \n ${ isOpen || open ? 'isOpen' : '' }\n dialogSize_${ size }\n dialogPosition_${ position }\n dialogAnimation_${ animation }\n dialogScrollBehaviour_${ scrollBehaviour }\n ${ size === 'dynamic' ? 'dialogSize_dynamic' : '' }\n ${ customCssClasses?.dialog || '' }\n ${ showFocusOutline ? 'showFocusOutline' : '' }`;\n }, [open, isOpen, size, position, animation, scrollBehaviour, customCssClasses, showFocusOutline]);\n\n const HandleClose = useCallback(() => {\n setIsOpen(false);\n removeOverlay();\n onClose();\n }, [onClose, removeOverlay]);\n\n const HandleOpen = useCallback(() => {\n const dialogOverlay = createOverlay();\n dialogOverlay.showOverlay();\n }, [createOverlay]);\n\n useEffect(() => {\n if (open || isOpen) {\n if (dialogHeaderElement.current) {\n dialogHeaderElement.current.focus();\n }\n HandleOpen();\n } else {\n HandleClose();\n }\n // customCssClasses is intentionally excluded: it isn't read here, and including it (as a\n // fresh object reference on every parent render) re-ran this effect and stole focus on each keystroke.\n }, [createOverlay, open, isOpen, HandleOpen, HandleClose, dialogHeaderElement]);\n\n const DialogCloseButton: React.FC = () => (\n <button\n ref={ dialogCloseButton }\n className=\"dialogClose\"\n title={ TOGGLE_TEXT }\n type=\"button\"\n onClick={ () => HandleClose() }\n >\n <SvgIcon svgDefinition={ xmarkLarge } />\n <span className=\"sr-only\">Close dialog</span>\n </button>\n );\n\n return (\n <div\n className={ dialogCssClass }\n role=\"dialog\"\n aria-labelledby={ `dialogHeader_${ id }` }\n tabIndex={ 0 }\n aria-describedby={ `dialogSRInstruction_${ id }` }\n aria-modal=\"true\"\n ref={ dialogElement }\n >\n <div className=\"dialogFullScroller\">\n <div\n ref={ dialogHeaderElement }\n id={ `dialogHeader_${ id }` }\n className={ `dialogHeader ${ customCssClasses?.header || '' }` }\n tabIndex={ 0 }\n >\n <span id={ `dialogSRInstruction_${ id }` } className=\"sr-only\">\n { screenReaderInstruction }\n </span>\n <div className=\"dialogHeaderTextWrapper\">\n <EllipsisTooltip \n lineClamp={ 2 } \n tooltipProps={ { \n customCssClass: 'shiftDown large dialogEllipsisTooltip'\n } }\n >\n { typeof header === 'string' ? <span className=\"dialogHeaderText\">{ header }</span> : header }\n </EllipsisTooltip>\n </div>\n <DialogCloseButton />\n </div>\n\n <div className=\"dialogContentAndFooterScroller\">\n <section className={ `dialogContent ${ customCssClasses?.content || '' }` } tabIndex={ 0 }>\n { children }\n </section>\n\n {\n footer && (\n <div className={ `dialogFooter ${ customCssClasses?.footer || '' }` } tabIndex={ 0 }>\n { typeof footer === 'string' ? <span className=\"dialogFooterText\">{ footer }</span> : footer }\n </div>\n )\n }\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -129,6 +129,11 @@
129
129
  justify-content: flex-start;
130
130
  min-height: var(--dialogFooterHeight, 50px);
131
131
  }
132
+ .dialog .dialogFooter .actionButtons {
133
+ display: flex;
134
+ width: 100%;
135
+ justify-content: space-between;
136
+ }
132
137
  .dialog .dialogFullScroller {
133
138
  flex: 1;
134
139
  box-sizing: border-box;
@@ -0,0 +1,81 @@
1
+ 'use client';
2
+
3
+ import _extends from "@babel/runtime/helpers/extends";
4
+ import React from 'react';
5
+ import { Tooltip } from '../../tooltip/Tooltip';
6
+ import './circularProgressIndicator.css';
7
+ export const CircularProgressIndicator = ({
8
+ name,
9
+ progress,
10
+ description = '',
11
+ statusMessage = '',
12
+ icon = null,
13
+ hideLabel = false,
14
+ id,
15
+ mode = 'default',
16
+ onClickHandler,
17
+ size = 'default'
18
+ }) => {
19
+ const clampedProgress = Math.min(100, Math.max(0, progress));
20
+ const progressCopy = `${clampedProgress}% complete`;
21
+ const progressSummary = `${progressCopy}${description ? ` ${description}` : ''}`;
22
+ const hasStatus = mode !== 'default';
23
+ const statusTooltipId = `${id}_status`;
24
+ const isActionable = typeof onClickHandler === 'function';
25
+ const getTitle = () => {
26
+ if (statusMessage) {
27
+ return statusMessage;
28
+ }
29
+ return progressSummary;
30
+ };
31
+ const modeIconsMap = {
32
+ default: '',
33
+ warning: 'warning',
34
+ error: 'notification',
35
+ success: 'checkmark'
36
+ };
37
+ const progressIndicatorContent = /*#__PURE__*/React.createElement("span", {
38
+ className: "progressIndicator"
39
+ }, /*#__PURE__*/React.createElement("span", {
40
+ className: "glowRing"
41
+ }), /*#__PURE__*/React.createElement("span", {
42
+ className: "progressRing"
43
+ }), /*#__PURE__*/React.createElement("span", {
44
+ className: "actionIcon"
45
+ }, icon, /*#__PURE__*/React.createElement("span", {
46
+ className: `labelText ${hideLabel || size === 'xsmall' ? 'sr-only' : ''}`
47
+ }, name)), hasStatus && /*#__PURE__*/React.createElement("span", {
48
+ className: "statusIndicator"
49
+ }, /*#__PURE__*/React.createElement(Tooltip, {
50
+ passiveTrigger: true,
51
+ triggerId: statusTooltipId,
52
+ customCssClass: "statusIcon",
53
+ icon: modeIconsMap[mode]
54
+ }, getTitle())));
55
+ const sharedProps = {
56
+ className: `circularProgressIndicator ${mode}Mode ${size}`,
57
+ id,
58
+ style: {
59
+ '--progress': `${clampedProgress}%`
60
+ },
61
+ title: hasStatus ? '' : getTitle(),
62
+ 'aria-label': progressSummary,
63
+ ...(hasStatus ? {
64
+ 'aria-describedby': statusTooltipId + '_content'
65
+ } : {})
66
+ };
67
+ if (isActionable) {
68
+ return /*#__PURE__*/React.createElement("button", _extends({}, sharedProps, {
69
+ type: "button",
70
+ onClick: onClickHandler
71
+ }), progressIndicatorContent);
72
+ }
73
+ return /*#__PURE__*/React.createElement("div", _extends({}, sharedProps, {
74
+ role: "progressbar",
75
+ "aria-valuemin": 0,
76
+ "aria-valuemax": 100,
77
+ "aria-valuenow": clampedProgress
78
+ }), progressIndicatorContent);
79
+ };
80
+ export default CircularProgressIndicator;
81
+ //# sourceMappingURL=CircularProgressIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircularProgressIndicator.js","names":["_extends","React","Tooltip","CircularProgressIndicator","name","progress","description","statusMessage","icon","hideLabel","id","mode","onClickHandler","size","clampedProgress","Math","min","max","progressCopy","progressSummary","hasStatus","statusTooltipId","isActionable","getTitle","modeIconsMap","default","warning","error","success","progressIndicatorContent","createElement","className","passiveTrigger","triggerId","customCssClass","sharedProps","style","title","type","onClick","role"],"sources":["../../../../../../src/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport { Tooltip } from '../../tooltip/Tooltip';\n\nimport './circularProgressIndicator.scss';\n\nexport interface CircularProgressIndicatorProps {\n name: string;\n progress: number; // 0 - 100\n description?: string;\n statusMessage?: string;\n icon?: React.ReactNode;\n hideLabel?: boolean;\n id: string;\n onClickHandler?: () => void;\n mode?: 'default' | 'warning' | 'error' | 'success';\n size?: 'xsmall' | 'small' | 'default' | 'large' | 'xlarge';\n}\n\nexport const CircularProgressIndicator: React.FC<CircularProgressIndicatorProps> = (\n {\n name,\n progress,\n description = '',\n statusMessage = '',\n icon = null,\n hideLabel = false,\n id,\n mode = 'default',\n onClickHandler,\n size = 'default',\n }\n) => {\n const clampedProgress = Math.min(100, Math.max(0, progress));\n const progressCopy = `${ clampedProgress }% complete`;\n const progressSummary = `${ progressCopy }${ description ? ` ${ description }` : '' }`;\n const hasStatus = mode !== 'default';\n const statusTooltipId = `${ id }_status`;\n const isActionable = typeof onClickHandler === 'function';\n \n const getTitle = () => {\n if (statusMessage) {\n return statusMessage;\n }\n return progressSummary;\n };\n\n const modeIconsMap = {\n default: '',\n warning: 'warning',\n error: 'notification',\n success: 'checkmark',\n };\n\n const progressIndicatorContent = (\n <span className=\"progressIndicator\">\n <span className=\"glowRing\" />\n <span className=\"progressRing\" />\n <span className=\"actionIcon\">\n { icon }\n <span className={ `labelText ${ hideLabel || size === 'xsmall' ? 'sr-only' : '' }` }>{ name }</span>\n </span>\n\n { hasStatus &&\n <span className=\"statusIndicator\">\n <Tooltip\n passiveTrigger\n triggerId={ statusTooltipId }\n customCssClass=\"statusIcon\"\n icon={ modeIconsMap[mode] }\n >\n { getTitle() }\n </Tooltip>\n </span>\n }\n </span>\n );\n\n const sharedProps = {\n className: `circularProgressIndicator ${ mode }Mode ${ size }`,\n id,\n style: {\n '--progress': `${ clampedProgress }%`,\n } as React.CSSProperties,\n title: hasStatus ? '' : getTitle(),\n 'aria-label': progressSummary,\n ...(hasStatus ? { 'aria-describedby': statusTooltipId + '_content' } : {}),\n };\n\n if (isActionable) {\n return (\n <button\n { ...sharedProps }\n type=\"button\"\n onClick={ onClickHandler }\n >\n { progressIndicatorContent }\n </button>\n );\n }\n\n return (\n <div\n { ...sharedProps }\n role=\"progressbar\"\n aria-valuemin={ 0 }\n aria-valuemax={ 100 }\n aria-valuenow={ clampedProgress }\n >\n { progressIndicatorContent }\n </div>\n );\n};\n\nexport default CircularProgressIndicator;"],"mappings":"AAAA,YAAY;;AAAC,OAAAA,QAAA;AAEb,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,OAAO,QAAQ,uBAAuB;AAE/C,OAAO,kCAAkC;AAezC,OAAO,MAAMC,yBAAmE,GAAGA,CACjF;EACEC,IAAI;EACJC,QAAQ;EACRC,WAAW,GAAG,EAAE;EAChBC,aAAa,GAAG,EAAE;EAClBC,IAAI,GAAG,IAAI;EACXC,SAAS,GAAG,KAAK;EACjBC,EAAE;EACFC,IAAI,GAAG,SAAS;EAChBC,cAAc;EACdC,IAAI,GAAG;AACT,CAAC,KACE;EACH,MAAMC,eAAe,GAAGC,IAAI,CAACC,GAAG,CAAC,GAAG,EAAED,IAAI,CAACE,GAAG,CAAC,CAAC,EAAEZ,QAAQ,CAAC,CAAC;EAC5D,MAAMa,YAAY,GAAG,GAAIJ,eAAe,YAAa;EACrD,MAAMK,eAAe,GAAG,GAAID,YAAY,GAAKZ,WAAW,GAAG,IAAKA,WAAW,EAAG,GAAG,EAAE,EAAG;EACtF,MAAMc,SAAS,GAAGT,IAAI,KAAK,SAAS;EACpC,MAAMU,eAAe,GAAG,GAAIX,EAAE,SAAU;EACxC,MAAMY,YAAY,GAAG,OAAOV,cAAc,KAAK,UAAU;EAEzD,MAAMW,QAAQ,GAAGA,CAAA,KAAM;IACrB,IAAIhB,aAAa,EAAE;MACjB,OAAOA,aAAa;IACtB;IACA,OAAOY,eAAe;EACxB,CAAC;EAED,MAAMK,YAAY,GAAG;IACnBC,OAAO,EAAE,EAAE;IACXC,OAAO,EAAE,SAAS;IAClBC,KAAK,EAAE,cAAc;IACrBC,OAAO,EAAE;EACX,CAAC;EAED,MAAMC,wBAAwB,gBAC5B5B,KAAA,CAAA6B,aAAA;IAAMC,SAAS,EAAC;EAAmB,gBACjC9B,KAAA,CAAA6B,aAAA;IAAMC,SAAS,EAAC;EAAU,CAAE,CAAC,eAC7B9B,KAAA,CAAA6B,aAAA;IAAMC,SAAS,EAAC;EAAc,CAAE,CAAC,eACjC9B,KAAA,CAAA6B,aAAA;IAAMC,SAAS,EAAC;EAAY,GACxBvB,IAAI,eACNP,KAAA,CAAA6B,aAAA;IAAMC,SAAS,EAAG,aAActB,SAAS,IAAII,IAAI,KAAK,QAAQ,GAAG,SAAS,GAAG,EAAE;EAAK,GAAGT,IAAY,CAC/F,CAAC,EAELgB,SAAS,iBACTnB,KAAA,CAAA6B,aAAA;IAAMC,SAAS,EAAC;EAAiB,gBAC/B9B,KAAA,CAAA6B,aAAA,CAAC5B,OAAO;IACN8B,cAAc;IACdC,SAAS,EAAGZ,eAAiB;IAC7Ba,cAAc,EAAC,YAAY;IAC3B1B,IAAI,EAAGgB,YAAY,CAACb,IAAI;EAAG,GAEzBY,QAAQ,CAAC,CACJ,CACL,CAEJ,CACP;EAED,MAAMY,WAAW,GAAG;IAClBJ,SAAS,EAAE,6BAA8BpB,IAAI,QAAUE,IAAI,EAAG;IAC9DH,EAAE;IACF0B,KAAK,EAAE;MACL,YAAY,EAAE,GAAItB,eAAe;IACnC,CAAwB;IACxBuB,KAAK,EAAEjB,SAAS,GAAG,EAAE,GAAGG,QAAQ,CAAC,CAAC;IAClC,YAAY,EAAEJ,eAAe;IAC7B,IAAIC,SAAS,GAAG;MAAE,kBAAkB,EAAEC,eAAe,GAAG;IAAW,CAAC,GAAG,CAAC,CAAC;EAC3E,CAAC;EAED,IAAIC,YAAY,EAAE;IAChB,oBACErB,KAAA,CAAA6B,aAAA,WAAA9B,QAAA,KACOmC,WAAW;MAChBG,IAAI,EAAC,QAAQ;MACbC,OAAO,EAAG3B;IAAgB,IAExBiB,wBACI,CAAC;EAEb;EAEA,oBACE5B,KAAA,CAAA6B,aAAA,QAAA9B,QAAA,KACOmC,WAAW;IAChBK,IAAI,EAAC,aAAa;IAClB,iBAAgB,CAAG;IACnB,iBAAgB,GAAK;IACrB,iBAAgB1B;EAAiB,IAE/Be,wBACC,CAAC;AAEV,CAAC;AAED,eAAe1B,yBAAyB","ignoreList":[]}
@@ -0,0 +1,301 @@
1
+ .circularProgressIndicator {
2
+ --progress: 0%; /* Overwrite the progress value to set the progress (0% to 100%) */
3
+ --progressIndicatorSize: 100px;
4
+ --progressIndicatorBgColor: #f0f0f0;
5
+ --glowRingThickness: 5%;
6
+ --progressRingSize: 90%;
7
+ --progressRingThickness: 10%;
8
+ --glowRingColor: #ec008c;
9
+ --glowRingColorHighlight: #fff;
10
+ --glowRingColorShade: #B02568;
11
+ --errorColor: #ff0000;
12
+ --errorColorShade: #cc0000;
13
+ --warnColor: #ffcc00;
14
+ --warnColorShade: #ff9900;
15
+ --successColor: #009900;
16
+ --successColorShade: #006600;
17
+ --progressRingColor: #ec008c;
18
+ --progressRingColorHighlight: #fff;
19
+ --progressRingColorShade: #B02568;
20
+ --progressStartAngle: -45deg;
21
+ border: 0;
22
+ background: transparent;
23
+ }
24
+ .circularProgressIndicator.xsmall {
25
+ --progressIndicatorSize: 40px;
26
+ --glowRingThickness: 5px;
27
+ }
28
+ .circularProgressIndicator.xsmall .statusIndicator {
29
+ width: 16px;
30
+ height: 16px;
31
+ top: 5%;
32
+ right: 5%;
33
+ border: none;
34
+ }
35
+ .circularProgressIndicator.xsmall .statusIndicator .statusIcon .icon {
36
+ font-size: 11px;
37
+ }
38
+ .circularProgressIndicator.xsmall .statusIndicator .statusIcon .icon.icon-warning {
39
+ position: relative;
40
+ top: -1px;
41
+ }
42
+ .circularProgressIndicator.small {
43
+ --progressIndicatorSize: 75px;
44
+ }
45
+ .circularProgressIndicator.small .actionIcon .labelText {
46
+ font-size: 11px;
47
+ }
48
+ .circularProgressIndicator.small .statusIndicator {
49
+ width: 18px;
50
+ height: 18px;
51
+ top: 5%;
52
+ right: 5%;
53
+ border-width: 1px;
54
+ }
55
+ .circularProgressIndicator.small .statusIndicator .statusIcon .icon {
56
+ font-size: 14px;
57
+ }
58
+ .circularProgressIndicator.small .statusIndicator .statusIcon .icon.icon-warning {
59
+ position: relative;
60
+ top: -1px;
61
+ }
62
+ .circularProgressIndicator.large {
63
+ --progressIndicatorSize: 150px;
64
+ }
65
+ .circularProgressIndicator.large .actionIcon .icon {
66
+ height: 30px;
67
+ font-size: 20px;
68
+ }
69
+ .circularProgressIndicator.large .actionIcon .labelText {
70
+ font-size: 16px;
71
+ }
72
+ .circularProgressIndicator.large .actionIcon .iconSvg {
73
+ height: 50px;
74
+ width: 50px;
75
+ }
76
+ .circularProgressIndicator.large .actionIcon .iconSvg path {
77
+ stroke-width: 1px;
78
+ }
79
+ .circularProgressIndicator.large .statusIndicator {
80
+ width: 30px;
81
+ height: 30px;
82
+ }
83
+ .circularProgressIndicator.large .statusIndicator .statusIcon .icon {
84
+ font-size: 16px;
85
+ }
86
+ .circularProgressIndicator.large .statusIndicator .statusIcon .icon.icon-warning {
87
+ position: relative;
88
+ top: -1px;
89
+ }
90
+ .circularProgressIndicator.xlarge {
91
+ --progressIndicatorSize: 200px;
92
+ }
93
+ .circularProgressIndicator.xlarge .actionIcon .icon {
94
+ height: 40px;
95
+ font-size: 30px;
96
+ }
97
+ .circularProgressIndicator.xlarge .actionIcon .labelText {
98
+ font-size: 16px;
99
+ }
100
+ .circularProgressIndicator.xlarge .actionIcon .iconSvg {
101
+ height: 75px;
102
+ width: 75px;
103
+ }
104
+ .circularProgressIndicator.xlarge .actionIcon .iconSvg path {
105
+ stroke-width: 1px;
106
+ }
107
+ .circularProgressIndicator.xlarge .statusIndicator {
108
+ width: 40px;
109
+ height: 40px;
110
+ }
111
+ .circularProgressIndicator.xlarge .statusIndicator .statusIcon .icon {
112
+ font-size: 18px;
113
+ }
114
+ .circularProgressIndicator.xlarge .statusIndicator .statusIcon .icon.icon-warning {
115
+ position: relative;
116
+ top: -1px;
117
+ }
118
+ .circularProgressIndicator.errorMode {
119
+ --glowRingColor: var(--errorColor);
120
+ --glowRingColorHighlight: var(--errorColor);
121
+ --glowRingColorShade: var(--errorColorShade);
122
+ --progressRingColor: var(--errorColor);
123
+ --progressRingColorShade: var(--errorColorShade);
124
+ }
125
+ .circularProgressIndicator.errorMode .statusIndicator {
126
+ color: var(--errorColor);
127
+ border-color: var(--errorColorShade);
128
+ }
129
+ .circularProgressIndicator.errorMode .statusIndicator .icon {
130
+ color: var(--errorColor);
131
+ }
132
+ .circularProgressIndicator.warningMode {
133
+ --glowRingColor: var(--warnColor);
134
+ --glowRingColorHighlight: var(--warnColor);
135
+ --glowRingColorShade: var(--warnColorShade);
136
+ --progressRingColor: var(--warnColor);
137
+ --progressRingColorShade: var(--warnColorShade);
138
+ }
139
+ .circularProgressIndicator.warningMode .statusIndicator {
140
+ color: var(--warnColorShade);
141
+ border-color: var(--warnColorShade);
142
+ }
143
+ .circularProgressIndicator.warningMode .statusIndicator .icon {
144
+ color: var(--warnColorShade);
145
+ }
146
+ .circularProgressIndicator.successMode {
147
+ --glowRingColor: var(--successColor);
148
+ --glowRingColorHighlight: var(--successColor);
149
+ --glowRingColorShade: var(--successColorShade);
150
+ --progressRingColor: var(--successColor);
151
+ --progressRingColorShade: var(--successColorShade);
152
+ }
153
+ .circularProgressIndicator.successMode .statusIndicator {
154
+ color: var(--successColorShade);
155
+ border-color: var(--successColorShade);
156
+ }
157
+ .circularProgressIndicator.successMode .statusIndicator .icon {
158
+ color: var(--successColorShade);
159
+ }
160
+ .circularProgressIndicator .progressIndicator {
161
+ display: block;
162
+ position: relative;
163
+ width: var(--progressIndicatorSize);
164
+ height: var(--progressIndicatorSize);
165
+ }
166
+ .circularProgressIndicator .progressIndicator .glowRing {
167
+ width: 100%;
168
+ height: 100%;
169
+ position: absolute;
170
+ border-radius: 50%;
171
+ top: 0;
172
+ left: 0;
173
+ background-image: conic-gradient(from var(--progressStartAngle), var(--glowRingColorHighlight) 0%, var(--glowRingColor) 20%, var(--glowRingColorShade) 50%, var(--glowRingColor) 80%, var(--glowRingColorHighlight) 95%);
174
+ box-shadow: 0 0 10px 0 var(--glowRingColor);
175
+ }
176
+ .circularProgressIndicator .progressIndicator .glowRing:before {
177
+ content: "";
178
+ position: absolute;
179
+ top: calc(var(--glowRingThickness) / 2);
180
+ left: calc(var(--glowRingThickness) / 2);
181
+ width: calc(100% - var(--glowRingThickness));
182
+ height: calc(100% - var(--glowRingThickness));
183
+ border-radius: 50%;
184
+ box-shadow: 0 0 20px rgba(255, 255, 255, 0.5);
185
+ background-color: var(--progressIndicatorBgColor);
186
+ }
187
+ .circularProgressIndicator .progressRing {
188
+ width: var(--progressRingSize);
189
+ height: var(--progressRingSize);
190
+ border-radius: 50%;
191
+ background-image: conic-gradient(from var(--progressStartAngle), var(--progressRingColorHighlight) 0%, var(--progressRingColor) 30%, var(--progressRingColorShade) 50%, var(--progressRingColor) 80%, var(--progressRingColorHighlight) 95%);
192
+ position: absolute;
193
+ top: 50%;
194
+ left: 50%;
195
+ transform: translate(-50%, -50%);
196
+ }
197
+ .circularProgressIndicator .progressRing:before, .circularProgressIndicator .progressRing:after {
198
+ content: "";
199
+ position: absolute;
200
+ border-radius: 50%;
201
+ top: 50%;
202
+ left: 50%;
203
+ transform: translate(-50%, -50%);
204
+ }
205
+ .circularProgressIndicator .progressRing {
206
+ /* Mask the progress ring to show only the progress portion */
207
+ }
208
+ .circularProgressIndicator .progressRing:before {
209
+ width: calc(var(--progressRingSize) + var(--progressRingThickness) + 2px);
210
+ height: calc(var(--progressRingSize) + var(--progressRingThickness) + 2px);
211
+ border: 1px solid #fff;
212
+ z-index: 1;
213
+ /* This css is correct. Ignore VSCode warning. */
214
+ background-image: conic-gradient(from var(--progressStartAngle), transparent 0 calc(var(--progress) - 0.2%), var(--progressIndicatorBgColor) calc(var(--progress) + 0.2%));
215
+ }
216
+ .circularProgressIndicator .progressRing:after {
217
+ z-index: 2;
218
+ width: calc(var(--progressRingSize) - var(--progressRingThickness));
219
+ height: calc(var(--progressRingSize) - var(--progressRingThickness));
220
+ background-color: var(--progressIndicatorBgColor);
221
+ box-shadow: inset 1px 1px 10px 1px rgba(0, 0, 0, 0.15), inset -2px -2px 5px 1px rgba(0, 0, 0, 0.15);
222
+ }
223
+ .circularProgressIndicator .actionIcon {
224
+ position: absolute;
225
+ top: 50%;
226
+ left: 50%;
227
+ transform: translate(-50%, -50%);
228
+ width: 50%;
229
+ height: 50%;
230
+ display: flex;
231
+ flex-direction: column;
232
+ align-items: center;
233
+ text-align: center;
234
+ justify-content: center;
235
+ }
236
+ .circularProgressIndicator .actionIcon .icon {
237
+ height: 24px;
238
+ font-size: 24px;
239
+ line-height: 1;
240
+ }
241
+ .circularProgressIndicator .actionIcon .labelText {
242
+ font-size: 13px;
243
+ line-height: 1;
244
+ }
245
+ .circularProgressIndicator .actionIcon .iconSvg {
246
+ fill: none;
247
+ stroke-width: 1.5;
248
+ stroke-linecap: round;
249
+ stroke-linejoin: round;
250
+ height: 24px;
251
+ }
252
+ .circularProgressIndicator .actionIcon .iconSvg .svgIconColor_1 {
253
+ stroke: #000;
254
+ }
255
+ .circularProgressIndicator .actionIcon .iconSvg .svgIconColor_2 {
256
+ stroke: #000;
257
+ }
258
+ .circularProgressIndicator .actionIcon .iconSvg .svgIconFill_1 {
259
+ fill: var(--progressRingColor);
260
+ }
261
+ .circularProgressIndicator .statusIndicator {
262
+ position: absolute;
263
+ top: 9%;
264
+ right: 9%;
265
+ width: 20px;
266
+ height: 20px;
267
+ border-radius: 50%;
268
+ border: 2px solid;
269
+ font-size: 20px;
270
+ font-weight: bold;
271
+ background: #fff;
272
+ display: flex;
273
+ justify-content: center;
274
+ align-items: center;
275
+ text-align: center;
276
+ }
277
+ .circularProgressIndicator .statusIndicator .tooltip {
278
+ margin: 0;
279
+ width: 100%;
280
+ }
281
+ .circularProgressIndicator .statusIndicator .tooltip > span.icon_only { /* Non-button passive tooltip version */
282
+ left: 0;
283
+ top: 0;
284
+ min-width: auto;
285
+ min-height: auto;
286
+ width: 100%;
287
+ height: 100%;
288
+ }
289
+ .circularProgressIndicator .statusIndicator .tooltip > span.icon_only .icon,
290
+ .circularProgressIndicator .statusIndicator .tooltip > span.icon_only .svgIcon {
291
+ width: 100%;
292
+ height: 100%;
293
+ }
294
+ .circularProgressIndicator .statusIndicator .statusIcon .icon {
295
+ font-size: 14px;
296
+ background: none;
297
+ }
298
+ .circularProgressIndicator .statusIndicator .statusIcon .icon.icon-warning {
299
+ position: relative;
300
+ top: -1px;
301
+ }
@@ -5,10 +5,12 @@ import React, { useState, useRef, useEffect, useCallback } from 'react';
5
5
  import { useOnClickOutside } from '../../../hooks/ClickOutside';
6
6
  import { Icon } from '../icons/basicIcon/Icon';
7
7
  import { useOnEdgeProximityDetect } from '../../../hooks/EdgeProximityDetect';
8
+ import { useOnInteractiveHostFocus } from '../../../hooks/InteractiveHostFocus';
8
9
  import './tooltip.css';
9
10
 
10
11
  // Define the props for Tooltip
11
12
 
13
+ export const getTooltipContentId = triggerId => `${triggerId}_content`;
12
14
  export const Tooltip = props => {
13
15
  const {
14
16
  triggerId,
@@ -19,7 +21,8 @@ export const Tooltip = props => {
19
21
  children,
20
22
  label = 'Toggle tooltip open state',
21
23
  showPointer = true,
22
- hoverDelay
24
+ hoverDelay,
25
+ passiveTrigger = false
23
26
  // visualIndicators will be handled below
24
27
  } = props;
25
28
 
@@ -81,7 +84,13 @@ export const Tooltip = props => {
81
84
  onMouseEnter: handleMouseEnter,
82
85
  onMouseLeave: handleMouseLeave
83
86
  } : {};
84
- useOnClickOutside(tooltipElement, dismiss);
87
+
88
+ // Passive mode closes on host blur; focusin on the host would otherwise count as "outside".
89
+ useOnClickOutside(tooltipElement, () => {
90
+ if (!passiveTrigger) {
91
+ dismiss();
92
+ }
93
+ });
85
94
  useOnEdgeProximityDetect({
86
95
  triggerRef: triggerElement,
87
96
  wrapperRef: tooltipElement,
@@ -97,12 +106,39 @@ export const Tooltip = props => {
97
106
  }, [dismiss]);
98
107
  useEffect(() => {
99
108
  const wrapper = tooltipElement.current;
100
- if (!wrapper) {
109
+ if (!wrapper || passiveTrigger) {
101
110
  return undefined;
102
111
  }
103
112
  wrapper.addEventListener('keydown', handleSpecialKeyPresses);
104
113
  return () => wrapper.removeEventListener('keydown', handleSpecialKeyPresses);
105
- }, [handleSpecialKeyPresses]);
114
+ }, [handleSpecialKeyPresses, passiveTrigger]);
115
+
116
+ // Passive triggers can't take focus, so open/close follows focus of the interactive host instead.
117
+ const {
118
+ isDismissed
119
+ } = useOnInteractiveHostFocus({
120
+ wrapperRef: tooltipElement,
121
+ setIsOpen,
122
+ enabled: passiveTrigger
123
+ });
124
+ const triggerIcon = iconIsElement ? icon : /*#__PURE__*/React.createElement(Icon, {
125
+ icon: icon.toString()
126
+ });
127
+ if (passiveTrigger) {
128
+ return /*#__PURE__*/React.createElement("span", {
129
+ ref: tooltipElement,
130
+ className: `tooltip passive ${isOpen ? 'isOpen' : ''} ${isDismissed ? 'isDismissed' : ''} ${customCssClass || ''}`
131
+ }, /*#__PURE__*/React.createElement("span", {
132
+ ref: triggerElement,
133
+ className: "icon_only",
134
+ "aria-hidden": "true"
135
+ }, triggerIcon), /*#__PURE__*/React.createElement("span", {
136
+ role: "tooltip",
137
+ ref: contentElement,
138
+ className: `content ${showPointer ? 'showPointer' : ''}`,
139
+ id: getTooltipContentId(triggerId)
140
+ }, children));
141
+ }
106
142
  if (containsBlockElements) {
107
143
  return /*#__PURE__*/React.createElement("div", _extends({
108
144
  role: "tooltip",