Merge remote-tracking branch 'origin/main' into grafana-git-ui-sync
This commit is contained in:
222 files changed
+5528
-4452
No files matched your search
+12
-5
@@ -1731,7 +1731,9 @@ exports[`better eslint`] = {
|
|||||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "13"]
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "13"]
|
||||||
],
|
],
|
||||||
"public/app/features/alerting/unified/home/Insights.tsx:5381": [
|
"public/app/features/alerting/unified/home/Insights.tsx:5381": [
|
||||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||||
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||||
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
|
||||||
],
|
],
|
||||||
"public/app/features/alerting/unified/home/PluginIntegrations.tsx:5381": [
|
"public/app/features/alerting/unified/home/PluginIntegrations.tsx:5381": [
|
||||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||||
@@ -1742,9 +1744,10 @@ exports[`better eslint`] = {
|
|||||||
"public/app/features/alerting/unified/hooks/useControlledFieldArray.ts:5381": [
|
"public/app/features/alerting/unified/hooks/useControlledFieldArray.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||||
],
|
],
|
||||||
"public/app/features/alerting/unified/insights/RatingModal.tsx:5381": [
|
"public/app/features/alerting/unified/insights/InsightsMenuButton.tsx:5381": [
|
||||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||||
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
|
||||||
],
|
],
|
||||||
"public/app/features/alerting/unified/mocks.ts:5381": [
|
"public/app/features/alerting/unified/mocks.ts:5381": [
|
||||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||||
@@ -3814,7 +3817,8 @@ exports[`better eslint`] = {
|
|||||||
"public/app/features/sandbox/TestStuffPage.tsx:5381": [
|
"public/app/features/sandbox/TestStuffPage.tsx:5381": [
|
||||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||||
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"]
|
||||||
],
|
],
|
||||||
"public/app/features/scopes/index.ts:5381": [
|
"public/app/features/scopes/index.ts:5381": [
|
||||||
[0, 0, 0, "Do not re-export imported variable (\`./instance\`)", "0"],
|
[0, 0, 0, "Do not re-export imported variable (\`./instance\`)", "0"],
|
||||||
@@ -5452,6 +5456,9 @@ exports[`no undocumented stories`] = {
|
|||||||
"packages/grafana-ui/src/components/ThemeDemos/ThemeDemo.story.tsx:5381": [
|
"packages/grafana-ui/src/components/ThemeDemos/ThemeDemo.story.tsx:5381": [
|
||||||
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
|
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
|
||||||
],
|
],
|
||||||
|
"packages/grafana-ui/src/components/UnitPicker/UnitPicker.story.tsx:5381": [
|
||||||
|
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
|
||||||
|
],
|
||||||
"packages/grafana-ui/src/components/VizLayout/VizLayout.story.tsx:5381": [
|
"packages/grafana-ui/src/components/VizLayout/VizLayout.story.tsx:5381": [
|
||||||
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
|
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -472,7 +472,7 @@
|
|||||||
"name": "type/build-packaging",
|
"name": "type/build-packaging",
|
||||||
"action": "addToProject",
|
"action": "addToProject",
|
||||||
"addToProject": {
|
"addToProject": {
|
||||||
"url": "https://github.com/orgs/grafana/projects/509"
|
"url": "https://github.com/orgs/grafana/projects/632"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -616,7 +616,7 @@
|
|||||||
"name": "area/security",
|
"name": "area/security",
|
||||||
"action": "addToProject",
|
"action": "addToProject",
|
||||||
"addToProject": {
|
"addToProject": {
|
||||||
"url": "https://github.com/orgs/grafana/projects/470"
|
"url": "https://github.com/orgs/grafana/projects/476"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
"slate-react", // we don't want to continue using this on the long run, use Monaco editor instead of Slate
|
"slate-react", // we don't want to continue using this on the long run, use Monaco editor instead of Slate
|
||||||
"@types/slate-react", // we don't want to continue using this on the long run, use Monaco editor instead of Slate
|
"@types/slate-react", // we don't want to continue using this on the long run, use Monaco editor instead of Slate
|
||||||
"@types/slate", // we don't want to continue using this on the long run, use Monaco editor instead of Slate
|
"@types/slate", // we don't want to continue using this on the long run, use Monaco editor instead of Slate
|
||||||
|
"storybook-dark-mode", // 4.0.2 causes storybook 8.4 to break with react hooks errors
|
||||||
// Temporarily pause updating lerna and nx until we resolve build issues
|
// Temporarily pause updating lerna and nx until we resolve build issues
|
||||||
"lerna",
|
"lerna",
|
||||||
"nx"
|
"nx"
|
||||||
|
|||||||
@@ -265,7 +265,7 @@ jobs:
|
|||||||
- name: Send Slack Message via Payload
|
- name: Send Slack Message via Payload
|
||||||
id: slack
|
id: slack
|
||||||
if: steps.levitate-run.outputs.exit_code == 1 && steps.does-label-exist.outputs.result == 0 && github.repository == 'grafana/grafana'
|
if: steps.levitate-run.outputs.exit_code == 1 && steps.does-label-exist.outputs.result == 0 && github.repository == 'grafana/grafana'
|
||||||
uses: grafana/shared-workflows/actions/send-slack-message@main
|
uses: grafana/shared-workflows/actions/send-slack-message@7b628e7352c2dea057c565cc4fcd5564d5f396c0 #v1.0.0
|
||||||
with:
|
with:
|
||||||
channel-id: "C031SLFH6G0"
|
channel-id: "C031SLFH6G0"
|
||||||
payload: |
|
payload: |
|
||||||
|
|||||||
+2
-1
@@ -144,6 +144,7 @@ pkg/services/quota/quotaimpl/storage/storage.json
|
|||||||
|
|
||||||
# Ignoring frontend packages specifics
|
# Ignoring frontend packages specifics
|
||||||
/packages/grafana-ui/.yarn/.cache
|
/packages/grafana-ui/.yarn/.cache
|
||||||
|
/packages/grafana-ui/.storybook/static
|
||||||
/packages/**/dist
|
/packages/**/dist
|
||||||
/packages/**/compiled
|
/packages/**/compiled
|
||||||
/packages/**/.rpt2_cache
|
/packages/**/.rpt2_cache
|
||||||
@@ -228,4 +229,4 @@ public/app/plugins/**/dist/
|
|||||||
# Mock service worker used for fake API responses in frontend development
|
# Mock service worker used for fake API responses in frontend development
|
||||||
public/mockServiceWorker.js
|
public/mockServiceWorker.js
|
||||||
|
|
||||||
/e2e/test-plugins/*/dist
|
/e2e/test-plugins/*/dist
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
diff --git a/dist/index.d.ts b/dist/index.d.ts
|
|
||||||
index baa055bbb796e750fe1badfdfbc4fedbbcbf9f04..5f389f7e1d200dd6a951d8ccfa4cd71befcbceba 100644
|
|
||||||
--- a/dist/index.d.ts
|
|
||||||
+++ b/dist/index.d.ts
|
|
||||||
@@ -53,6 +53,12 @@ interface PreviewProps {
|
|
||||||
children?: ReactNode;
|
|
||||||
}
|
|
||||||
type Layout = 'padded' | 'fullscreen' | 'centered';
|
|
||||||
+/**
|
|
||||||
+ * A preview component for showing one or more component `Story`
|
|
||||||
+ * items. The preview also shows the source for the component
|
|
||||||
+ * as a drop-down.
|
|
||||||
+ */
|
|
||||||
+declare const Preview: FC<PreviewProps>;
|
|
||||||
|
|
||||||
interface ArgType {
|
|
||||||
name?: string;
|
|
||||||
@@ -643,4 +649,4 @@ type ColorProps = ColorControlProps;
|
|
||||||
declare const LazyColorControl: React.LazyExoticComponent<React.FC<ColorControlProps>>;
|
|
||||||
declare const ColorControl: (props: ComponentProps<typeof LazyColorControl>) => React.JSX.Element;
|
|
||||||
|
|
||||||
-export { AddContext, Anchor, AnchorMdx, AnchorProps, ArgTypes, BooleanConfig, BooleanControl, BooleanProps, BooleanValue, Canvas, CodeOrSourceMdx, ColorConfig, ColorControl, ColorItem, ColorPalette, ColorProps, ColorValue, Component, Control, ControlProps, ControlType, Controls, DateConfig, DateControl, DateProps, DateValue, DescriptionContainer as Description, DescriptionType, Docs, DocsContainer, DocsContainerProps, DocsContext, DocsPage, DocsProps, DocsStory, DocsStoryProps, ExternalDocs, ExternalDocsContainer, ExternalDocsProps, FilesControl, FilesControlProps, HeaderMdx, HeadersMdx, Heading, HeadingProps, IconGallery, IconItem, Markdown, Meta, NormalizedOptionsConfig, NumberConfig, NumberControl, NumberValue, ObjectConfig, ObjectControl, ObjectProps, ObjectValue, Of, Options, OptionsArray, OptionsConfig, OptionsControl, OptionsControlType, OptionsMultiSelection, OptionsObject, OptionsProps, OptionsSelection, OptionsSingleSelection, PRIMARY_STORY, PresetColor, Primary, ArgsTable as PureArgsTable, RangeConfig, RangeControl, SortType, Source, SourceContainer, SourceContext, SourceContextProps, SourceItem, SourceProps, Stories, Story, StoryProps, StorySources, Subheading, Subtitle, TextConfig, TextControl, TextProps, TextValue, Title, Typeset, UNKNOWN_ARGS_HASH, Unstyled, Wrapper, anchorBlockIdFromId, argsHash, assertIsFn, extractTitle, format, formatDate, formatTime, getStoryId, getStoryProps, parse, parseDate, parseTime, useOf, useSourceProps };
|
|
||||||
+export { AddContext, Anchor, AnchorMdx, AnchorProps, ArgTypes, BooleanConfig, BooleanControl, BooleanProps, BooleanValue, Canvas, CodeOrSourceMdx, ColorConfig, ColorControl, ColorItem, ColorPalette, ColorProps, ColorValue, Component, Control, ControlProps, ControlType, Controls, DateConfig, DateControl, DateProps, DateValue, DescriptionContainer as Description, DescriptionType, Docs, DocsContainer, DocsContainerProps, DocsContext, DocsPage, DocsProps, DocsStory, DocsStoryProps, ExternalDocs, ExternalDocsContainer, ExternalDocsProps, FilesControl, FilesControlProps, HeaderMdx, HeadersMdx, Heading, HeadingProps, IconGallery, IconItem, Markdown, Meta, NormalizedOptionsConfig, NumberConfig, NumberControl, NumberValue, ObjectConfig, ObjectControl, ObjectProps, ObjectValue, Of, Options, OptionsArray, OptionsConfig, OptionsControl, OptionsControlType, OptionsMultiSelection, OptionsObject, OptionsProps, OptionsSelection, OptionsSingleSelection, PRIMARY_STORY, PresetColor, Preview, Primary, ArgsTable as PureArgsTable, RangeConfig, RangeControl, SortType, Source, SourceContainer, SourceContext, SourceContextProps, SourceItem, SourceProps, Stories, Story, StoryProps, StorySources, Subheading, Subtitle, TextConfig, TextControl, TextProps, TextValue, Title, Typeset, UNKNOWN_ARGS_HASH, Unstyled, Wrapper, anchorBlockIdFromId, argsHash, assertIsFn, extractTitle, format, formatDate, formatTime, getStoryId, getStoryProps, parse, parseDate, parseTime, useOf, useSourceProps };
|
|
||||||
diff --git a/dist/index.js b/dist/index.js
|
|
||||||
index a20435ad1d5645c0f3846365938bc71a98068ae7..4974b0639bcb8579da5fe47916223d23f099c9a2 100644
|
|
||||||
--- a/dist/index.js
|
|
||||||
+++ b/dist/index.js
|
|
||||||
@@ -1,24 +1,24 @@
|
|
||||||
-var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __esm=(fn,res)=>function(){return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var getControlId,getControlSetterButtonId,init_helpers=__esm({"src/controls/helpers.ts"(){getControlId=value2=>`control-${value2.replace(/\s+/g,"-")}`,getControlSetterButtonId=value2=>`set-${value2.replace(/\s+/g,"-")}`}});var Color_exports={};__export(Color_exports,{ColorControl:()=>ColorControl,default:()=>Color_default});var import_react24,import_react_colorful,import_color_convert,import_throttle,import_theming18,import_components15,import_icons5,Wrapper8,PickerTooltip,TooltipContent,Note,Swatches,SwatchColor,swatchBackground,Swatch,Input2,ToggleIcon,ColorSpace,COLOR_SPACES,COLOR_REGEXP,RGB_REGEXP,HSL_REGEXP,HEX_REGEXP,SHORTHEX_REGEXP,ColorPicker,fallbackColor,stringToArgs,parseValue,getRealValue,useColorInput,id,usePresets,ColorControl,Color_default,init_Color=__esm({"src/controls/Color.tsx"(){import_react24=__toESM(require("react")),import_react_colorful=require("react-colorful"),import_color_convert=__toESM(require("color-convert")),import_throttle=__toESM(require("lodash/throttle.js")),import_theming18=require("@storybook/theming"),import_components15=require("@storybook/components");init_helpers();import_icons5=require("@storybook/icons"),Wrapper8=import_theming18.styled.div({position:"relative",maxWidth:250,'&[aria-readonly="true"]':{opacity:.5}}),PickerTooltip=(0,import_theming18.styled)(import_components15.WithTooltip)({position:"absolute",zIndex:1,top:4,left:4,"[aria-readonly=true] &":{cursor:"not-allowed"}}),TooltipContent=import_theming18.styled.div({width:200,margin:5,".react-colorful__saturation":{borderRadius:"4px 4px 0 0"},".react-colorful__hue":{boxShadow:"inset 0 0 0 1px rgb(0 0 0 / 5%)"},".react-colorful__last-control":{borderRadius:"0 0 4px 4px"}}),Note=(0,import_theming18.styled)(import_components15.TooltipNote)(({theme})=>({fontFamily:theme.typography.fonts.base})),Swatches=import_theming18.styled.div({display:"grid",gridTemplateColumns:"repeat(9, 16px)",gap:6,padding:3,marginTop:5,width:200}),SwatchColor=import_theming18.styled.div(({theme,active})=>({width:16,height:16,boxShadow:active?`${theme.appBorderColor} 0 0 0 1px inset, ${theme.textMutedColor}50 0 0 0 4px`:`${theme.appBorderColor} 0 0 0 1px inset`,borderRadius:theme.appBorderRadius})),swatchBackground=`url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-opacity=".05"><path d="M8 0h8v8H8zM0 8h8v8H0z"/></svg>')`,Swatch=({value:value2,style,...props})=>{let backgroundImage=`linear-gradient(${value2}, ${value2}), ${swatchBackground}, linear-gradient(#fff, #fff)`;return import_react24.default.createElement(SwatchColor,{...props,style:{...style,backgroundImage}})},Input2=(0,import_theming18.styled)(import_components15.Form.Input)(({theme,readOnly})=>({width:"100%",paddingLeft:30,paddingRight:30,boxSizing:"border-box",fontFamily:theme.typography.fonts.base})),ToggleIcon=(0,import_theming18.styled)(import_icons5.MarkupIcon)(({theme})=>({position:"absolute",zIndex:1,top:6,right:7,width:20,height:20,padding:4,boxSizing:"border-box",cursor:"pointer",color:theme.input.color})),ColorSpace=(ColorSpace2=>(ColorSpace2.RGB="rgb",ColorSpace2.HSL="hsl",ColorSpace2.HEX="hex",ColorSpace2))(ColorSpace||{}),COLOR_SPACES=Object.values(ColorSpace),COLOR_REGEXP=/\(([0-9]+),\s*([0-9]+)%?,\s*([0-9]+)%?,?\s*([0-9.]+)?\)/,RGB_REGEXP=/^\s*rgba?\(([0-9]+),\s*([0-9]+),\s*([0-9]+),?\s*([0-9.]+)?\)\s*$/i,HSL_REGEXP=/^\s*hsla?\(([0-9]+),\s*([0-9]+)%,\s*([0-9]+)%,?\s*([0-9.]+)?\)\s*$/i,HEX_REGEXP=/^\s*#?([0-9a-f]{3}|[0-9a-f]{6})\s*$/i,SHORTHEX_REGEXP=/^\s*#?([0-9a-f]{3})\s*$/i,ColorPicker={hex:import_react_colorful.HexColorPicker,rgb:import_react_colorful.RgbaStringColorPicker,hsl:import_react_colorful.HslaStringColorPicker},fallbackColor={hex:"transparent",rgb:"rgba(0, 0, 0, 0)",hsl:"hsla(0, 0%, 0%, 0)"},stringToArgs=value2=>{let match=value2?.match(COLOR_REGEXP);if(!match)return[0,0,0,1];let[,x,y,z,a=1]=match;return[x,y,z,a].map(Number)},parseValue=value2=>{if(!value2)return;let valid=!0;if(RGB_REGEXP.test(value2)){let[r,g
Line truncated
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${(0,import_polished5.darken)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${(0,import_polished5.darken)(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${(0,import_polished5.lighten)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${(0,import_polished5.lighten)(.02,theme.input.background)} 100%)`,boxShadow:`${theme.appBorderColor} 0 0 0 1px inset`,borderRadius:6,width:"100%",height:6,cursor:disabled?"not-allowed":"pointer"},"&::-webkit-slider-thumb":{marginTop:"-6px",width:16,height:16,border:`1px solid ${(0,import_polished5.rgba)(theme.appBorderColor,.2)}`,borderRadius:"50px",boxShadow:`0 1px 3px 0px ${(0,import_polished5.rgba)(theme.appBorderColor,.2)}`,cursor:disabled?"not-allowed":"grab",appearance:"none",background:`${theme.input.background}`,transition:"all 150ms ease-out","&:hover":{background:`${(0,import_polished5.darken)(.05,theme.input.background)}`,transform:"scale3d(1.1, 1.1, 1.1) translateY(-1px)",transition:"all 50ms ease-out"},"&:active":{background:`${theme.input.background}`,transform:"scale3d(1, 1, 1) translateY(0px)",cursor:disabled?"not-allowed":"grab"}},"&:focus":{outline:"none","&::-webkit-slider-runnable-track":{borderColor:(0,import_polished5.rgba)(theme.color.secondary,.4)},"&::-webkit-slider-thumb":{borderColor:theme.color.secondary,boxShadow:`0 0px 5px 0px ${theme.color.secondary}`}},"&::-moz-range-track":{background:theme.base==="light"?`linear-gradient(to right,
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${(0,import_polished5.darken)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${(0,import_polished5.darken)(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${(0,import_polished5.lighten)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${(0,import_polished5.lighten)(.02,theme.input.background)} 100%)`,boxShadow:`${theme.appBorderColor} 0 0 0 1px inset`,borderRadius:6,width:"100%",height:6,cursor:disabled?"not-allowed":"pointer",outline:"none"},"&::-moz-range-thumb":{width:16,height:16,border:`1px solid ${(0,import_polished5.rgba)(theme.appBorderColor,.2)}`,borderRadius:"50px",boxShadow:`0 1px 3px 0px ${(0,import_polished5.rgba)(theme.appBorderColor,.2)}`,cursor:disabled?"not-allowed":"grap",background:`${theme.input.background}`,transition:"all 150ms ease-out","&:hover":{background:`${(0,import_polished5.darken)(.05,theme.input.background)}`,transform:"scale3d(1.1, 1.1, 1.1) translateY(-1px)",transition:"all 50ms ease-out"},"&:active":{background:`${theme.input.background}`,transform:"scale3d(1, 1, 1) translateY(0px)",cursor:"grabbing"}},"&::-ms-track":{background:theme.base==="light"?`linear-gradient(to right,
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${(0,import_polished5.darken)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${(0,import_polished5.darken)(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${(0,import_polished5.lighten)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __esm=(fn,res)=>function(){return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var getControlId,getControlSetterButtonId,init_helpers=__esm({"src/controls/helpers.ts"(){getControlId=value2=>`control-${value2.replace(/\s+/g,"-")}`,getControlSetterButtonId=value2=>`set-${value2.replace(/\s+/g,"-")}`}});var Color_exports={};__export(Color_exports,{ColorControl:()=>ColorControl,default:()=>Color_default});var import_react24,import_react_colorful,import_color_convert,import_throttle,import_theming18,import_components15,import_icons5,Wrapper8,PickerTooltip,TooltipContent,Note,Swatches,SwatchColor,swatchBackground,Swatch,Input2,ToggleIcon,ColorSpace,COLOR_SPACES,COLOR_REGEXP,RGB_REGEXP,HSL_REGEXP,HEX_REGEXP,SHORTHEX_REGEXP,ColorPicker,fallbackColor,stringToArgs,parseValue,getRealValue,useColorInput,id,usePresets,ColorControl,Color_default,init_Color=__esm({"src/controls/Color.tsx"(){import_react24=__toESM(require("react")),import_react_colorful=require("react-colorful"),import_color_convert=__toESM(require("color-convert")),import_throttle=__toESM(require("lodash/throttle.js")),import_theming18=require("@storybook/theming"),import_components15=require("@storybook/components");init_helpers();import_icons5=require("@storybook/icons"),Wrapper8=import_theming18.styled.div({position:"relative",maxWidth:250,'&[aria-readonly="true"]':{opacity:.5}}),PickerTooltip=(0,import_theming18.styled)(import_components15.WithTooltip)({position:"absolute",zIndex:1,top:4,left:4,"[aria-readonly=true] &":{cursor:"not-allowed"}}),TooltipContent=import_theming18.styled.div({width:200,margin:5,".react-colorful__saturation":{borderRadius:"4px 4px 0 0"},".react-colorful__hue":{boxShadow:"inset 0 0 0 1px rgb(0 0 0 / 5%)"},".react-colorful__last-control":{borderRadius:"0 0 4px 4px"}}),Note=(0,import_theming18.styled)(import_components15.TooltipNote)(({theme})=>({fontFamily:theme.typography.fonts.base})),Swatches=import_theming18.styled.div({display:"grid",gridTemplateColumns:"repeat(9, 16px)",gap:6,padding:3,marginTop:5,width:200}),SwatchColor=import_theming18.styled.div(({theme,active})=>({width:16,height:16,boxShadow:active?`${theme.appBorderColor} 0 0 0 1px inset, ${theme.textMutedColor}50 0 0 0 4px`:`${theme.appBorderColor} 0 0 0 1px inset`,borderRadius:theme.appBorderRadius})),swatchBackground=`url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-opacity=".05"><path d="M8 0h8v8H8zM0 8h8v8H0z"/></svg>')`,Swatch=({value:value2,style,...props})=>{let backgroundImage=`linear-gradient(${value2}, ${value2}), ${swatchBackground}, linear-gradient(#fff, #fff)`;return import_react24.default.createElement(SwatchColor,{...props,style:{...style,backgroundImage}})},Input2=(0,import_theming18.styled)(import_components15.Form.Input)(({theme,readOnly})=>({width:"100%",paddingLeft:30,paddingRight:30,boxSizing:"border-box",fontFamily:theme.typography.fonts.base})),ToggleIcon=(0,import_theming18.styled)(import_icons5.MarkupIcon)(({theme})=>({position:"absolute",zIndex:1,top:6,right:7,width:20,height:20,padding:4,boxSizing:"border-box",cursor:"pointer",color:theme.input.color})),ColorSpace=(ColorSpace2=>(ColorSpace2.RGB="rgb",ColorSpace2.HSL="hsl",ColorSpace2.HEX="hex",ColorSpace2))(ColorSpace||{}),COLOR_SPACES=Object.values(ColorSpace),COLOR_REGEXP=/\(([0-9]+),\s*([0-9]+)%?,\s*([0-9]+)%?,?\s*([0-9.]+)?\)/,RGB_REGEXP=/^\s*rgba?\(([0-9]+),\s*([0-9]+),\s*([0-9]+),?\s*([0-9.]+)?\)\s*$/i,HSL_REGEXP=/^\s*hsla?\(([0-9]+),\s*([0-9]+)%,\s*([0-9]+)%,?\s*([0-9.]+)?\)\s*$/i,HEX_REGEXP=/^\s*#?([0-9a-f]{3}|[0-9a-f]{6})\s*$/i,SHORTHEX_REGEXP=/^\s*#?([0-9a-f]{3})\s*$/i,ColorPicker={hex:import_react_colorful.HexColorPicker,rgb:import_react_colorful.RgbaStringColorPicker,hsl:import_react_colorful.HslaStringColorPicker},fallbackColor={hex:"transparent",rgb:"rgba(0, 0, 0, 0)",hsl:"hsla(0, 0%, 0%, 0)"},stringToArgs=value2=>{let match=value2?.match(COLOR_REGEXP);if(!match)return[0,0,0,1];let[,x,y,z,a=1]=match;return[x,y,z,a].map(Number)},parseValue=value2=>{if(!value2)return;let valid=!0;if(RGB_REGEXP.test(value2)){let[r,g
Line truncated
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${(0,import_polished5.darken)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${(0,import_polished5.darken)(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${(0,import_polished5.lighten)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${(0,import_polished5.lighten)(.02,theme.input.background)} 100%)`,boxShadow:`${theme.appBorderColor} 0 0 0 1px inset`,borderRadius:6,width:"100%",height:6,cursor:disabled?"not-allowed":"pointer"},"&::-webkit-slider-thumb":{marginTop:"-6px",width:16,height:16,border:`1px solid ${(0,import_polished5.rgba)(theme.appBorderColor,.2)}`,borderRadius:"50px",boxShadow:`0 1px 3px 0px ${(0,import_polished5.rgba)(theme.appBorderColor,.2)}`,cursor:disabled?"not-allowed":"grab",appearance:"none",background:`${theme.input.background}`,transition:"all 150ms ease-out","&:hover":{background:`${(0,import_polished5.darken)(.05,theme.input.background)}`,transform:"scale3d(1.1, 1.1, 1.1) translateY(-1px)",transition:"all 50ms ease-out"},"&:active":{background:`${theme.input.background}`,transform:"scale3d(1, 1, 1) translateY(0px)",cursor:disabled?"not-allowed":"grab"}},"&:focus":{outline:"none","&::-webkit-slider-runnable-track":{borderColor:(0,import_polished5.rgba)(theme.color.secondary,.4)},"&::-webkit-slider-thumb":{borderColor:theme.color.secondary,boxShadow:`0 0px 5px 0px ${theme.color.secondary}`}},"&::-moz-range-track":{background:theme.base==="light"?`linear-gradient(to right,
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${(0,import_polished5.darken)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${(0,import_polished5.darken)(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${(0,import_polished5.lighten)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${(0,import_polished5.lighten)(.02,theme.input.background)} 100%)`,boxShadow:`${theme.appBorderColor} 0 0 0 1px inset`,borderRadius:6,width:"100%",height:6,cursor:disabled?"not-allowed":"pointer",outline:"none"},"&::-moz-range-thumb":{width:16,height:16,border:`1px solid ${(0,import_polished5.rgba)(theme.appBorderColor,.2)}`,borderRadius:"50px",boxShadow:`0 1px 3px 0px ${(0,import_polished5.rgba)(theme.appBorderColor,.2)}`,cursor:disabled?"not-allowed":"grap",background:`${theme.input.background}`,transition:"all 150ms ease-out","&:hover":{background:`${(0,import_polished5.darken)(.05,theme.input.background)}`,transform:"scale3d(1.1, 1.1, 1.1) translateY(-1px)",transition:"all 50ms ease-out"},"&:active":{background:`${theme.input.background}`,transform:"scale3d(1, 1, 1) translateY(0px)",cursor:"grabbing"}},"&::-ms-track":{background:theme.base==="light"?`linear-gradient(to right,
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${(0,import_polished5.darken)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${(0,import_polished5.darken)(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${(0,import_polished5.lighten)(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
${(0,import_polished5.lighten)(.02,theme.input.background)} 100%)`,boxShadow:`${theme.appBorderColor} 0 0 0 1px inset`,color:"transparent",width:"100%",height:"6px",cursor:"pointer"},"&::-ms-fill-lower":{borderRadius:6},"&::-ms-fill-upper":{borderRadius:6},"&::-ms-thumb":{width:16,height:16,background:`${theme.input.background}`,border:`1px solid ${(0,import_polished5.rgba)(theme.appBorderColor,.2)}`,borderRadius:50,cursor:"grab",marginTop:0},"@supports (-ms-ime-align:auto)":{"input[type=range]":{margin:"0"}}})),RangeLabel=import_theming15.styled.span({paddingLeft:5,paddingRight:5,fontSize:12,whiteSpace:"nowrap",fontFeatureSettings:"tnum",fontVariantNumeric:"tabular-nums","[aria-readonly=true] &":{opacity:.5}}),RangeCurrentAndMaxLabel=(0,import_theming15.styled)(RangeLabel)(({numberOFDecimalsPlaces,max})=>({width:`${numberOFDecimalsPlaces+max.toString().length*2+3}ch`,textAlign:"right",flexShrink:0})),RangeWrapper=import_theming15.styled.div({display:"flex",alignItems:"center",width:"100%"});function getNumberOfDecimalPlaces(number){let match=number.toString().match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return match?Math.max(0,(match[1]?match[1].length:0)-(match[2]?+match[2]:0)):0}var RangeControl=({name,value:value2,onChange,min=0,max=100,step=1,onBlur,onFocus,argType})=>{let handleChange=event=>{onChange(parse2(event.target.value))},hasValue=value2!==void 0,numberOFDecimalsPlaces=(0,import_react21.useMemo)(()=>getNumberOfDecimalPlaces(step),[step]),readonly=!!argType?.table?.readonly;return import_react21.default.createElement(RangeWrapper,{"aria-readonly":readonly},import_react21.default.createElement(RangeLabel,null,min),import_react21.default.createElement(RangeInput,{id:getControlId(name),type:"range",disabled:readonly,onChange:handleChange,name,value:value2,min,max,step,onFocus,onBlur}),import_react21.default.createElement(RangeCurrentAndMaxLabel,{numberOFDecimalsPlaces,max},hasValue?value2.toFixed(numberOFDecimalsPlaces):"--"," / ",max))};var import_react22=__toESM(require("react")),import_theming16=require("@storybook/theming"),import_components13=require("@storybook/components");init_helpers();var Wrapper7=import_theming16.styled.label({display:"flex"}),MaxLength=import_theming16.styled.div(({isMaxed})=>({marginLeft:"0.75rem",paddingTop:"0.35rem",color:isMaxed?"red":void 0})),TextControl=({name,value:value2,onChange,onFocus,onBlur,maxLength,argType})=>{let handleChange=event=>{onChange(event.target.value)},readonly=!!argType?.table?.readonly,[forceVisible,setForceVisible]=(0,import_react22.useState)(!1),onForceVisible=(0,import_react22.useCallback)(()=>{onChange(""),setForceVisible(!0)},[setForceVisible]);if(value2===void 0)return import_react22.default.createElement(import_components13.Button,{variant:"outline",size:"medium",disabled:readonly,id:getControlSetterButtonId(name),onClick:onForceVisible},"Set string");let isValid=typeof value2=="string";return import_react22.default.createElement(Wrapper7,null,import_react22.default.createElement(import_components13.Form.Textarea,{id:getControlId(name),maxLength,onChange:handleChange,disabled:readonly,size:"flex",placeholder:"Edit string...",autoFocus:forceVisible,valid:isValid?null:"error",name,value:isValid?value2:"",onFocus,onBlur}),maxLength&&import_react22.default.createElement(MaxLength,{isMaxed:value2?.length===maxLength},value2?.length??0," / ",maxLength))};var import_react23=__toESM(require("react")),import_theming17=require("@storybook/theming"),import_components14=require("@storybook/components");init_helpers();var FileInput=(0,import_theming17.styled)(import_components14.Form.Input)({padding:10});function revokeOldUrls(urls){urls.forEach(url=>{url.startsWith("blob:")&&URL.revokeObjectURL(url)})}var FilesControl=({onChange,name,accept="image/*",value:value2,argType})=>{let inputElement=(0,import_react23.useRef)(null),readonly=argType?.control?.readOnly;function handleFileChange(e){if(!e.target.files)return;let fileUrls=Array.from(e.target.files).map(file=>URL.createObjectURL(file));onChange(fileUrls),revokeOldUrls(value2)}return(0,import_react23.useEffect)(()=>{value2==null&&inputElement.current&&(inputElement.current.value=null)},[value2,name]),import_react23.default.createElement(FileInput,{ref:inputElement,id:getControlId(name),type:"file",name,multiple:!0,disabled:readonly,onChange:handleFileChange,accept,size:"flex"})};var LazyColorControl=(0,import_react25.lazy)(()=>Promise.resolve().then(()=>(init_Color(),Color_exports))),ColorControl2=props=>import_react25.default.createElement(import_react25.Suspense,{fallback:import_react25.default.createElement("div",null)},import_react25.default.createElement(LazyColorControl,{...props}));var Controls2={array:ObjectControl,object:ObjectControl,boolean:BooleanControl,color:ColorControl2,date:DateControl,number:NumberControl,check:OptionsControl,"inline-check":OptionsControl,radio:OptionsControl,"inline-radio":OptionsControl,select:OptionsControl,"multi-select":OptionsControl,range:Ran
Line truncated
|
|
||||||
This is often caused by not wrapping the child in a template string.
|
|
||||||
-
|
|
||||||
+
|
|
||||||
This is invalid:
|
|
||||||
<Markdown>
|
|
||||||
# Some heading
|
|
||||||
@@ -32,4 +32,4 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
|
|
||||||
A paragraph
|
|
||||||
\`}
|
|
||||||
</Markdown>
|
|
||||||
- `);return import_react49.default.createElement(import_markdown_to_jsx2.default,{...props,options:{forceBlock:!0,overrides:{code:CodeOrSourceMdx,a:AnchorMdx,...HeadersMdx,...props?.options?.overrides},...props?.options}})};var DescriptionType=(DescriptionType2=>(DescriptionType2.INFO="info",DescriptionType2.NOTES="notes",DescriptionType2.DOCGEN="docgen",DescriptionType2.AUTO="auto",DescriptionType2))(DescriptionType||{}),getDescriptionFromResolvedOf=resolvedOf=>{switch(resolvedOf.type){case"story":return resolvedOf.story.parameters.docs?.description?.story||null;case"meta":{let{parameters,component}=resolvedOf.preparedMeta,metaDescription=parameters.docs?.description?.component;return metaDescription||parameters.docs?.extractComponentDescription?.(component,{component,parameters})||null}case"component":{let{component,projectAnnotations:{parameters}}=resolvedOf;return parameters.docs?.extractComponentDescription?.(component,{component,parameters})||null}default:throw new Error(`Unrecognized module type resolved from 'useOf', got: ${resolvedOf.type}`)}},DescriptionContainer=props=>{let{of}=props;if("of"in props&&of===void 0)throw new Error("Unexpected `of={undefined}`, did you mistype a CSF file reference?");let resolvedOf=useOf(of||"meta"),markdown=getDescriptionFromResolvedOf(resolvedOf);return markdown?import_react50.default.createElement(Markdown2,null,markdown):null};var import_react61=__toESM(require("react"));var import_react52=__toESM(require("react")),import_global7=require("@storybook/global"),import_theming29=require("@storybook/theming");var import_react51=__toESM(require("react")),import_theming28=require("@storybook/theming"),tocbot=__toESM(require("tocbot")),Wrapper11=import_theming28.styled.div(({theme})=>({width:"10rem","@media (max-width: 768px)":{display:"none"}})),Content=import_theming28.styled.div(({theme})=>({position:"fixed",bottom:0,top:0,width:"10rem",paddingTop:"4rem",paddingBottom:"2rem",overflowY:"auto",fontFamily:theme.typography.fonts.base,fontSize:theme.typography.size.s2,WebkitFontSmoothing:"antialiased",MozOsxFontSmoothing:"grayscale",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)",WebkitOverflowScrolling:"touch","& *":{boxSizing:"border-box"},"& > .toc-wrapper > .toc-list":{paddingLeft:0,borderLeft:`solid 2px ${theme.color.mediumlight}`,".toc-list":{paddingLeft:0,borderLeft:`solid 2px ${theme.color.mediumlight}`,".toc-list":{paddingLeft:0,borderLeft:`solid 2px ${theme.color.mediumlight}`}}},"& .toc-list-item":{position:"relative",listStyleType:"none",marginLeft:20,paddingTop:3,paddingBottom:3},"& .toc-list-item::before":{content:'""',position:"absolute",height:"100%",top:0,left:0,transform:"translateX(calc(-2px - 20px))",borderLeft:`solid 2px ${theme.color.mediumdark}`,opacity:0,transition:"opacity 0.2s"},"& .toc-list-item.is-active-li::before":{opacity:1},"& .toc-list-item > a":{color:theme.color.defaultText,textDecoration:"none"},"& .toc-list-item.is-active-li > a":{fontWeight:600,color:theme.color.secondary,textDecoration:"none"}})),Heading=import_theming28.styled.p(({theme})=>({fontWeight:600,fontSize:"0.875em",color:theme.textColor,textTransform:"uppercase",marginBottom:10})),OptionalTitle=({title})=>title===null?null:typeof title=="string"?import_react51.default.createElement(Heading,null,title):title,TableOfContents=({title,disable,headingSelector,contentsSelector,ignoreSelector,unsafeTocbotOptions})=>((0,import_react51.useEffect)(()=>{let configuration={tocSelector:".toc-wrapper",contentSelector:contentsSelector??".sbdocs-content",headingSelector:headingSelector??"h3",ignoreSelector:ignoreSelector??".docs-story *, .skip-toc",headingsOffset:40,scrollSmoothOffset:-40,orderedList:!1,onClick:()=>!1,...unsafeTocbotOptions},timeout=setTimeout(()=>tocbot.init(configuration),100);return()=>{clearTimeout(timeout),tocbot.destroy()}},[disable]),import_react51.default.createElement(import_react51.default.Fragment,null,import_react51.default.createElement(Wrapper11,null,disable?null:import_react51.default.createElement(Content,null,import_react51.default.createElement(OptionalTitle,{title:title||null}),import_react51.default.createElement("div",{className:"toc-wrapper"})))));var{document:document3,window:globalWindow3}=import_global7.global,DocsContainer=({context,theme,children})=>{let toc;try{toc=context.resolveOf("meta",["meta"]).preparedMeta.parameters?.docs?.toc}catch{toc=context?.projectAnnotations?.parameters?.docs?.toc}return(0,import_react52.useEffect)(()=>{let url;try{if(url=new URL(globalWindow3.parent.location.toString()),url.hash){let element=document3.getElementById(url.hash.substring(1));element&&setTimeout(()=>{scrollToElement(element)},200)}}catch{}}),import_react52.default.createElement(DocsContext.Provider,{value:context},import_react52.default.createElement(SourceContainer,{channel:context.channel},import_react52.default.createElement(import_theming29.ThemeProvider,{theme:(0,import_theming29.ensure)(theme)},import_react52.default.createElement(DocsPageWrappe
Line truncated
|
|
||||||
+ `);return import_react49.default.createElement(import_markdown_to_jsx2.default,{...props,options:{forceBlock:!0,overrides:{code:CodeOrSourceMdx,a:AnchorMdx,...HeadersMdx,...props?.options?.overrides},...props?.options}})};var DescriptionType=(DescriptionType2=>(DescriptionType2.INFO="info",DescriptionType2.NOTES="notes",DescriptionType2.DOCGEN="docgen",DescriptionType2.AUTO="auto",DescriptionType2))(DescriptionType||{}),getDescriptionFromResolvedOf=resolvedOf=>{switch(resolvedOf.type){case"story":return resolvedOf.story.parameters.docs?.description?.story||null;case"meta":{let{parameters,component}=resolvedOf.preparedMeta,metaDescription=parameters.docs?.description?.component;return metaDescription||parameters.docs?.extractComponentDescription?.(component,{component,parameters})||null}case"component":{let{component,projectAnnotations:{parameters}}=resolvedOf;return parameters.docs?.extractComponentDescription?.(component,{component,parameters})||null}default:throw new Error(`Unrecognized module type resolved from 'useOf', got: ${resolvedOf.type}`)}},DescriptionContainer=props=>{let{of}=props;if("of"in props&&of===void 0)throw new Error("Unexpected `of={undefined}`, did you mistype a CSF file reference?");let resolvedOf=useOf(of||"meta"),markdown=getDescriptionFromResolvedOf(resolvedOf);return markdown?import_react50.default.createElement(Markdown2,null,markdown):null};var import_react61=__toESM(require("react"));var import_react52=__toESM(require("react")),import_global7=require("@storybook/global"),import_theming29=require("@storybook/theming");var import_react51=__toESM(require("react")),import_theming28=require("@storybook/theming"),tocbot=__toESM(require("tocbot")),Wrapper11=import_theming28.styled.div(({theme})=>({width:"10rem","@media (max-width: 768px)":{display:"none"}})),Content=import_theming28.styled.div(({theme})=>({position:"fixed",bottom:0,top:0,width:"10rem",paddingTop:"4rem",paddingBottom:"2rem",overflowY:"auto",fontFamily:theme.typography.fonts.base,fontSize:theme.typography.size.s2,WebkitFontSmoothing:"antialiased",MozOsxFontSmoothing:"grayscale",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)",WebkitOverflowScrolling:"touch","& *":{boxSizing:"border-box"},"& > .toc-wrapper > .toc-list":{paddingLeft:0,borderLeft:`solid 2px ${theme.color.mediumlight}`,".toc-list":{paddingLeft:0,borderLeft:`solid 2px ${theme.color.mediumlight}`,".toc-list":{paddingLeft:0,borderLeft:`solid 2px ${theme.color.mediumlight}`}}},"& .toc-list-item":{position:"relative",listStyleType:"none",marginLeft:20,paddingTop:3,paddingBottom:3},"& .toc-list-item::before":{content:'""',position:"absolute",height:"100%",top:0,left:0,transform:"translateX(calc(-2px - 20px))",borderLeft:`solid 2px ${theme.color.mediumdark}`,opacity:0,transition:"opacity 0.2s"},"& .toc-list-item.is-active-li::before":{opacity:1},"& .toc-list-item > a":{color:theme.color.defaultText,textDecoration:"none"},"& .toc-list-item.is-active-li > a":{fontWeight:600,color:theme.color.secondary,textDecoration:"none"}})),Heading=import_theming28.styled.p(({theme})=>({fontWeight:600,fontSize:"0.875em",color:theme.textColor,textTransform:"uppercase",marginBottom:10})),OptionalTitle=({title})=>title===null?null:typeof title=="string"?import_react51.default.createElement(Heading,null,title):title,TableOfContents=({title,disable,headingSelector,contentsSelector,ignoreSelector,unsafeTocbotOptions})=>((0,import_react51.useEffect)(()=>{let configuration={tocSelector:".toc-wrapper",contentSelector:contentsSelector??".sbdocs-content",headingSelector:headingSelector??"h3",ignoreSelector:ignoreSelector??".docs-story *, .skip-toc",headingsOffset:40,scrollSmoothOffset:-40,orderedList:!1,onClick:()=>!1,...unsafeTocbotOptions},timeout=setTimeout(()=>tocbot.init(configuration),100);return()=>{clearTimeout(timeout),tocbot.destroy()}},[disable]),import_react51.default.createElement(import_react51.default.Fragment,null,import_react51.default.createElement(Wrapper11,null,disable?null:import_react51.default.createElement(Content,null,import_react51.default.createElement(OptionalTitle,{title:title||null}),import_react51.default.createElement("div",{className:"toc-wrapper"})))));var{document:document3,window:globalWindow3}=import_global7.global,DocsContainer=({context,theme,children})=>{let toc;try{toc=context.resolveOf("meta",["meta"]).preparedMeta.parameters?.docs?.toc}catch{toc=context?.projectAnnotations?.parameters?.docs?.toc}return(0,import_react52.useEffect)(()=>{let url;try{if(url=new URL(globalWindow3.parent.location.toString()),url.hash){let element=document3.getElementById(url.hash.substring(1));element&&setTimeout(()=>{scrollToElement(element)},200)}}catch{}}),import_react52.default.createElement(DocsContext.Provider,{value:context},import_react52.default.createElement(SourceContainer,{channel:context.channel},import_react52.default.createElement(import_theming29.ThemeProvider,{theme:(0,import_theming29.ensure)(theme)},import_react52.default.createElement(DocsPageWrappe
Line truncated
|
|
||||||
diff --git a/dist/index.mjs b/dist/index.mjs
|
|
||||||
index a626b2de91e14417fad86dbea9cc5c4dac49a222..0cf497db98ebdf4961a06e25ca634f7081a68665 100644
|
|
||||||
--- a/dist/index.mjs
|
|
||||||
+++ b/dist/index.mjs
|
|
||||||
@@ -20,27 +20,27 @@ import dedent from 'ts-dedent';
|
|
||||||
import * as tocbot from 'tocbot';
|
|
||||||
import { Channel } from '@storybook/channels';
|
|
||||||
|
|
||||||
-var Wrapper=styled.div(withReset,({theme})=>({backgroundColor:theme.base==="light"?"rgba(0,0,0,.01)":"rgba(255,255,255,.01)",borderRadius:theme.appBorderRadius,border:`1px dashed ${theme.appBorderColor}`,display:"flex",alignItems:"center",justifyContent:"center",padding:20,margin:"25px 0 40px",color:transparentize(.3,theme.color.defaultText),fontSize:theme.typography.size.s2})),EmptyBlock=props=>React17.createElement(Wrapper,{...props,className:"docblock-emptyblock sb-unstyled"});var StyledSyntaxHighlighter=styled(SyntaxHighlighter)(({theme})=>({fontSize:`${theme.typography.size.s2-1}px`,lineHeight:"19px",margin:"25px 0 40px",borderRadius:theme.appBorderRadius,boxShadow:theme.base==="light"?"rgba(0, 0, 0, 0.10) 0 1px 3px 0":"rgba(0, 0, 0, 0.20) 0 2px 5px 0","pre.prismjs":{padding:20,background:"inherit"}}));var SourceSkeletonWrapper=styled.div(({theme})=>({background:theme.background.content,borderRadius:theme.appBorderRadius,border:`1px solid ${theme.appBorderColor}`,boxShadow:theme.base==="light"?"rgba(0, 0, 0, 0.10) 0 1px 3px 0":"rgba(0, 0, 0, 0.20) 0 2px 5px 0",margin:"25px 0 40px",padding:"20px 20px 20px 22px"})),SourceSkeletonPlaceholder=styled.div(({theme})=>({animation:`${theme.animation.glow} 1.5s ease-in-out infinite`,background:theme.appBorderColor,height:17,marginTop:1,width:"60%",[`&:first-child${ignoreSsrWarning}`]:{margin:0}})),SourceSkeleton=()=>React17.createElement(SourceSkeletonWrapper,null,React17.createElement(SourceSkeletonPlaceholder,null),React17.createElement(SourceSkeletonPlaceholder,{style:{width:"80%"}}),React17.createElement(SourceSkeletonPlaceholder,{style:{width:"30%"}}),React17.createElement(SourceSkeletonPlaceholder,{style:{width:"80%"}})),Source=({isLoading,error,language,code,dark,format:format2=!1,...rest})=>{let{typography}=useTheme();if(isLoading)return React17.createElement(SourceSkeleton,null);if(error)return React17.createElement(EmptyBlock,null,error);let syntaxHighlighter=React17.createElement(StyledSyntaxHighlighter,{bordered:!0,copyable:!0,format:format2,language,className:"docblock-source sb-unstyled",...rest},code);if(typeof dark>"u")return syntaxHighlighter;let overrideTheme=dark?themes.dark:themes.light;return React17.createElement(ThemeProvider,{theme:convert({...overrideTheme,fontCode:typography.fonts.mono,fontBase:typography.fonts.base})},syntaxHighlighter)};var toGlobalSelector=element=>`& :where(${element}:not(.sb-anchor, .sb-unstyled, .sb-unstyled ${element}))`,breakpoint=600,Title=styled.h1(withReset,({theme})=>({color:theme.color.defaultText,fontSize:theme.typography.size.m3,fontWeight:theme.typography.weight.bold,lineHeight:"32px",[`@media (min-width: ${breakpoint}px)`]:{fontSize:theme.typography.size.l1,lineHeight:"36px",marginBottom:"16px"}})),Subtitle=styled.h2(withReset,({theme})=>({fontWeight:theme.typography.weight.regular,fontSize:theme.typography.size.s3,lineHeight:"20px",borderBottom:"none",marginBottom:15,[`@media (min-width: ${breakpoint}px)`]:{fontSize:theme.typography.size.m1,lineHeight:"28px",marginBottom:24},color:transparentize(.25,theme.color.defaultText)})),DocsContent=styled.div(({theme})=>{let reset={fontFamily:theme.typography.fonts.base,fontSize:theme.typography.size.s3,margin:0,WebkitFontSmoothing:"antialiased",MozOsxFontSmoothing:"grayscale",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)",WebkitOverflowScrolling:"touch"},headers={margin:"20px 0 8px",padding:0,cursor:"text",position:"relative",color:theme.color.defaultText,"&:first-of-type":{marginTop:0,paddingTop:0},"&:hover a.anchor":{textDecoration:"none"},"& code":{fontSize:"inherit"}},code={lineHeight:1,margin:"0 2px",padding:"3px 5px",whiteSpace:"nowrap",borderRadius:3,fontSize:theme.typography.size.s2-1,border:theme.base==="light"?`1px solid ${theme.color.mediumlight}`:`1px solid ${theme.color.darker}`,color:theme.base==="light"?transparentize(.1,theme.color.defaultText):transparentize(.3,theme.color.defaultText),backgroundColor:theme.base==="light"?theme.color.lighter:theme.color.border};return {maxWidth:1e3,width:"100%",[toGlobalSelector("a")]:{...reset,fontSize:"inherit",lineHeight:"24px",color:theme.color.secondary,textDecoration:"none","&.absent":{color:"#cc0000"},"&.anchor":{display:"block",paddingLeft:30,marginLeft:-30,cursor:"pointer",position:"absolute",top:0,left:0,bottom:0}},[toGlobalSelector("blockquote")]:{...reset,margin:"16px 0",borderLeft:`4px solid ${theme.color.medium}`,padding:"0 15px",color:theme.color.dark,"& > :first-of-type":{marginTop:0},"& > :last-child":{marginBottom:0}},[toGlobalSelector("div")]:reset,[toGlobalSelector("dl")]:{...reset,margin:"16px 0",padding:0,"& dt":{fontSize:"14px",fontWeight:"bold",fontStyle:"italic",padding:0,margin:"16px 0 4px"},"& dt:first-of-type":{padding:0},"& dt > :first-of-type":{marginTop:0},"& dt > :last-child":{marginBottom:0},"& dd":{margin:"0 0 16px",padding:"0 15px"},"& dd > :first-of-type":{marginTop:0},"& dd > :last-child":{marginBottom:0}},[toGlobalSelector("h1")]:{...reset,...headers,fontSize:`${theme.typogra
Line truncated
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${darken(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${darken(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${lighten(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${lighten(.02,theme.input.background)} 100%)`,boxShadow:`${theme.appBorderColor} 0 0 0 1px inset`,borderRadius:6,width:"100%",height:6,cursor:disabled?"not-allowed":"pointer"},"&::-webkit-slider-thumb":{marginTop:"-6px",width:16,height:16,border:`1px solid ${rgba(theme.appBorderColor,.2)}`,borderRadius:"50px",boxShadow:`0 1px 3px 0px ${rgba(theme.appBorderColor,.2)}`,cursor:disabled?"not-allowed":"grab",appearance:"none",background:`${theme.input.background}`,transition:"all 150ms ease-out","&:hover":{background:`${darken(.05,theme.input.background)}`,transform:"scale3d(1.1, 1.1, 1.1) translateY(-1px)",transition:"all 50ms ease-out"},"&:active":{background:`${theme.input.background}`,transform:"scale3d(1, 1, 1) translateY(0px)",cursor:disabled?"not-allowed":"grab"}},"&:focus":{outline:"none","&::-webkit-slider-runnable-track":{borderColor:rgba(theme.color.secondary,.4)},"&::-webkit-slider-thumb":{borderColor:theme.color.secondary,boxShadow:`0 0px 5px 0px ${theme.color.secondary}`}},"&::-moz-range-track":{background:theme.base==="light"?`linear-gradient(to right,
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${darken(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${darken(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${lighten(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${lighten(.02,theme.input.background)} 100%)`,boxShadow:`${theme.appBorderColor} 0 0 0 1px inset`,borderRadius:6,width:"100%",height:6,cursor:disabled?"not-allowed":"pointer",outline:"none"},"&::-moz-range-thumb":{width:16,height:16,border:`1px solid ${rgba(theme.appBorderColor,.2)}`,borderRadius:"50px",boxShadow:`0 1px 3px 0px ${rgba(theme.appBorderColor,.2)}`,cursor:disabled?"not-allowed":"grap",background:`${theme.input.background}`,transition:"all 150ms ease-out","&:hover":{background:`${darken(.05,theme.input.background)}`,transform:"scale3d(1.1, 1.1, 1.1) translateY(-1px)",transition:"all 50ms ease-out"},"&:active":{background:`${theme.input.background}`,transform:"scale3d(1, 1, 1) translateY(0px)",cursor:"grabbing"}},"&::-ms-track":{background:theme.base==="light"?`linear-gradient(to right,
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${darken(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${darken(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
- ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
- ${lighten(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+var Wrapper=styled.div(withReset,({theme})=>({backgroundColor:theme.base==="light"?"rgba(0,0,0,.01)":"rgba(255,255,255,.01)",borderRadius:theme.appBorderRadius,border:`1px dashed ${theme.appBorderColor}`,display:"flex",alignItems:"center",justifyContent:"center",padding:20,margin:"25px 0 40px",color:transparentize(.3,theme.color.defaultText),fontSize:theme.typography.size.s2})),EmptyBlock=props=>React17.createElement(Wrapper,{...props,className:"docblock-emptyblock sb-unstyled"});var StyledSyntaxHighlighter=styled(SyntaxHighlighter)(({theme})=>({fontSize:`${theme.typography.size.s2-1}px`,lineHeight:"19px",margin:"25px 0 40px",borderRadius:theme.appBorderRadius,boxShadow:theme.base==="light"?"rgba(0, 0, 0, 0.10) 0 1px 3px 0":"rgba(0, 0, 0, 0.20) 0 2px 5px 0","pre.prismjs":{padding:20,background:"inherit"}}));var SourceSkeletonWrapper=styled.div(({theme})=>({background:theme.background.content,borderRadius:theme.appBorderRadius,border:`1px solid ${theme.appBorderColor}`,boxShadow:theme.base==="light"?"rgba(0, 0, 0, 0.10) 0 1px 3px 0":"rgba(0, 0, 0, 0.20) 0 2px 5px 0",margin:"25px 0 40px",padding:"20px 20px 20px 22px"})),SourceSkeletonPlaceholder=styled.div(({theme})=>({animation:`${theme.animation.glow} 1.5s ease-in-out infinite`,background:theme.appBorderColor,height:17,marginTop:1,width:"60%",[`&:first-child${ignoreSsrWarning}`]:{margin:0}})),SourceSkeleton=()=>React17.createElement(SourceSkeletonWrapper,null,React17.createElement(SourceSkeletonPlaceholder,null),React17.createElement(SourceSkeletonPlaceholder,{style:{width:"80%"}}),React17.createElement(SourceSkeletonPlaceholder,{style:{width:"30%"}}),React17.createElement(SourceSkeletonPlaceholder,{style:{width:"80%"}})),Source=({isLoading,error,language,code,dark,format:format2=!1,...rest})=>{let{typography}=useTheme();if(isLoading)return React17.createElement(SourceSkeleton,null);if(error)return React17.createElement(EmptyBlock,null,error);let syntaxHighlighter=React17.createElement(StyledSyntaxHighlighter,{bordered:!0,copyable:!0,format:format2,language,className:"docblock-source sb-unstyled",...rest},code);if(typeof dark>"u")return syntaxHighlighter;let overrideTheme=dark?themes.dark:themes.light;return React17.createElement(ThemeProvider,{theme:convert({...overrideTheme,fontCode:typography.fonts.mono,fontBase:typography.fonts.base})},syntaxHighlighter)};var toGlobalSelector=element=>`& :where(${element}:not(.sb-anchor, .sb-unstyled, .sb-unstyled ${element}))`,breakpoint=600,Title=styled.h1(withReset,({theme})=>({color:theme.color.defaultText,fontSize:theme.typography.size.m3,fontWeight:theme.typography.weight.bold,lineHeight:"32px",[`@media (min-width: ${breakpoint}px)`]:{fontSize:theme.typography.size.l1,lineHeight:"36px",marginBottom:"16px"}})),Subtitle=styled.h2(withReset,({theme})=>({fontWeight:theme.typography.weight.regular,fontSize:theme.typography.size.s3,lineHeight:"20px",borderBottom:"none",marginBottom:15,[`@media (min-width: ${breakpoint}px)`]:{fontSize:theme.typography.size.m1,lineHeight:"28px",marginBottom:24},color:transparentize(.25,theme.color.defaultText)})),DocsContent=styled.div(({theme})=>{let reset={fontFamily:theme.typography.fonts.base,fontSize:theme.typography.size.s3,margin:0,WebkitFontSmoothing:"antialiased",MozOsxFontSmoothing:"grayscale",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)",WebkitOverflowScrolling:"touch"},headers={margin:"20px 0 8px",padding:0,cursor:"text",position:"relative",color:theme.color.defaultText,"&:first-of-type":{marginTop:0,paddingTop:0},"&:hover a.anchor":{textDecoration:"none"},"& code":{fontSize:"inherit"}},code={lineHeight:1,margin:"0 2px",padding:"3px 5px",whiteSpace:"nowrap",borderRadius:3,fontSize:theme.typography.size.s2-1,border:theme.base==="light"?`1px solid ${theme.color.mediumlight}`:`1px solid ${theme.color.darker}`,color:theme.base==="light"?transparentize(.1,theme.color.defaultText):transparentize(.3,theme.color.defaultText),backgroundColor:theme.base==="light"?theme.color.lighter:theme.color.border};return {maxWidth:1e3,width:"100%",[toGlobalSelector("a")]:{...reset,fontSize:"inherit",lineHeight:"24px",color:theme.color.secondary,textDecoration:"none","&.absent":{color:"#cc0000"},"&.anchor":{display:"block",paddingLeft:30,marginLeft:-30,cursor:"pointer",position:"absolute",top:0,left:0,bottom:0}},[toGlobalSelector("blockquote")]:{...reset,margin:"16px 0",borderLeft:`4px solid ${theme.color.medium}`,padding:"0 15px",color:theme.color.dark,"& > :first-of-type":{marginTop:0},"& > :last-child":{marginBottom:0}},[toGlobalSelector("div")]:reset,[toGlobalSelector("dl")]:{...reset,margin:"16px 0",padding:0,"& dt":{fontSize:"14px",fontWeight:"bold",fontStyle:"italic",padding:0,margin:"16px 0 4px"},"& dt:first-of-type":{padding:0},"& dt > :first-of-type":{marginTop:0},"& dt > :last-child":{marginBottom:0},"& dd":{margin:"0 0 16px",padding:"0 15px"},"& dd > :first-of-type":{marginTop:0},"& dd > :last-child":{marginBottom:0}},[toGlobalSelector("h1")]:{...reset,...headers,fontSize:`${theme.typogra
Line truncated
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${darken(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${darken(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${lighten(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${lighten(.02,theme.input.background)} 100%)`,boxShadow:`${theme.appBorderColor} 0 0 0 1px inset`,borderRadius:6,width:"100%",height:6,cursor:disabled?"not-allowed":"pointer"},"&::-webkit-slider-thumb":{marginTop:"-6px",width:16,height:16,border:`1px solid ${rgba(theme.appBorderColor,.2)}`,borderRadius:"50px",boxShadow:`0 1px 3px 0px ${rgba(theme.appBorderColor,.2)}`,cursor:disabled?"not-allowed":"grab",appearance:"none",background:`${theme.input.background}`,transition:"all 150ms ease-out","&:hover":{background:`${darken(.05,theme.input.background)}`,transform:"scale3d(1.1, 1.1, 1.1) translateY(-1px)",transition:"all 50ms ease-out"},"&:active":{background:`${theme.input.background}`,transform:"scale3d(1, 1, 1) translateY(0px)",cursor:disabled?"not-allowed":"grab"}},"&:focus":{outline:"none","&::-webkit-slider-runnable-track":{borderColor:rgba(theme.color.secondary,.4)},"&::-webkit-slider-thumb":{borderColor:theme.color.secondary,boxShadow:`0 0px 5px 0px ${theme.color.secondary}`}},"&::-moz-range-track":{background:theme.base==="light"?`linear-gradient(to right,
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${darken(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${darken(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${lighten(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${lighten(.02,theme.input.background)} 100%)`,boxShadow:`${theme.appBorderColor} 0 0 0 1px inset`,borderRadius:6,width:"100%",height:6,cursor:disabled?"not-allowed":"pointer",outline:"none"},"&::-moz-range-thumb":{width:16,height:16,border:`1px solid ${rgba(theme.appBorderColor,.2)}`,borderRadius:"50px",boxShadow:`0 1px 3px 0px ${rgba(theme.appBorderColor,.2)}`,cursor:disabled?"not-allowed":"grap",background:`${theme.input.background}`,transition:"all 150ms ease-out","&:hover":{background:`${darken(.05,theme.input.background)}`,transform:"scale3d(1.1, 1.1, 1.1) translateY(-1px)",transition:"all 50ms ease-out"},"&:active":{background:`${theme.input.background}`,transform:"scale3d(1, 1, 1) translateY(0px)",cursor:"grabbing"}},"&::-ms-track":{background:theme.base==="light"?`linear-gradient(to right,
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${darken(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${darken(.02,theme.input.background)} 100%)`:`linear-gradient(to right,
|
|
||||||
+ ${theme.color.green} 0%, ${theme.color.green} ${(value2-min)/(max-min)*100}%,
|
|
||||||
+ ${lighten(.02,theme.input.background)} ${(value2-min)/(max-min)*100}%,
|
|
||||||
${lighten(.02,theme.input.background)} 100%)`,boxShadow:`${theme.appBorderColor} 0 0 0 1px inset`,color:"transparent",width:"100%",height:"6px",cursor:"pointer"},"&::-ms-fill-lower":{borderRadius:6},"&::-ms-fill-upper":{borderRadius:6},"&::-ms-thumb":{width:16,height:16,background:`${theme.input.background}`,border:`1px solid ${rgba(theme.appBorderColor,.2)}`,borderRadius:50,cursor:"grab",marginTop:0},"@supports (-ms-ime-align:auto)":{"input[type=range]":{margin:"0"}}})),RangeLabel=styled.span({paddingLeft:5,paddingRight:5,fontSize:12,whiteSpace:"nowrap",fontFeatureSettings:"tnum",fontVariantNumeric:"tabular-nums","[aria-readonly=true] &":{opacity:.5}}),RangeCurrentAndMaxLabel=styled(RangeLabel)(({numberOFDecimalsPlaces,max})=>({width:`${numberOFDecimalsPlaces+max.toString().length*2+3}ch`,textAlign:"right",flexShrink:0})),RangeWrapper=styled.div({display:"flex",alignItems:"center",width:"100%"});function getNumberOfDecimalPlaces(number){let match=number.toString().match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return match?Math.max(0,(match[1]?match[1].length:0)-(match[2]?+match[2]:0)):0}var RangeControl=({name,value:value2,onChange,min=0,max=100,step=1,onBlur,onFocus,argType})=>{let handleChange=event=>{onChange(parse2(event.target.value));},hasValue=value2!==void 0,numberOFDecimalsPlaces=useMemo(()=>getNumberOfDecimalPlaces(step),[step]),readonly=!!argType?.table?.readonly;return React17.createElement(RangeWrapper,{"aria-readonly":readonly},React17.createElement(RangeLabel,null,min),React17.createElement(RangeInput,{id:getControlId(name),type:"range",disabled:readonly,onChange:handleChange,name,value:value2,min,max,step,onFocus,onBlur}),React17.createElement(RangeCurrentAndMaxLabel,{numberOFDecimalsPlaces,max},hasValue?value2.toFixed(numberOFDecimalsPlaces):"--"," / ",max))};var Wrapper7=styled.label({display:"flex"}),MaxLength=styled.div(({isMaxed})=>({marginLeft:"0.75rem",paddingTop:"0.35rem",color:isMaxed?"red":void 0})),TextControl=({name,value:value2,onChange,onFocus,onBlur,maxLength,argType})=>{let handleChange=event=>{onChange(event.target.value);},readonly=!!argType?.table?.readonly,[forceVisible,setForceVisible]=useState(!1),onForceVisible=useCallback(()=>{onChange(""),setForceVisible(!0);},[setForceVisible]);if(value2===void 0)return React17.createElement(Button,{variant:"outline",size:"medium",disabled:readonly,id:getControlSetterButtonId(name),onClick:onForceVisible},"Set string");let isValid=typeof value2=="string";return React17.createElement(Wrapper7,null,React17.createElement(Form.Textarea,{id:getControlId(name),maxLength,onChange:handleChange,disabled:readonly,size:"flex",placeholder:"Edit string...",autoFocus:forceVisible,valid:isValid?null:"error",name,value:isValid?value2:"",onFocus,onBlur}),maxLength&&React17.createElement(MaxLength,{isMaxed:value2?.length===maxLength},value2?.length??0," / ",maxLength))};var FileInput=styled(Form.Input)({padding:10});function revokeOldUrls(urls){urls.forEach(url=>{url.startsWith("blob:")&&URL.revokeObjectURL(url);});}var FilesControl=({onChange,name,accept="image/*",value:value2,argType})=>{let inputElement=useRef(null),readonly=argType?.control?.readOnly;function handleFileChange(e){if(!e.target.files)return;let fileUrls=Array.from(e.target.files).map(file=>URL.createObjectURL(file));onChange(fileUrls),revokeOldUrls(value2);}return useEffect(()=>{value2==null&&inputElement.current&&(inputElement.current.value=null);},[value2,name]),React17.createElement(FileInput,{ref:inputElement,id:getControlId(name),type:"file",name,multiple:!0,disabled:readonly,onChange:handleFileChange,accept,size:"flex"})};var LazyColorControl=lazy(()=>import('./Color-PRSJMWNM.mjs')),ColorControl=props=>React17.createElement(Suspense,{fallback:React17.createElement("div",null)},React17.createElement(LazyColorControl,{...props}));var Controls2={array:ObjectControl,object:ObjectControl,boolean:BooleanControl,color:ColorControl,date:DateControl,number:NumberControl,check:OptionsControl,"inline-check":OptionsControl,radio:OptionsControl,"inline-radio":OptionsControl,select:OptionsControl,"multi-select":OptionsControl,range:RangeControl,text:TextControl,file:FilesControl},NoControl=()=>React17.createElement(React17.Fragment,null,"-"),ArgControl=({row,arg,updateArgs,isHovered})=>{let{key,control}=row,[isFocused,setFocused]=useState(!1),[boxedValue,setBoxedValue]=useState({value:arg});useEffect(()=>{isFocused||setBoxedValue({value:arg});},[isFocused,arg]);let onChange=useCallback(argVal=>(setBoxedValue({value:argVal}),updateArgs({[key]:argVal}),argVal),[updateArgs,key]),onBlur=useCallback(()=>setFocused(!1),[]),onFocus=useCallback(()=>setFocused(!0),[]);if(!control||control.disable){let canBeSetup=control?.disable!==!0&&row?.type?.name!=="function";return isHovered&&canBeSetup?React17.createElement(Link,{href:"https://storybook.js.org/docs/react/essentials/controls",target:"_blank",withArrow:!0},"Setup controls"):React17.createElement(NoControl,null)}let props={name:key,arg
Line truncated
|
|
||||||
This is often caused by not wrapping the child in a template string.
|
|
||||||
-
|
|
||||||
+
|
|
||||||
This is invalid:
|
|
||||||
<Markdown>
|
|
||||||
# Some heading
|
|
||||||
@@ -56,4 +56,4 @@ var Wrapper=styled.div(withReset,({theme})=>({backgroundColor:theme.base==="ligh
|
|
||||||
</Markdown>
|
|
||||||
`);return React17.createElement(Markdown,{...props,options:{forceBlock:!0,overrides:{code:CodeOrSourceMdx,a:AnchorMdx,...HeadersMdx,...props?.options?.overrides},...props?.options}})};var DescriptionType=(DescriptionType2=>(DescriptionType2.INFO="info",DescriptionType2.NOTES="notes",DescriptionType2.DOCGEN="docgen",DescriptionType2.AUTO="auto",DescriptionType2))(DescriptionType||{}),getDescriptionFromResolvedOf=resolvedOf=>{switch(resolvedOf.type){case"story":return resolvedOf.story.parameters.docs?.description?.story||null;case"meta":{let{parameters,component}=resolvedOf.preparedMeta,metaDescription=parameters.docs?.description?.component;return metaDescription||parameters.docs?.extractComponentDescription?.(component,{component,parameters})||null}case"component":{let{component,projectAnnotations:{parameters}}=resolvedOf;return parameters.docs?.extractComponentDescription?.(component,{component,parameters})||null}default:throw new Error(`Unrecognized module type resolved from 'useOf', got: ${resolvedOf.type}`)}},DescriptionContainer=props=>{let{of}=props;if("of"in props&&of===void 0)throw new Error("Unexpected `of={undefined}`, did you mistype a CSF file reference?");let resolvedOf=useOf(of||"meta"),markdown=getDescriptionFromResolvedOf(resolvedOf);return markdown?React17.createElement(Markdown2,null,markdown):null};var Wrapper10=styled.div(({theme})=>({width:"10rem","@media (max-width: 768px)":{display:"none"}})),Content=styled.div(({theme})=>({position:"fixed",bottom:0,top:0,width:"10rem",paddingTop:"4rem",paddingBottom:"2rem",overflowY:"auto",fontFamily:theme.typography.fonts.base,fontSize:theme.typography.size.s2,WebkitFontSmoothing:"antialiased",MozOsxFontSmoothing:"grayscale",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)",WebkitOverflowScrolling:"touch","& *":{boxSizing:"border-box"},"& > .toc-wrapper > .toc-list":{paddingLeft:0,borderLeft:`solid 2px ${theme.color.mediumlight}`,".toc-list":{paddingLeft:0,borderLeft:`solid 2px ${theme.color.mediumlight}`,".toc-list":{paddingLeft:0,borderLeft:`solid 2px ${theme.color.mediumlight}`}}},"& .toc-list-item":{position:"relative",listStyleType:"none",marginLeft:20,paddingTop:3,paddingBottom:3},"& .toc-list-item::before":{content:'""',position:"absolute",height:"100%",top:0,left:0,transform:"translateX(calc(-2px - 20px))",borderLeft:`solid 2px ${theme.color.mediumdark}`,opacity:0,transition:"opacity 0.2s"},"& .toc-list-item.is-active-li::before":{opacity:1},"& .toc-list-item > a":{color:theme.color.defaultText,textDecoration:"none"},"& .toc-list-item.is-active-li > a":{fontWeight:600,color:theme.color.secondary,textDecoration:"none"}})),Heading=styled.p(({theme})=>({fontWeight:600,fontSize:"0.875em",color:theme.textColor,textTransform:"uppercase",marginBottom:10})),OptionalTitle=({title})=>title===null?null:typeof title=="string"?React17.createElement(Heading,null,title):title,TableOfContents=({title,disable,headingSelector,contentsSelector,ignoreSelector,unsafeTocbotOptions})=>(useEffect(()=>{let configuration={tocSelector:".toc-wrapper",contentSelector:contentsSelector??".sbdocs-content",headingSelector:headingSelector??"h3",ignoreSelector:ignoreSelector??".docs-story *, .skip-toc",headingsOffset:40,scrollSmoothOffset:-40,orderedList:!1,onClick:()=>!1,...unsafeTocbotOptions},timeout=setTimeout(()=>tocbot.init(configuration),100);return ()=>{clearTimeout(timeout),tocbot.destroy();}},[disable]),React17.createElement(React17.Fragment,null,React17.createElement(Wrapper10,null,disable?null:React17.createElement(Content,null,React17.createElement(OptionalTitle,{title:title||null}),React17.createElement("div",{className:"toc-wrapper"})))));var {document:document3,window:globalWindow3}=global,DocsContainer=({context,theme,children})=>{let toc;try{toc=context.resolveOf("meta",["meta"]).preparedMeta.parameters?.docs?.toc;}catch{toc=context?.projectAnnotations?.parameters?.docs?.toc;}return useEffect(()=>{let url;try{if(url=new URL(globalWindow3.parent.location.toString()),url.hash){let element=document3.getElementById(url.hash.substring(1));element&&setTimeout(()=>{scrollToElement(element);},200);}}catch{}}),React17.createElement(DocsContext.Provider,{value:context},React17.createElement(SourceContainer,{channel:context.channel},React17.createElement(ThemeProvider,{theme:ensure(theme)},React17.createElement(DocsPageWrapper,{toc:toc?React17.createElement(TableOfContents,{className:"sbdocs sbdocs-toc--custom",...toc}):null},children))))};var STORY_KIND_PATH_SEPARATOR=/\s*\/\s*/,extractTitle=title=>{let groups=title.trim().split(STORY_KIND_PATH_SEPARATOR);return groups?.[groups?.length-1]||title},Title2=props=>{let{children,of}=props;if("of"in props&&of===void 0)throw new Error("Unexpected `of={undefined}`, did you mistype a CSF file reference?");let preparedMeta;try{preparedMeta=useOf(of||"meta",["meta"]).preparedMeta;}catch(error){if(children&&!error.message.includes("did you forget to use <Meta of={} />?"))throw error}let content=children||extractTitle(preparedMet
Line truncated
|
|
||||||
|
|
||||||
-export { AddContext, Anchor, AnchorMdx, ArgTypes, BooleanControl, Canvas, CodeOrSourceMdx, ColorControl, ColorItem, ColorPalette, Controls3 as Controls, DateControl, DescriptionContainer as Description, DescriptionType, Docs, DocsContainer, DocsContext, DocsPage, DocsStory, ExternalDocs, ExternalDocsContainer, FilesControl, HeaderMdx, HeadersMdx, Heading2 as Heading, IconGallery, IconItem, Markdown2 as Markdown, Meta, NumberControl, ObjectControl, OptionsControl, PRIMARY_STORY, Primary, ArgsTable as PureArgsTable, RangeControl, Source2 as Source, SourceContainer, SourceContext, Stories, Story2 as Story, Subheading, Subtitle2 as Subtitle, TextControl, Title2 as Title, Typeset, UNKNOWN_ARGS_HASH, Unstyled, Wrapper11 as Wrapper, anchorBlockIdFromId, argsHash, assertIsFn, extractTitle, format, formatDate, formatTime, getStoryId2 as getStoryId, getStoryProps, parse2 as parse, parseDate, parseTime, useOf, useSourceProps };
|
|
||||||
+export { AddContext, Anchor, AnchorMdx, ArgTypes, BooleanControl, Canvas, CodeOrSourceMdx, ColorControl, ColorItem, ColorPalette, Controls3 as Controls, DateControl, DescriptionContainer as Description, DescriptionType, Docs, DocsContainer, DocsContext, DocsPage, DocsStory, ExternalDocs, ExternalDocsContainer, FilesControl, HeaderMdx, HeadersMdx, Heading2 as Heading, IconGallery, IconItem, Markdown2 as Markdown, Meta, NumberControl, ObjectControl, OptionsControl, PRIMARY_STORY, Preview, Primary, ArgsTable as PureArgsTable, RangeControl, Source2 as Source, SourceContainer, SourceContext, Stories, Story2 as Story, Subheading, Subtitle2 as Subtitle, TextControl, Title2 as Title, Typeset, UNKNOWN_ARGS_HASH, Unstyled, Wrapper11 as Wrapper, anchorBlockIdFromId, argsHash, assertIsFn, extractTitle, format, formatDate, formatTime, getStoryId2 as getStoryId, getStoryProps, parse2 as parse, parseDate, parseTime, useOf, useSourceProps };
|
|
||||||
@@ -59,10 +59,10 @@ require (
|
|||||||
go.opentelemetry.io/otel/sdk v1.32.0 // indirect
|
go.opentelemetry.io/otel/sdk v1.32.0 // indirect
|
||||||
go.opentelemetry.io/otel/trace v1.32.0 // indirect
|
go.opentelemetry.io/otel/trace v1.32.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
||||||
golang.org/x/net v0.30.0 // indirect
|
golang.org/x/net v0.31.0 // indirect
|
||||||
golang.org/x/oauth2 v0.23.0 // indirect
|
golang.org/x/oauth2 v0.23.0 // indirect
|
||||||
golang.org/x/sys v0.27.0 // indirect
|
golang.org/x/sys v0.27.0 // indirect
|
||||||
golang.org/x/term v0.25.0 // indirect
|
golang.org/x/term v0.26.0 // indirect
|
||||||
golang.org/x/text v0.20.0 // indirect
|
golang.org/x/text v0.20.0 // indirect
|
||||||
golang.org/x/time v0.6.0 // indirect
|
golang.org/x/time v0.6.0 // indirect
|
||||||
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
|
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
|
||||||
|
|||||||
@@ -141,8 +141,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
|
|||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
||||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
||||||
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
||||||
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -153,8 +153,8 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
||||||
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
|
golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
|
||||||
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
|
golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
||||||
|
|||||||
@@ -351,6 +351,9 @@ data_source_proxy_whitelist =
|
|||||||
# disable protection against brute force login attempts
|
# disable protection against brute force login attempts
|
||||||
disable_brute_force_login_protection = false
|
disable_brute_force_login_protection = false
|
||||||
|
|
||||||
|
# max number of failed login attempts before user gets locked
|
||||||
|
brute_force_login_protection_max_attempts = 5
|
||||||
|
|
||||||
# set to true if you host Grafana behind HTTPS. default is false.
|
# set to true if you host Grafana behind HTTPS. default is false.
|
||||||
cookie_secure = false
|
cookie_secure = false
|
||||||
|
|
||||||
|
|||||||
@@ -350,6 +350,9 @@
|
|||||||
# disable protection against brute force login attempts
|
# disable protection against brute force login attempts
|
||||||
;disable_brute_force_login_protection = false
|
;disable_brute_force_login_protection = false
|
||||||
|
|
||||||
|
# max number of failed login attempts before user gets locked
|
||||||
|
;brute_force_login_protection_max_attempts = 5
|
||||||
|
|
||||||
# set to true if you host Grafana behind HTTPS. default is false.
|
# set to true if you host Grafana behind HTTPS. default is false.
|
||||||
;cookie_secure = false
|
;cookie_secure = false
|
||||||
|
|
||||||
|
|||||||
@@ -181,13 +181,24 @@ It does not support absolute time ranges: `2021-12-02 00:00:00 to 2021-12-05 23:
|
|||||||
1. Click **Set as alert condition** on the query or expression you want to set as your alert condition.
|
1. Click **Set as alert condition** on the query or expression you want to set as your alert condition.
|
||||||
{{< /collapse >}}
|
{{< /collapse >}}
|
||||||
|
|
||||||
|
## Add folders and labels
|
||||||
|
|
||||||
|
Organize your alert rule with a folder and set of labels.
|
||||||
|
|
||||||
|
In the **Labels** section, you can optionally choose whether to add labels to organize your alert rules, make searching easier, as well as set which notification policy should handle your firing alert instance.
|
||||||
|
|
||||||
|
1. Select a folder or click **+ New folder**.
|
||||||
|
|
||||||
|
1. Add labels, if required.
|
||||||
|
|
||||||
|
Add custom labels by selecting existing key-value pairs from the drop down, or add new labels by entering the new key or value.
|
||||||
|
|
||||||
## Set alert evaluation behavior
|
## Set alert evaluation behavior
|
||||||
|
|
||||||
Use alert rule evaluation to determine how frequently an alert rule should be evaluated and how quickly it should change its state.
|
Use alert rule evaluation to determine how frequently an alert rule should be evaluated and how quickly it should change its state.
|
||||||
|
|
||||||
To do this, you need to make sure that your alert rule is in the right evaluation group and set a pending period time that works best for your use case.
|
To do this, you need to make sure that your alert rule is in the right evaluation group and set a pending period time that works best for your use case.
|
||||||
|
|
||||||
1. Select a folder or click **+ New folder**.
|
|
||||||
1. Select an evaluation group or click **+ New evaluation group**.
|
1. Select an evaluation group or click **+ New evaluation group**.
|
||||||
|
|
||||||
If you are creating a new evaluation group, specify the interval for the group.
|
If you are creating a new evaluation group, specify the interval for the group.
|
||||||
@@ -212,19 +223,13 @@ To do this, you need to make sure that your alert rule is in the right evaluatio
|
|||||||
|
|
||||||
Use the guidelines in [No data and error handling](#configure-no-data-and-error-handling).
|
Use the guidelines in [No data and error handling](#configure-no-data-and-error-handling).
|
||||||
|
|
||||||
## Configure labels and notifications
|
## Configure notifications
|
||||||
|
|
||||||
In the **Labels** section, you can optionally choose whether to add labels to organize your alert rules, make searching easier, as well as set which notification policy should handle your firing alert instance.
|
Choose to select a contact point directly from the alert rule form or to use notification policy routing as well as set up mute timings and groupings.
|
||||||
|
|
||||||
In the **Configure notifications** section, you can choose to select a contact point directly from the alert rule form or choose to use notification policy routing as well as set up mute timings and groupings.
|
Complete the following steps to set up notifications.
|
||||||
|
|
||||||
Complete the following steps to set up labels and notifications.
|
1. Configure who receives a notification when an alert rule fires by either choosing **Select contact point** or **Use notification policy**.
|
||||||
|
|
||||||
1. Add labels, if required.
|
|
||||||
|
|
||||||
Add custom labels by selecting existing key-value pairs from the drop down, or add new labels by entering the new key or value.
|
|
||||||
|
|
||||||
2. Configure who receives a notification when an alert rule fires by either choosing **Select contact point** or **Use notification policy**.
|
|
||||||
|
|
||||||
**Select contact point**
|
**Select contact point**
|
||||||
|
|
||||||
@@ -232,30 +237,30 @@ Complete the following steps to set up labels and notifications.
|
|||||||
|
|
||||||
All notifications for this alert rule are sent to this contact point automatically and notification policies are not used.
|
All notifications for this alert rule are sent to this contact point automatically and notification policies are not used.
|
||||||
|
|
||||||
2. You can also optionally select a mute timing as well as groupings and timings to define when not to send notifications.
|
1. You can also optionally select a mute timing as well as groupings and timings to define when not to send notifications.
|
||||||
|
|
||||||
{{< admonition type="note" >}}
|
{{< admonition type="note" >}}
|
||||||
An auto-generated notification policy is generated. Only admins can view these auto-generated policies from the **Notification policies** list view. Any changes have to be made in the alert rules form. {{< /admonition >}}
|
An auto-generated notification policy is generated. Only admins can view these auto-generated policies from the **Notification policies** list view. Any changes have to be made in the alert rules form. {{< /admonition >}}
|
||||||
|
|
||||||
**Use notification policy**
|
**Use notification policy**
|
||||||
|
|
||||||
3. Choose this option to use the notification policy tree to direct your notifications.
|
1. Choose this option to use the notification policy tree to direct your notifications.
|
||||||
|
|
||||||
{{< admonition type="note" >}}
|
{{< admonition type="note" >}}
|
||||||
All alert rules and instances, irrespective of their labels, match the default notification policy. If there are no nested policies, or no nested policies match the labels in the alert rule or alert instance, then the default notification policy is the matching policy.
|
All alert rules and instances, irrespective of their labels, match the default notification policy. If there are no nested policies, or no nested policies match the labels in the alert rule or alert instance, then the default notification policy is the matching policy.
|
||||||
{{< /admonition >}}
|
{{< /admonition >}}
|
||||||
|
|
||||||
4. Preview your alert instance routing set up.
|
1. Preview your alert instance routing set up.
|
||||||
|
|
||||||
Based on the labels added, alert instances are routed to the following notification policies displayed.
|
Based on the labels added, alert instances are routed to the following notification policies displayed.
|
||||||
|
|
||||||
5. Expand each notification policy below to view more details.
|
1. Expand each notification policy below to view more details.
|
||||||
|
|
||||||
6. Click **See details** to view alert routing details and an email preview.
|
1. Click **See details** to view alert routing details and an email preview.
|
||||||
|
|
||||||
## Add annotations
|
## Configure notification message
|
||||||
|
|
||||||
Add [annotations](ref:annotation-label). to provide more context on the alert in your alert notification message.
|
Add more context on the alert in your alert notification message. For more information, see [annotations](ref:annotation-label).
|
||||||
|
|
||||||
Annotations add metadata to provide more information on the alert in your alert notification message. For example, add a **Summary** annotation to tell you which value caused the alert to fire or which server it happened on.
|
Annotations add metadata to provide more information on the alert in your alert notification message. For example, add a **Summary** annotation to tell you which value caused the alert to fire or which server it happened on.
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ Watch the following video for a quick tutorial on creating annotations:
|
|||||||
|
|
||||||
To add an annotation, complete the following steps:
|
To add an annotation, complete the following steps:
|
||||||
|
|
||||||
|
1. If you've just saved a dashboard, refresh the page.
|
||||||
1. Click **Edit** in the top-right corner of the dashboard.
|
1. Click **Edit** in the top-right corner of the dashboard.
|
||||||
1. Click the panel to which you're adding the annotation.
|
1. Click the panel to which you're adding the annotation.
|
||||||
|
|
||||||
@@ -85,6 +86,7 @@ Alternatively, to add an annotation, press Ctrl/Cmd and click the panel, and the
|
|||||||
|
|
||||||
### Add a region annotation
|
### Add a region annotation
|
||||||
|
|
||||||
|
1. If you've just saved a dashboard, refresh the page.
|
||||||
1. Click **Edit** in the top-right corner of the dashboard.
|
1. Click **Edit** in the top-right corner of the dashboard.
|
||||||
1. Press Ctrl/Cmd and click and drag on the panel.
|
1. Press Ctrl/Cmd and click and drag on the panel.
|
||||||

|

|
||||||
|
|||||||
@@ -52,9 +52,9 @@ refs:
|
|||||||
destination: /docs/grafana-cloud/connect-externally-hosted/data-sources/
|
destination: /docs/grafana-cloud/connect-externally-hosted/data-sources/
|
||||||
add-a-data-source:
|
add-a-data-source:
|
||||||
- pattern: /docs/grafana/
|
- pattern: /docs/grafana/
|
||||||
destination: /docs/grafana/<GRAFANA_VERSION>/administration/data-source-management/#add-a-data-source
|
destination: /docs/grafana/<GRAFANA_VERSION>/datasources/#add-a-data-source
|
||||||
- pattern: /docs/grafana-cloud/
|
- pattern: /docs/grafana-cloud/
|
||||||
destination: /docs/grafana/<GRAFANA_VERSION>/administration/data-source-management/#add-a-data-source
|
destination: /docs/grafana/<GRAFANA_VERSION>/datasources/#add-a-data-source
|
||||||
about-users-and-permissions:
|
about-users-and-permissions:
|
||||||
- pattern: /docs/grafana/
|
- pattern: /docs/grafana/
|
||||||
destination: /docs/grafana/<GRAFANA_VERSION>/administration/roles-and-permissions/
|
destination: /docs/grafana/<GRAFANA_VERSION>/administration/roles-and-permissions/
|
||||||
|
|||||||
@@ -215,107 +215,79 @@ Learn more about the kind of information provided in the [dashboard insights doc
|
|||||||
Externally shared dashboards _should_ work with any data source that has the properties `backend` and `alerting` both set to true in its `plugin.json`. However, this can't always be
|
Externally shared dashboards _should_ work with any data source that has the properties `backend` and `alerting` both set to true in its `plugin.json`. However, this can't always be
|
||||||
guaranteed because plugin developers can override this functionality. The following lists include data sources confirmed to work with externally shared dashboards and data sources that should work, but have not been confirmed as compatible.
|
guaranteed because plugin developers can override this functionality. The following lists include data sources confirmed to work with externally shared dashboards and data sources that should work, but have not been confirmed as compatible.
|
||||||
|
|
||||||
### Confirmed:
|
### Confirmed
|
||||||
|
|
||||||
<table>
|
{{< column-list >}}
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<ul>
|
|
||||||
<li>ClickHouse</li>
|
|
||||||
<li>CloudWatch</li>
|
|
||||||
<li>Elasticsearch</li>
|
|
||||||
<li>Infinity</li>
|
|
||||||
<li>InfluxDB</li>
|
|
||||||
<li>Loki</li>
|
|
||||||
<li>Microsoft SQL Server</li>
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<ul>
|
|
||||||
<li>MongoDB</li>
|
|
||||||
<li>MySQL</li>
|
|
||||||
<li>Oracle Database</li>
|
|
||||||
<li>PostgreSQL</li>
|
|
||||||
<li>Prometheus</li>
|
|
||||||
<li>Redis</li>
|
|
||||||
<li>SQLite</li>
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
### Unsupported:
|
- ClickHouse
|
||||||
|
- CloudWatch
|
||||||
|
- Elasticsearch
|
||||||
|
- Infinity
|
||||||
|
- InfluxDB
|
||||||
|
- Loki
|
||||||
|
- Microsoft SQL Server
|
||||||
|
- MongoDB
|
||||||
|
- MySQL
|
||||||
|
- Oracle Database
|
||||||
|
- PostgreSQL
|
||||||
|
- Prometheus
|
||||||
|
- Redis
|
||||||
|
- SQLite
|
||||||
|
|
||||||
<table>
|
{{< /column-list >}}
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<ul>
|
|
||||||
<li>Graphite</li>
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
### Unconfirmed:
|
### Unsupported
|
||||||
|
|
||||||
<table>
|
- Graphite
|
||||||
<tr>
|
|
||||||
<td>
|
### Unconfirmed
|
||||||
<ul>
|
|
||||||
<li>Altinity plugin for ClickHouse</li>
|
{{< column-list >}}
|
||||||
<li>Amazon Athena</li>
|
|
||||||
<li>Amazon Redshift</li>
|
- Altinity plugin for ClickHouse
|
||||||
<li>Amazon Timestream</li>
|
- Amazon Athena
|
||||||
<li>Apache Cassandra</li>
|
- Amazon Redshift
|
||||||
<li>AppDynamics</li>
|
- Amazon Timestream
|
||||||
<li>Azure Data Explorer Datasource</li>
|
- Apache Cassandra
|
||||||
<li>Azure Monitor</li>
|
- AppDynamics
|
||||||
<li>CSV</li>
|
- Azure Data Explorer Datasource
|
||||||
<li>DB2 Datasource</li>
|
- Azure Monitor
|
||||||
<li>Databricks</li>
|
- CSV
|
||||||
<li>Datadog</li>
|
- DB2 Datasource
|
||||||
<li>Dataset</li>
|
- Databricks
|
||||||
<li>Druid</li>
|
- Datadog
|
||||||
</ul>
|
- Dataset
|
||||||
</td>
|
- Druid
|
||||||
<td>
|
- Dynatrace
|
||||||
<ul>
|
- GitHub
|
||||||
<li>Dynatrace</li>
|
- Google BigQuery
|
||||||
<li>GitHub</li>
|
- Grafana for YNAB
|
||||||
<li>Google BigQuery</li>
|
- Honeycomb
|
||||||
<li>Grafana for YNAB</li>
|
- Jira
|
||||||
<li>Honeycomb</li>
|
- Mock
|
||||||
<li>Jira</li>
|
- Neo4j Datasource
|
||||||
<li>Mock</li>
|
- New Relic
|
||||||
<li>Neo4j Datasource</li>
|
- OPC UA (Unified Architecture)
|
||||||
<li>New Relic</li>
|
- Open Distro for Elasticsearch
|
||||||
<li>OPC UA (Unified Architecture)</li>
|
- OpenSearch
|
||||||
<li>Open Distro for Elasticsearch</li>
|
- OpenTSDB
|
||||||
<li>OpenSearch</li>
|
- Orbit
|
||||||
<li>OpenTSDB</li>
|
- SAP HANA®
|
||||||
</ul>
|
- Salesforce
|
||||||
</td>
|
- Sentry
|
||||||
<td>
|
- ServiceNow
|
||||||
<ul>
|
- Snowflake
|
||||||
<li>Orbit</li>
|
- Splunk
|
||||||
<li>SAP HANA®</li>
|
- Splunk Infrastructure Monitoring
|
||||||
<li>Salesforce</li>
|
- Sqlyze data source
|
||||||
<li>Sentry</li>
|
- TDengine
|
||||||
<li>ServiceNow</li>
|
- Vertica
|
||||||
<li>Snowflake</li>
|
- Wavefront
|
||||||
<li>Splunk</li>
|
- X-Ray
|
||||||
<li>Splunk Infrastructure Monitoring</li>
|
- kdb+
|
||||||
<li>Sqlyze data source</li>
|
- simple grpc data source
|
||||||
<li>TDengine</li>
|
|
||||||
<li>Vertica</li>
|
{{< /column-list >}}
|
||||||
<li>Wavefront</li>
|
|
||||||
<li>X-Ray</li>
|
|
||||||
<li>kdb+</li>
|
|
||||||
<li>simple grpc data source</li>
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
|
|
||||||
|
|||||||
@@ -143,14 +143,26 @@ If there's only one data link in the visualization, clicking anywhere on the vis
|
|||||||
|
|
||||||
You can configure data links for the following visualizations:
|
You can configure data links for the following visualizations:
|
||||||
|
|
||||||
| | | |
|
{{< column-list >}}
|
||||||
| ------------------------------ | ------------------------------------ | ------------------------------------ |
|
|
||||||
| [Bar chart](ref:bar-chart) | [Heatmap](ref:heatmap) | [Status history](ref:status-history) |
|
- [Bar chart](ref:bar-chart)
|
||||||
| [Bar gauge](ref:bar-gauge) | [Histogram](ref:histogram) | [Table](ref:table) |
|
- [Bar gauge](ref:bar-gauge)
|
||||||
| [Candlestick](ref:candlestick) | [Pie chart](ref:pie-chart) | [Time series](ref:time-series) |
|
- [Candlestick](ref:candlestick)
|
||||||
| [Canvas](ref:canvas) | [Stat](ref:stat) | [Trend](ref:trend) |
|
- [Canvas](ref:canvas)
|
||||||
| [Gauge](ref:gauge) | [State timeline](ref:state-timeline) | [XY chart](ref:xy-chart) |
|
- [Gauge](ref:gauge)
|
||||||
| [Geomap](ref:geomap) | | |
|
- [Geomap](ref:geomap)
|
||||||
|
- [Heatmap](ref:heatmap)
|
||||||
|
- [Histogram](ref:histogram)
|
||||||
|
- [Pie chart](ref:pie-chart)
|
||||||
|
- [Stat](ref:stat)
|
||||||
|
- [State timeline](ref:state-timeline)
|
||||||
|
- [Status history](ref:status-history)
|
||||||
|
- [Table](ref:table)
|
||||||
|
- [Time series](ref:time-series)
|
||||||
|
- [Trend](ref:trend)
|
||||||
|
- [XY chart](ref:xy-chart)
|
||||||
|
|
||||||
|
{{< /column-list >}}
|
||||||
|
|
||||||
## Data link variables
|
## Data link variables
|
||||||
|
|
||||||
|
|||||||
@@ -121,14 +121,26 @@ After you've set them, your overrides appear in both the **All** and **Overrides
|
|||||||
|
|
||||||
You can configure field overrides for the following visualizations:
|
You can configure field overrides for the following visualizations:
|
||||||
|
|
||||||
| | | |
|
{{< column-list >}}
|
||||||
| ------------------------------ | ------------------------------------ | ------------------------------------ |
|
|
||||||
| [Bar chart](ref:bar-chart) | [Heatmap](ref:heatmap) | [Status history](ref:status-history) |
|
- [Bar chart](ref:bar-chart)
|
||||||
| [Bar gauge](ref:bar-gauge) | [Histogram](ref:histogram) | [Table](ref:table) |
|
- [Bar gauge](ref:bar-gauge)
|
||||||
| [Candlestick](ref:candlestick) | [Pie chart](ref:pie-chart) | [Time series](ref:time-series) |
|
- [Candlestick](ref:candlestick)
|
||||||
| [Canvas](ref:canvas) | [Stat](ref:stat) | [Trend](ref:trend) |
|
- [Canvas](ref:canvas)
|
||||||
| [Gauge](ref:gauge) | [State timeline](ref:state-timeline) | [XY chart](ref:xy-chart) |
|
- [Gauge](ref:gauge)
|
||||||
| [Geomap](ref:geomap) | | |
|
- [Geomap](ref:geomap)
|
||||||
|
- [Heatmap](ref:heatmap)
|
||||||
|
- [Histogram](ref:histogram)
|
||||||
|
- [Pie chart](ref:pie-chart)
|
||||||
|
- [Stat](ref:stat)
|
||||||
|
- [State timeline](ref:state-timeline)
|
||||||
|
- [Status history](ref:status-history)
|
||||||
|
- [Table](ref:table)
|
||||||
|
- [Time series](ref:time-series)
|
||||||
|
- [Trend](ref:trend)
|
||||||
|
- [XY chart](ref:xy-chart)
|
||||||
|
|
||||||
|
{{< /column-list >}}
|
||||||
|
|
||||||
## Override rules
|
## Override rules
|
||||||
|
|
||||||
|
|||||||
@@ -126,13 +126,25 @@ For more granular control over the display of fields, refer to [Configure overri
|
|||||||
|
|
||||||
You can configure standard options for the following visualizations:
|
You can configure standard options for the following visualizations:
|
||||||
|
|
||||||
| | | |
|
{{< column-list >}}
|
||||||
| ------------------------------ | ------------------------------------ | ------------------------------------ |
|
|
||||||
| [Bar chart](ref:bar-chart) | [Geomap](ref:geomap) | [Status history](ref:status-history) |
|
- [Bar chart](ref:bar-chart)
|
||||||
| [Bar gauge](ref:bar-gauge) | [Histogram](ref:histogram) | [Table](ref:table) |
|
- [Bar gauge](ref:bar-gauge)
|
||||||
| [Candlestick](ref:candlestick) | [Pie chart](ref:pie-chart) | [Time series](ref:time-series) |
|
- [Candlestick](ref:candlestick)
|
||||||
| [Canvas](ref:canvas) | [Stat](ref:stat) | [Trend](ref:trend) |
|
- [Canvas](ref:canvas)
|
||||||
| [Gauge](ref:gauge) | [State timeline](ref:state-timeline) | [XY chart](ref:xy-chart) |
|
- [Gauge](ref:gauge)
|
||||||
|
- [Geomap](ref:geomap)
|
||||||
|
- [Histogram](ref:histogram)
|
||||||
|
- [Pie chart](ref:pie-chart)
|
||||||
|
- [Stat](ref:stat)
|
||||||
|
- [State timeline](ref:state-timeline)
|
||||||
|
- [Status history](ref:status-history)
|
||||||
|
- [Table](ref:table)
|
||||||
|
- [Time series](ref:time-series)
|
||||||
|
- [Trend](ref:trend)
|
||||||
|
- [XY chart](ref:xy-chart)
|
||||||
|
|
||||||
|
{{< /column-list >}}
|
||||||
|
|
||||||
## Standard options
|
## Standard options
|
||||||
|
|
||||||
|
|||||||
@@ -110,13 +110,23 @@ You can also use thresholds to:
|
|||||||
|
|
||||||
You can set thresholds in the following visualizations:
|
You can set thresholds in the following visualizations:
|
||||||
|
|
||||||
| | | |
|
{{< column-list >}}
|
||||||
| ------------------------------ | ------------------------------------ | ------------------------------------ |
|
|
||||||
| [Bar chart](ref:bar-chart) | [Geomap](ref:geomap) | [Status history](ref:status-history) |
|
- [Bar chart](ref:bar-chart)
|
||||||
| [Bar gauge](ref:bar-gauge) | [Histogram](ref:histogram) | [Table](ref:table) |
|
- [Bar gauge](ref:bar-gauge)
|
||||||
| [Candlestick](ref:candlestick) | [Stat](ref:stat) | [Time series](ref:time-series) |
|
- [Candlestick](ref:candlestick)
|
||||||
| [Canvas](ref:canvas) | [State timeline](ref:state-timeline) | [Trend](ref:trend) |
|
- [Canvas](ref:canvas)
|
||||||
| [Gauge](ref:gauge) |
|
- [Gauge](ref:gauge)
|
||||||
|
- [Geomap](ref:geomap)
|
||||||
|
- [Histogram](ref:histogram)
|
||||||
|
- [Stat](ref:stat)
|
||||||
|
- [State timeline](ref:state-timeline)
|
||||||
|
- [Status history](ref:status-history)
|
||||||
|
- [Table](ref:table)
|
||||||
|
- [Time series](ref:time-series)
|
||||||
|
- [Trend](ref:trend)
|
||||||
|
|
||||||
|
{{< /column-list >}}
|
||||||
|
|
||||||
## Default thresholds
|
## Default thresholds
|
||||||
|
|
||||||
|
|||||||
@@ -84,13 +84,19 @@ When you hover your cursor over a visualization, Grafana can display tooltips th
|
|||||||
|
|
||||||
You can configure tooltips for the following visualizations:
|
You can configure tooltips for the following visualizations:
|
||||||
|
|
||||||
| | |
|
{{< column-list >}}
|
||||||
| ------------------------------------ | ------------------------------------ |
|
|
||||||
| [Bar chart](ref:bar-chart) | [Status history](ref:status-history) |
|
- [Bar chart](ref:bar-chart)
|
||||||
| [Candlestick](ref:candlestick) | [Time series](ref:time-series) |
|
- [Candlestick](ref:candlestick)
|
||||||
| [Heatmap](ref:heatmap) | [Trend](ref:trend) |
|
- [Heatmap](ref:heatmap)
|
||||||
| [Pie chart](ref:pie-chart) | [XY chart](ref:xy-chart) |
|
- [Pie chart](ref:pie-chart)
|
||||||
| [State timeline](ref:state-timeline) | |
|
- [State timeline](ref:state-timeline)
|
||||||
|
- [Status history](ref:status-history)
|
||||||
|
- [Time series](ref:time-series)
|
||||||
|
- [Trend](ref:trend)
|
||||||
|
- [XY chart](ref:xy-chart)
|
||||||
|
|
||||||
|
{{< /column-list >}}
|
||||||
|
|
||||||
Some visualizations, for example [candlestick](ref:candlestick) and [flame graph](ref:flame-graph), have tooltips, but they aren't configurable. These visualizations don't have a **Tooltip** section in the panel editor pane. [Geomaps](ref:geomaps) provide you the option to have tooltips triggered upon click or hover under the **Map controls** options in the panel editor pane.
|
Some visualizations, for example [candlestick](ref:candlestick) and [flame graph](ref:flame-graph), have tooltips, but they aren't configurable. These visualizations don't have a **Tooltip** section in the panel editor pane. [Geomaps](ref:geomaps) provide you the option to have tooltips triggered upon click or hover under the **Map controls** options in the panel editor pane.
|
||||||
|
|
||||||
|
|||||||
@@ -105,13 +105,24 @@ Value mappings bypass unit formatting set in the **Standard options** section of
|
|||||||
|
|
||||||
You can configure value mappings for the following visualizations:
|
You can configure value mappings for the following visualizations:
|
||||||
|
|
||||||
| | | |
|
{{< column-list >}}
|
||||||
| ------------------------------ | ------------------------------------ | ------------------------------------ |
|
|
||||||
| [Bar chart](ref:bar-chart) | [Geomap](ref:geomap) | [Status history](ref:status-history) |
|
- [Bar chart](ref:bar-chart)
|
||||||
| [Bar gauge](ref:bar-gauge) | [Histogram](ref:histogram) | [Table](ref:table) |
|
- [Bar gauge](ref:bar-gauge)
|
||||||
| [Candlestick](ref:candlestick) | [Pie chart](ref:pie-chart) | [Time series](ref:time-series) |
|
- [Candlestick](ref:candlestick)
|
||||||
| [Canvas](ref:canvas) | [Stat](ref:stat) | [Trend](ref:trend) |
|
- [Canvas](ref:canvas)
|
||||||
| [Gauge](ref:gauge) | [State timeline](ref:state-timeline) | |
|
- [Gauge](ref:gauge)
|
||||||
|
- [Geomap](ref:geomap)
|
||||||
|
- [Histogram](ref:histogram)
|
||||||
|
- [Pie chart](ref:pie-chart)
|
||||||
|
- [Stat](ref:stat)
|
||||||
|
- [State timeline](ref:state-timeline)
|
||||||
|
- [Status history](ref:status-history)
|
||||||
|
- [Table](ref:table)
|
||||||
|
- [Time series](ref:time-series)
|
||||||
|
- [Trend](ref:trend)
|
||||||
|
|
||||||
|
{{< /column-list >}}
|
||||||
|
|
||||||
## Types of value mappings
|
## Types of value mappings
|
||||||
|
|
||||||
|
|||||||
@@ -630,7 +630,11 @@ Define a whitelist of allowed IP addresses or domains, with ports, to be used in
|
|||||||
|
|
||||||
### disable_brute_force_login_protection
|
### disable_brute_force_login_protection
|
||||||
|
|
||||||
Set to `true` to disable [brute force login protection](https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html#account-lockout). Default is `false`. An existing user's account will be locked after 5 attempts in 5 minutes.
|
Set to `true` to disable [brute force login protection](https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html#account-lockout). Default is `false`. An existing user's account will be unable to login for 5 minutes if all login attempts are spent within a 5 minute window.
|
||||||
|
|
||||||
|
### brute_force_login_protection_max_attempts
|
||||||
|
|
||||||
|
Configure how many login attempts a user have within a 5 minute window before the account will be locked. Default is `5`.
|
||||||
|
|
||||||
### cookie_secure
|
### cookie_secure
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ Most [generally available](https://grafana.com/docs/release-life-cycle/#general-
|
|||||||
| `azureMonitorDisableLogLimit` | Disables the log limit restriction for Azure Monitor when true. The limit is enabled by default. | |
|
| `azureMonitorDisableLogLimit` | Disables the log limit restriction for Azure Monitor when true. The limit is enabled by default. | |
|
||||||
| `preinstallAutoUpdate` | Enables automatic updates for pre-installed plugins | Yes |
|
| `preinstallAutoUpdate` | Enables automatic updates for pre-installed plugins | Yes |
|
||||||
| `alertingUIOptimizeReducer` | Enables removing the reducer from the alerting UI when creating a new alert rule and using instant query | Yes |
|
| `alertingUIOptimizeReducer` | Enables removing the reducer from the alerting UI when creating a new alert rule and using instant query | Yes |
|
||||||
|
| `azureMonitorEnableUserAuth` | Enables user auth for Azure Monitor datasource only | Yes |
|
||||||
|
|
||||||
## Public preview feature toggles
|
## Public preview feature toggles
|
||||||
|
|
||||||
@@ -189,6 +190,7 @@ Experimental features might be changed or removed without prior notice.
|
|||||||
| `newFolderPicker` | Enables the nested folder picker without having nested folders enabled |
|
| `newFolderPicker` | Enables the nested folder picker without having nested folders enabled |
|
||||||
| `onPremToCloudMigrationsAlerts` | Enables the migration of alerts and its child resources to your Grafana Cloud stack. Requires `onPremToCloudMigrations` to be enabled in conjunction. |
|
| `onPremToCloudMigrationsAlerts` | Enables the migration of alerts and its child resources to your Grafana Cloud stack. Requires `onPremToCloudMigrations` to be enabled in conjunction. |
|
||||||
| `onPremToCloudMigrationsAuthApiMig` | Enables the use of auth api instead of gcom for internal token services. Requires `onPremToCloudMigrations` to be enabled in conjunction. |
|
| `onPremToCloudMigrationsAuthApiMig` | Enables the use of auth api instead of gcom for internal token services. Requires `onPremToCloudMigrations` to be enabled in conjunction. |
|
||||||
|
| `scopeApi` | In-development feature flag for the scope api using the app platform. |
|
||||||
| `sqlExpressions` | Enables using SQL and DuckDB functions as Expressions. |
|
| `sqlExpressions` | Enables using SQL and DuckDB functions as Expressions. |
|
||||||
| `nodeGraphDotLayout` | Changed the layout algorithm for the node graph |
|
| `nodeGraphDotLayout` | Changed the layout algorithm for the node graph |
|
||||||
| `kubernetesAggregator` | Enable grafana's embedded kube-aggregator |
|
| `kubernetesAggregator` | Enable grafana's embedded kube-aggregator |
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ require (
|
|||||||
github.com/m3db/prometheus_remote_client_golang v0.4.4 // @grafana/grafana-backend-group
|
github.com/m3db/prometheus_remote_client_golang v0.4.4 // @grafana/grafana-backend-group
|
||||||
github.com/madflojo/testcerts v1.1.1 // @grafana/alerting-backend
|
github.com/madflojo/testcerts v1.1.1 // @grafana/alerting-backend
|
||||||
github.com/magefile/mage v1.15.0 // @grafana/grafana-developer-enablement-squad
|
github.com/magefile/mage v1.15.0 // @grafana/grafana-developer-enablement-squad
|
||||||
github.com/matryer/is v1.4.0 // @grafana/grafana-as-code
|
github.com/matryer/is v1.4.1 // @grafana/grafana-as-code
|
||||||
github.com/mattn/go-isatty v0.0.20 // @grafana/grafana-backend-group
|
github.com/mattn/go-isatty v0.0.20 // @grafana/grafana-backend-group
|
||||||
github.com/mattn/go-sqlite3 v1.14.22 // @grafana/grafana-backend-group
|
github.com/mattn/go-sqlite3 v1.14.22 // @grafana/grafana-backend-group
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // @grafana/alerting-backend
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 // @grafana/alerting-backend
|
||||||
@@ -171,15 +171,15 @@ require (
|
|||||||
go.uber.org/atomic v1.11.0 // @grafana/alerting-backend
|
go.uber.org/atomic v1.11.0 // @grafana/alerting-backend
|
||||||
go.uber.org/goleak v1.3.0 // @grafana/grafana-search-and-storage
|
go.uber.org/goleak v1.3.0 // @grafana/grafana-search-and-storage
|
||||||
gocloud.dev v0.40.0 // @grafana/grafana-app-platform-squad
|
gocloud.dev v0.40.0 // @grafana/grafana-app-platform-squad
|
||||||
golang.org/x/crypto v0.28.0 // @grafana/grafana-backend-group
|
golang.org/x/crypto v0.29.0 // @grafana/grafana-backend-group
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // @grafana/alerting-backend
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // @grafana/alerting-backend
|
||||||
golang.org/x/mod v0.21.0 // indirect; @grafana/grafana-backend-group
|
golang.org/x/mod v0.22.0 // indirect; @grafana/grafana-backend-group
|
||||||
golang.org/x/net v0.30.0 // @grafana/oss-big-tent @grafana/partner-datasources
|
golang.org/x/net v0.31.0 // @grafana/oss-big-tent @grafana/partner-datasources
|
||||||
golang.org/x/oauth2 v0.23.0 // @grafana/identity-access-team
|
golang.org/x/oauth2 v0.23.0 // @grafana/identity-access-team
|
||||||
golang.org/x/sync v0.9.0 // @grafana/alerting-backend
|
golang.org/x/sync v0.9.0 // @grafana/alerting-backend
|
||||||
golang.org/x/text v0.20.0 // @grafana/grafana-backend-group
|
golang.org/x/text v0.20.0 // @grafana/grafana-backend-group
|
||||||
golang.org/x/time v0.6.0 // @grafana/grafana-backend-group
|
golang.org/x/time v0.6.0 // @grafana/grafana-backend-group
|
||||||
golang.org/x/tools v0.26.0 // @grafana/grafana-as-code
|
golang.org/x/tools v0.27.0 // @grafana/grafana-as-code
|
||||||
gonum.org/v1/gonum v0.15.1 // @grafana/observability-metrics
|
gonum.org/v1/gonum v0.15.1 // @grafana/observability-metrics
|
||||||
google.golang.org/api v0.193.0 // @grafana/grafana-backend-group
|
google.golang.org/api v0.193.0 // @grafana/grafana-backend-group
|
||||||
google.golang.org/grpc v1.67.1 // @grafana/plugins-platform-backend
|
google.golang.org/grpc v1.67.1 // @grafana/plugins-platform-backend
|
||||||
@@ -431,7 +431,7 @@ require (
|
|||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
go.uber.org/zap v1.27.0 // @grafana/identity-access-team
|
go.uber.org/zap v1.27.0 // @grafana/identity-access-team
|
||||||
golang.org/x/sys v0.27.0 // indirect
|
golang.org/x/sys v0.27.0 // indirect
|
||||||
golang.org/x/term v0.25.0 // indirect
|
golang.org/x/term v0.26.0 // indirect
|
||||||
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect
|
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20240820151423-278611b39280 // indirect; @grafana/grafana-backend-group
|
google.golang.org/genproto v0.0.0-20240820151423-278611b39280 // indirect; @grafana/grafana-backend-group
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect
|
||||||
|
|||||||
@@ -2682,8 +2682,8 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V
|
|||||||
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
||||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
|
github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ=
|
||||||
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
||||||
github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU=
|
github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU=
|
||||||
github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To=
|
github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To=
|
||||||
github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM=
|
github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM=
|
||||||
@@ -3518,8 +3518,8 @@ golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1m
|
|||||||
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
||||||
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
|
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
|
||||||
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
|
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
|
||||||
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
|
golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
|
||||||
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
|
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
|
||||||
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
@@ -3597,8 +3597,8 @@ golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
|||||||
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||||
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||||
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
|
||||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||||
golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@@ -3697,8 +3697,8 @@ golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
|||||||
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
||||||
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
||||||
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
|
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
|
||||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
||||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@@ -3933,8 +3933,8 @@ golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
|
|||||||
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
||||||
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
|
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
|
||||||
golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
|
golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
|
||||||
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
|
golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
|
||||||
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
|
golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -4064,8 +4064,8 @@ golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps
|
|||||||
golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg=
|
golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg=
|
||||||
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
|
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
|
||||||
golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg=
|
golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg=
|
||||||
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
|
golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o=
|
||||||
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
|
golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|||||||
@@ -989,6 +989,9 @@ github.com/grafana/alerting v0.0.0-20240917171353-6c25eb6eff10 h1:oDbLKM34O+JUF9
|
|||||||
github.com/grafana/alerting v0.0.0-20240917171353-6c25eb6eff10/go.mod h1:GMLi6d09Xqo96fCVUjNk//rcjP5NKEdjOzfWIffD5r4=
|
github.com/grafana/alerting v0.0.0-20240917171353-6c25eb6eff10/go.mod h1:GMLi6d09Xqo96fCVUjNk//rcjP5NKEdjOzfWIffD5r4=
|
||||||
github.com/grafana/cloudflare-go v0.0.0-20230110200409-c627cf6792f2 h1:qhugDMdQ4Vp68H0tp/0iN17DM2ehRo1rLEdOFe/gB8I=
|
github.com/grafana/cloudflare-go v0.0.0-20230110200409-c627cf6792f2 h1:qhugDMdQ4Vp68H0tp/0iN17DM2ehRo1rLEdOFe/gB8I=
|
||||||
github.com/grafana/cloudflare-go v0.0.0-20230110200409-c627cf6792f2/go.mod h1:w/aiO1POVIeXUQyl0VQSZjl5OAGDTL5aX+4v0RA1tcw=
|
github.com/grafana/cloudflare-go v0.0.0-20230110200409-c627cf6792f2/go.mod h1:w/aiO1POVIeXUQyl0VQSZjl5OAGDTL5aX+4v0RA1tcw=
|
||||||
|
github.com/grafana/cog v0.0.4/go.mod h1:lzetOuhGUl/JaSACiJoHvBokf9/fS6PEFaWZvnQu2vs=
|
||||||
|
github.com/grafana/cog v0.0.5 h1:BCa+10i3KvV+KMSQuxlN1DS9cZEwN+EAFc7ZmXqHxQE=
|
||||||
|
github.com/grafana/cog v0.0.5/go.mod h1:lzetOuhGUl/JaSACiJoHvBokf9/fS6PEFaWZvnQu2vs=
|
||||||
github.com/grafana/cuetsy v0.1.10/go.mod h1:Ix97+CPD8ws9oSSxR3/Lf4ahU1I4Np83kjJmDVnLZvc=
|
github.com/grafana/cuetsy v0.1.10/go.mod h1:Ix97+CPD8ws9oSSxR3/Lf4ahU1I4Np83kjJmDVnLZvc=
|
||||||
github.com/grafana/go-gelf/v2 v2.0.1 h1:BOChP0h/jLeD+7F9mL7tq10xVkDG15he3T1zHuQaWak=
|
github.com/grafana/go-gelf/v2 v2.0.1 h1:BOChP0h/jLeD+7F9mL7tq10xVkDG15he3T1zHuQaWak=
|
||||||
github.com/grafana/go-gelf/v2 v2.0.1/go.mod h1:lexHie0xzYGwCgiRGcvZ723bSNyNI8ZRD4s0CLobh90=
|
github.com/grafana/go-gelf/v2 v2.0.1/go.mod h1:lexHie0xzYGwCgiRGcvZ723bSNyNI8ZRD4s0CLobh90=
|
||||||
@@ -1783,6 +1786,7 @@ golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
|||||||
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
|
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
|
||||||
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
|
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
|
||||||
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
|
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
|
||||||
|
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
||||||
golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
@@ -1796,6 +1800,7 @@ golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
|||||||
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk=
|
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk=
|
||||||
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
|
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
|
||||||
golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
|
golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
|
||||||
|
|||||||
+21
-20
@@ -6,46 +6,47 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"cuelang.org/go/cue/cuecontext"
|
|
||||||
"github.com/grafana/cog"
|
"github.com/grafana/cog"
|
||||||
)
|
)
|
||||||
|
|
||||||
type codegenTargets struct {
|
type codegenTargets struct {
|
||||||
schemaPath string
|
modulePath string
|
||||||
outputPath string
|
outputPath string
|
||||||
|
cueImportsMap map[string]string
|
||||||
|
packagesImportMap map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
cueCtx := cuecontext.New()
|
|
||||||
|
|
||||||
targets := []codegenTargets{
|
targets := []codegenTargets{
|
||||||
{
|
{
|
||||||
schemaPath: "../packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue",
|
modulePath: "../packages/grafana-schema/src/schema/dashboard/v2alpha0/",
|
||||||
outputPath: "../packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.gen.ts",
|
outputPath: "../packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.gen.ts",
|
||||||
|
cueImportsMap: map[string]string{
|
||||||
|
"github.com/grafana/grafana/packages/grafana-schema/src/common": "../packages/grafana-schema/src/common",
|
||||||
|
},
|
||||||
|
packagesImportMap: map[string]string{
|
||||||
|
"common": "@grafana/schema",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, target := range targets {
|
for _, target := range targets {
|
||||||
rawSchema, err := os.ReadFile(target.schemaPath)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
value := cueCtx.CompileBytes(rawSchema)
|
|
||||||
if value.Err() != nil {
|
|
||||||
panic(value.Err())
|
|
||||||
}
|
|
||||||
|
|
||||||
codegenPipeline := cog.TypesFromSchema().
|
codegenPipeline := cog.TypesFromSchema().
|
||||||
CUEValue("dashboard", value).
|
CUEModule(
|
||||||
Typescript()
|
target.modulePath,
|
||||||
|
cog.CUEImports(target.cueImportsMap),
|
||||||
|
).
|
||||||
|
Typescript(cog.TypescriptConfig{
|
||||||
|
ImportsMap: target.packagesImportMap,
|
||||||
|
EnumsAsUnionTypes: true,
|
||||||
|
})
|
||||||
|
|
||||||
tsBytes, err := codegenPipeline.Run(context.Background())
|
files, err := codegenPipeline.Run(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := os.WriteFile(target.outputPath, tsBytes, 0644); err != nil {
|
if err := os.WriteFile(target.outputPath, files[0].Data, 0644); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-7
@@ -2,13 +2,11 @@ module github.com/grafana/grafana/kindsv2
|
|||||||
|
|
||||||
go 1.23.1
|
go 1.23.1
|
||||||
|
|
||||||
require (
|
require github.com/grafana/cog v0.0.5
|
||||||
cuelang.org/go v0.8.2
|
|
||||||
github.com/grafana/cog v0.0.0-20241029201114-f7f7db0c1070
|
|
||||||
)
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
cuelabs.dev/go/oci/ociregistry v0.0.0-20240906074133-82eb438dd565 // indirect
|
cuelabs.dev/go/oci/ociregistry v0.0.0-20240906074133-82eb438dd565 // indirect
|
||||||
|
cuelang.org/go v0.8.2 // indirect
|
||||||
github.com/cockroachdb/apd/v3 v3.2.1 // indirect
|
github.com/cockroachdb/apd/v3 v3.2.1 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/emicklei/proto v1.13.2 // indirect
|
github.com/emicklei/proto v1.13.2 // indirect
|
||||||
@@ -36,11 +34,11 @@ require (
|
|||||||
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect
|
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect
|
||||||
github.com/ugorji/go/codec v1.2.11 // indirect
|
github.com/ugorji/go/codec v1.2.11 // indirect
|
||||||
github.com/yalue/merged_fs v1.3.0 // indirect
|
github.com/yalue/merged_fs v1.3.0 // indirect
|
||||||
golang.org/x/mod v0.21.0 // indirect
|
golang.org/x/mod v0.22.0 // indirect
|
||||||
golang.org/x/net v0.30.0 // indirect
|
golang.org/x/net v0.31.0 // indirect
|
||||||
golang.org/x/oauth2 v0.23.0 // indirect
|
golang.org/x/oauth2 v0.23.0 // indirect
|
||||||
golang.org/x/sync v0.9.0 // indirect
|
golang.org/x/sync v0.9.0 // indirect
|
||||||
golang.org/x/text v0.20.0 // indirect
|
golang.org/x/text v0.20.0 // indirect
|
||||||
golang.org/x/tools v0.26.0 // indirect
|
golang.org/x/tools v0.27.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
+10
-10
@@ -26,8 +26,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
|||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/grafana/codejen v0.0.4-0.20230321061741-77f656893a3d h1:hrXbGJ5jgp6yNITzs5o+zXq0V5yT3siNJ+uM8LGwWKk=
|
github.com/grafana/codejen v0.0.4-0.20230321061741-77f656893a3d h1:hrXbGJ5jgp6yNITzs5o+zXq0V5yT3siNJ+uM8LGwWKk=
|
||||||
github.com/grafana/codejen v0.0.4-0.20230321061741-77f656893a3d/go.mod h1:zmwwM/DRyQB7pfuBjTWII3CWtxcXh8LTwAYGfDfpR6s=
|
github.com/grafana/codejen v0.0.4-0.20230321061741-77f656893a3d/go.mod h1:zmwwM/DRyQB7pfuBjTWII3CWtxcXh8LTwAYGfDfpR6s=
|
||||||
github.com/grafana/cog v0.0.0-20241029201114-f7f7db0c1070 h1:ncAkFmIq3UbPiPhQ2CuBzdTuwnDqLsFFNqEIXKaiPGA=
|
github.com/grafana/cog v0.0.5 h1:BCa+10i3KvV+KMSQuxlN1DS9cZEwN+EAFc7ZmXqHxQE=
|
||||||
github.com/grafana/cog v0.0.0-20241029201114-f7f7db0c1070/go.mod h1:FqZi9WZ/Uzvs3tvo7l+OViThCpfvu3KDGDqHCB2LNbg=
|
github.com/grafana/cog v0.0.5/go.mod h1:lzetOuhGUl/JaSACiJoHvBokf9/fS6PEFaWZvnQu2vs=
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
|
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
|
||||||
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
@@ -73,20 +73,20 @@ github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4d
|
|||||||
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
||||||
github.com/yalue/merged_fs v1.3.0 h1:qCeh9tMPNy/i8cwDsQTJ5bLr6IRxbs6meakNE5O+wyY=
|
github.com/yalue/merged_fs v1.3.0 h1:qCeh9tMPNy/i8cwDsQTJ5bLr6IRxbs6meakNE5O+wyY=
|
||||||
github.com/yalue/merged_fs v1.3.0/go.mod h1:WqqchfVYQyclV2tnR7wtRhBddzBvLVR83Cjw9BKQw0M=
|
github.com/yalue/merged_fs v1.3.0/go.mod h1:WqqchfVYQyclV2tnR7wtRhBddzBvLVR83Cjw9BKQw0M=
|
||||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
|
||||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
||||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
||||||
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
||||||
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
|
golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
|
||||||
golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
|
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
||||||
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
||||||
golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
|
golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
|
||||||
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
|
golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o=
|
||||||
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
|
golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
|
|||||||
@@ -429,7 +429,6 @@
|
|||||||
"react-split-pane@0.1.92": "patch:react-split-pane@npm:0.1.92#.yarn/patches/react-split-pane-npm-0.1.92-93dbf51dff.patch",
|
"react-split-pane@0.1.92": "patch:react-split-pane@npm:0.1.92#.yarn/patches/react-split-pane-npm-0.1.92-93dbf51dff.patch",
|
||||||
"history@4.10.1": "patch:history@npm%3A4.10.1#./.yarn/patches/history-npm-4.10.1-ee217563ae.patch",
|
"history@4.10.1": "patch:history@npm%3A4.10.1#./.yarn/patches/history-npm-4.10.1-ee217563ae.patch",
|
||||||
"redux": "^5.0.0",
|
"redux": "^5.0.0",
|
||||||
"@storybook/blocks@npm:8.1.6": "patch:@storybook/blocks@npm%3A8.1.6#~/.yarn/patches/@storybook-blocks-npm-8.1.6-892f57a6d7.patch",
|
|
||||||
"react-grid-layout": "patch:react-grid-layout@npm%3A1.4.4#~/.yarn/patches/react-grid-layout-npm-1.4.4-4024c5395b.patch",
|
"react-grid-layout": "patch:react-grid-layout@npm%3A1.4.4#~/.yarn/patches/react-grid-layout-npm-1.4.4-4024c5395b.patch",
|
||||||
"@grafana/plugin-e2e/@grafana/e2e-selectors": "workspace:*",
|
"@grafana/plugin-e2e/@grafana/e2e-selectors": "workspace:*",
|
||||||
"@grafana/scenes/@grafana/e2e-selectors": "workspace:*",
|
"@grafana/scenes/@grafana/e2e-selectors": "workspace:*",
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ export interface FeatureToggles {
|
|||||||
onPremToCloudMigrationsAlerts?: boolean;
|
onPremToCloudMigrationsAlerts?: boolean;
|
||||||
onPremToCloudMigrationsAuthApiMig?: boolean;
|
onPremToCloudMigrationsAuthApiMig?: boolean;
|
||||||
alertingSaveStatePeriodic?: boolean;
|
alertingSaveStatePeriodic?: boolean;
|
||||||
|
scopeApi?: boolean;
|
||||||
promQLScope?: boolean;
|
promQLScope?: boolean;
|
||||||
logQLScope?: boolean;
|
logQLScope?: boolean;
|
||||||
sqlExpressions?: boolean;
|
sqlExpressions?: boolean;
|
||||||
@@ -240,5 +241,6 @@ export interface FeatureToggles {
|
|||||||
jaegerBackendMigration?: boolean;
|
jaegerBackendMigration?: boolean;
|
||||||
reportingUseRawTimeRange?: boolean;
|
reportingUseRawTimeRange?: boolean;
|
||||||
alertingUIOptimizeReducer?: boolean;
|
alertingUIOptimizeReducer?: boolean;
|
||||||
|
azureMonitorEnableUserAuth?: boolean;
|
||||||
alertingNotificationsStepMode?: boolean;
|
alertingNotificationsStepMode?: boolean;
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
|
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
|
||||||
|
|
||||||
|
import * as common from '@grafana/schema';
|
||||||
|
|
||||||
|
|
||||||
export interface DashboardV2Spec {
|
export interface DashboardV2Spec {
|
||||||
// Unique numeric identifier for the dashboard.
|
// Unique numeric identifier for the dashboard.
|
||||||
// `id` is internal to a specific Grafana instance. `uid` should be used to identify a dashboard across Grafana instances.
|
// `id` is internal to a specific Grafana instance. `uid` should be used to identify a dashboard across Grafana instances.
|
||||||
@@ -42,7 +45,7 @@ export interface DashboardV2Spec {
|
|||||||
|
|
||||||
export const defaultDashboardV2Spec = (): DashboardV2Spec => ({
|
export const defaultDashboardV2Spec = (): DashboardV2Spec => ({
|
||||||
title: "",
|
title: "",
|
||||||
cursorSync: DashboardCursorSync.Off,
|
cursorSync: "Off",
|
||||||
preload: false,
|
preload: false,
|
||||||
editable: true,
|
editable: true,
|
||||||
links: [],
|
links: [],
|
||||||
@@ -69,13 +72,9 @@ export const defaultAnnotationPanelFilter = (): AnnotationPanelFilter => ({
|
|||||||
// "Off" for no shared crosshair or tooltip (default).
|
// "Off" for no shared crosshair or tooltip (default).
|
||||||
// "Crosshair" for shared crosshair.
|
// "Crosshair" for shared crosshair.
|
||||||
// "Tooltip" for shared crosshair AND shared tooltip.
|
// "Tooltip" for shared crosshair AND shared tooltip.
|
||||||
export enum DashboardCursorSync {
|
export type DashboardCursorSync = "Off" | "Crosshair" | "Tooltip";
|
||||||
Off = "Off",
|
|
||||||
Crosshair = "Crosshair",
|
|
||||||
Tooltip = "Tooltip",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultDashboardCursorSync = (): DashboardCursorSync => (DashboardCursorSync.Off);
|
export const defaultDashboardCursorSync = (): DashboardCursorSync => ("Off");
|
||||||
|
|
||||||
// Links with references to other dashboards or external resources
|
// Links with references to other dashboards or external resources
|
||||||
export interface DashboardLink {
|
export interface DashboardLink {
|
||||||
@@ -104,7 +103,7 @@ export interface DashboardLink {
|
|||||||
|
|
||||||
export const defaultDashboardLink = (): DashboardLink => ({
|
export const defaultDashboardLink = (): DashboardLink => ({
|
||||||
title: "",
|
title: "",
|
||||||
type: DashboardLinkType.Link,
|
type: "link",
|
||||||
icon: "",
|
icon: "",
|
||||||
tooltip: "",
|
tooltip: "",
|
||||||
tags: [],
|
tags: [],
|
||||||
@@ -135,8 +134,7 @@ export interface DataTransformerConfig {
|
|||||||
// Optional frame matcher. When missing it will be applied to all results
|
// Optional frame matcher. When missing it will be applied to all results
|
||||||
filter?: MatcherConfig;
|
filter?: MatcherConfig;
|
||||||
// Where to pull DataFrames from as input to transformation
|
// Where to pull DataFrames from as input to transformation
|
||||||
// replaced with common.DataTopic
|
topic?: common.DataTopic;
|
||||||
topic?: "series" | "annotations" | "alertStates";
|
|
||||||
// Options to be passed to the transformer
|
// Options to be passed to the transformer
|
||||||
// Valid options depend on the transformer id
|
// Valid options depend on the transformer id
|
||||||
options: any;
|
options: any;
|
||||||
@@ -247,7 +245,7 @@ export const defaultMatcherConfig = (): MatcherConfig => ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export interface Threshold {
|
export interface Threshold {
|
||||||
value: number | null;
|
value: number;
|
||||||
color: string;
|
color: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,12 +254,9 @@ export const defaultThreshold = (): Threshold => ({
|
|||||||
color: "",
|
color: "",
|
||||||
});
|
});
|
||||||
|
|
||||||
export enum ThresholdsMode {
|
export type ThresholdsMode = "absolute" | "percentage";
|
||||||
Absolute = "absolute",
|
|
||||||
Percentage = "percentage",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultThresholdsMode = (): ThresholdsMode => (ThresholdsMode.Absolute);
|
export const defaultThresholdsMode = (): ThresholdsMode => ("absolute");
|
||||||
|
|
||||||
export interface ThresholdsConfig {
|
export interface ThresholdsConfig {
|
||||||
mode: ThresholdsMode;
|
mode: ThresholdsMode;
|
||||||
@@ -269,7 +264,7 @@ export interface ThresholdsConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const defaultThresholdsConfig = (): ThresholdsConfig => ({
|
export const defaultThresholdsConfig = (): ThresholdsConfig => ({
|
||||||
mode: ThresholdsMode.Absolute,
|
mode: "absolute",
|
||||||
steps: [],
|
steps: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -282,14 +277,9 @@ export const defaultValueMapping = (): ValueMapping => (defaultValueMap());
|
|||||||
// `range`: Maps numerical ranges to a display text and color. For example, if a value is within a certain range, you can configure a range value mapping to display Low or High rather than the number.
|
// `range`: Maps numerical ranges to a display text and color. For example, if a value is within a certain range, you can configure a range value mapping to display Low or High rather than the number.
|
||||||
// `regex`: Maps regular expressions to replacement text and a color. For example, if a value is www.example.com, you can configure a regex value mapping so that Grafana displays www and truncates the domain.
|
// `regex`: Maps regular expressions to replacement text and a color. For example, if a value is www.example.com, you can configure a regex value mapping so that Grafana displays www and truncates the domain.
|
||||||
// `special`: Maps special values like Null, NaN (not a number), and boolean values like true and false to a display text and color. See SpecialValueMatch to see the list of special values. For example, you can configure a special value mapping so that null values appear as N/A.
|
// `special`: Maps special values like Null, NaN (not a number), and boolean values like true and false to a display text and color. See SpecialValueMatch to see the list of special values. For example, you can configure a special value mapping so that null values appear as N/A.
|
||||||
export enum MappingType {
|
export type MappingType = "value" | "range" | "regex" | "special";
|
||||||
Value = "value",
|
|
||||||
Range = "range",
|
|
||||||
Regex = "regex",
|
|
||||||
Special = "special",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultMappingType = (): MappingType => (MappingType.Value);
|
export const defaultMappingType = (): MappingType => ("value");
|
||||||
|
|
||||||
// Maps text values to a color or different display text and color.
|
// Maps text values to a color or different display text and color.
|
||||||
// For example, you can configure a value mapping so that all instances of the value 10 appear as Perfection! rather than the number.
|
// For example, you can configure a value mapping so that all instances of the value 10 appear as Perfection! rather than the number.
|
||||||
@@ -365,22 +355,15 @@ export interface SpecialValueMap {
|
|||||||
export const defaultSpecialValueMap = (): SpecialValueMap => ({
|
export const defaultSpecialValueMap = (): SpecialValueMap => ({
|
||||||
type: "special",
|
type: "special",
|
||||||
options: {
|
options: {
|
||||||
match: SpecialValueMatch.True,
|
match: "true",
|
||||||
result: defaultValueMappingResult(),
|
result: defaultValueMappingResult(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// Special value types supported by the `SpecialValueMap`
|
// Special value types supported by the `SpecialValueMap`
|
||||||
export enum SpecialValueMatch {
|
export type SpecialValueMatch = "true" | "false" | "null" | "nan" | "null+nan" | "empty";
|
||||||
True = "true",
|
|
||||||
False = "false",
|
|
||||||
Null = "null",
|
|
||||||
NotANumber = "nan",
|
|
||||||
NullNan = "null+nan",
|
|
||||||
Empty = "empty",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultSpecialValueMatch = (): SpecialValueMatch => (SpecialValueMatch.True);
|
export const defaultSpecialValueMatch = (): SpecialValueMatch => ("true");
|
||||||
|
|
||||||
// Result used as replacement with text and color when the value matches
|
// Result used as replacement with text and color when the value matches
|
||||||
export interface ValueMappingResult {
|
export interface ValueMappingResult {
|
||||||
@@ -415,34 +398,14 @@ export const defaultValueMappingResult = (): ValueMappingResult => ({
|
|||||||
// `continuous-purples`: Continuous Purple palette mode
|
// `continuous-purples`: Continuous Purple palette mode
|
||||||
// `shades`: Shades of a single color. Specify a single color, useful in an override rule.
|
// `shades`: Shades of a single color. Specify a single color, useful in an override rule.
|
||||||
// `fixed`: Fixed color mode. Specify a single color, useful in an override rule.
|
// `fixed`: Fixed color mode. Specify a single color, useful in an override rule.
|
||||||
export enum FieldColorModeId {
|
export type FieldColorModeId = "thresholds" | "palette-classic" | "palette-classic-by-name" | "continuous-GrYlRd" | "continuous-RdYlGr" | "continuous-BlYlRd" | "continuous-YlRd" | "continuous-BlPu" | "continuous-YlBl" | "continuous-blues" | "continuous-reds" | "continuous-greens" | "continuous-purples" | "fixed" | "shades";
|
||||||
Thresholds = "thresholds",
|
|
||||||
PaletteClassic = "palette-classic",
|
|
||||||
PaletteClassicByName = "palette-classic-by-name",
|
|
||||||
ContinuousGrYlRd = "continuous-GrYlRd",
|
|
||||||
ContinuousRdYlGr = "continuous-RdYlGr",
|
|
||||||
ContinuousBlYlRd = "continuous-BlYlRd",
|
|
||||||
ContinuousYlRd = "continuous-YlRd",
|
|
||||||
ContinuousBlPu = "continuous-BlPu",
|
|
||||||
ContinuousYlBl = "continuous-YlBl",
|
|
||||||
ContinuousBlues = "continuous-blues",
|
|
||||||
ContinuousReds = "continuous-reds",
|
|
||||||
ContinuousGreens = "continuous-greens",
|
|
||||||
ContinuousPurples = "continuous-purples",
|
|
||||||
Fixed = "fixed",
|
|
||||||
Shades = "shades",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultFieldColorModeId = (): FieldColorModeId => (FieldColorModeId.Thresholds);
|
export const defaultFieldColorModeId = (): FieldColorModeId => ("thresholds");
|
||||||
|
|
||||||
// Defines how to assign a series color from "by value" color schemes. For example for an aggregated data points like a timeseries, the color can be assigned by the min, max or last value.
|
// Defines how to assign a series color from "by value" color schemes. For example for an aggregated data points like a timeseries, the color can be assigned by the min, max or last value.
|
||||||
export enum FieldColorSeriesByMode {
|
export type FieldColorSeriesByMode = "min" | "max" | "last";
|
||||||
Min = "min",
|
|
||||||
Max = "max",
|
|
||||||
Last = "last",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultFieldColorSeriesByMode = (): FieldColorSeriesByMode => (FieldColorSeriesByMode.Min);
|
export const defaultFieldColorSeriesByMode = (): FieldColorSeriesByMode => ("min");
|
||||||
|
|
||||||
// Map a field to a color.
|
// Map a field to a color.
|
||||||
export interface FieldColor {
|
export interface FieldColor {
|
||||||
@@ -455,16 +418,13 @@ export interface FieldColor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const defaultFieldColor = (): FieldColor => ({
|
export const defaultFieldColor = (): FieldColor => ({
|
||||||
mode: FieldColorModeId.Thresholds,
|
mode: "thresholds",
|
||||||
});
|
});
|
||||||
|
|
||||||
// Dashboard Link type. Accepted values are dashboards (to refer to another dashboard) and link (to refer to an external resource)
|
// Dashboard Link type. Accepted values are dashboards (to refer to another dashboard) and link (to refer to an external resource)
|
||||||
export enum DashboardLinkType {
|
export type DashboardLinkType = "link" | "dashboards";
|
||||||
Link = "link",
|
|
||||||
Dashboards = "dashboards",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultDashboardLinkType = (): DashboardLinkType => (DashboardLinkType.Link);
|
export const defaultDashboardLinkType = (): DashboardLinkType => ("link");
|
||||||
|
|
||||||
// --- Common types ---
|
// --- Common types ---
|
||||||
export interface Kind {
|
export interface Kind {
|
||||||
@@ -503,11 +463,9 @@ export const defaultVizConfigKind = (): VizConfigKind => ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export interface AnnotationQuerySpec {
|
export interface AnnotationQuerySpec {
|
||||||
datasource: DataSourceRef;
|
datasource?: DataSourceRef;
|
||||||
query: DataQueryKind;
|
query: DataQueryKind;
|
||||||
// TODO: Should be figured out based on datasource (Grafana ds)
|
builtIn?: boolean;
|
||||||
// builtIn?: int
|
|
||||||
// Below are currently existing options for annotation queries
|
|
||||||
enable: boolean;
|
enable: boolean;
|
||||||
filter: AnnotationPanelFilter;
|
filter: AnnotationPanelFilter;
|
||||||
hide: boolean;
|
hide: boolean;
|
||||||
@@ -516,7 +474,6 @@ export interface AnnotationQuerySpec {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const defaultAnnotationQuerySpec = (): AnnotationQuerySpec => ({
|
export const defaultAnnotationQuerySpec = (): AnnotationQuerySpec => ({
|
||||||
datasource: defaultDataSourceRef(),
|
|
||||||
query: defaultDataQueryKind(),
|
query: defaultDataQueryKind(),
|
||||||
enable: false,
|
enable: false,
|
||||||
filter: defaultAnnotationPanelFilter(),
|
filter: defaultAnnotationPanelFilter(),
|
||||||
@@ -542,6 +499,7 @@ export interface QueryOptionsSpec {
|
|||||||
queryCachingTTL?: number;
|
queryCachingTTL?: number;
|
||||||
interval?: string;
|
interval?: string;
|
||||||
cacheTimeout?: string;
|
cacheTimeout?: string;
|
||||||
|
hideTimeOverride?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const defaultQueryOptionsSpec = (): QueryOptionsSpec => ({
|
export const defaultQueryOptionsSpec = (): QueryOptionsSpec => ({
|
||||||
@@ -560,14 +518,13 @@ export const defaultDataQueryKind = (): DataQueryKind => ({
|
|||||||
|
|
||||||
export interface PanelQuerySpec {
|
export interface PanelQuerySpec {
|
||||||
query: DataQueryKind;
|
query: DataQueryKind;
|
||||||
datasource: DataSourceRef;
|
datasource?: DataSourceRef;
|
||||||
refId: string;
|
refId: string;
|
||||||
hidden: boolean;
|
hidden: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const defaultPanelQuerySpec = (): PanelQuerySpec => ({
|
export const defaultPanelQuerySpec = (): PanelQuerySpec => ({
|
||||||
query: defaultDataQueryKind(),
|
query: defaultDataQueryKind(),
|
||||||
datasource: defaultDataSourceRef(),
|
|
||||||
refId: "",
|
refId: "",
|
||||||
hidden: false,
|
hidden: false,
|
||||||
});
|
});
|
||||||
@@ -782,7 +739,7 @@ export interface CustomFormatterVariable {
|
|||||||
|
|
||||||
export const defaultCustomFormatterVariable = (): CustomFormatterVariable => ({
|
export const defaultCustomFormatterVariable = (): CustomFormatterVariable => ({
|
||||||
name: "",
|
name: "",
|
||||||
type: VariableType.Query,
|
type: "query",
|
||||||
multi: false,
|
multi: false,
|
||||||
includeAll: false,
|
includeAll: false,
|
||||||
});
|
});
|
||||||
@@ -813,7 +770,7 @@ export const defaultVariableCustomFormatterFn = (): VariableCustomFormatterFn =>
|
|||||||
value: {},
|
value: {},
|
||||||
legacyVariableModel: {
|
legacyVariableModel: {
|
||||||
name: "",
|
name: "",
|
||||||
type: VariableType.Query,
|
type: "query",
|
||||||
multi: false,
|
multi: false,
|
||||||
includeAll: false,
|
includeAll: false,
|
||||||
},
|
},
|
||||||
@@ -828,20 +785,9 @@ export const defaultVariableCustomFormatterFn = (): VariableCustomFormatterFn =>
|
|||||||
// `textbox`: Display a free text input field with an optional default value.
|
// `textbox`: Display a free text input field with an optional default value.
|
||||||
// `custom`: Define the variable options manually using a comma-separated list.
|
// `custom`: Define the variable options manually using a comma-separated list.
|
||||||
// `system`: Variables defined by Grafana. See: https://grafana.com/docs/grafana/latest/dashboards/variables/add-template-variables/#global-variables
|
// `system`: Variables defined by Grafana. See: https://grafana.com/docs/grafana/latest/dashboards/variables/add-template-variables/#global-variables
|
||||||
export enum VariableType {
|
export type VariableType = "query" | "adhoc" | "groupby" | "constant" | "datasource" | "interval" | "textbox" | "custom" | "system" | "snapshot";
|
||||||
Query = "query",
|
|
||||||
Adhoc = "adhoc",
|
|
||||||
Groupby = "groupby",
|
|
||||||
Constant = "constant",
|
|
||||||
Datasource = "datasource",
|
|
||||||
Interval = "interval",
|
|
||||||
Textbox = "textbox",
|
|
||||||
Custom = "custom",
|
|
||||||
System = "system",
|
|
||||||
Snapshot = "snapshot",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultVariableType = (): VariableType => (VariableType.Query);
|
export const defaultVariableType = (): VariableType => ("query");
|
||||||
|
|
||||||
// Sort variable options
|
// Sort variable options
|
||||||
// Accepted values are:
|
// Accepted values are:
|
||||||
@@ -855,41 +801,23 @@ export const defaultVariableType = (): VariableType => (VariableType.Query);
|
|||||||
// `naturalAsc`: Natural ASC
|
// `naturalAsc`: Natural ASC
|
||||||
// `naturalDesc`: Natural DESC
|
// `naturalDesc`: Natural DESC
|
||||||
// VariableSort enum with default value
|
// VariableSort enum with default value
|
||||||
export enum VariableSort {
|
export type VariableSort = "disabled" | "alphabeticalAsc" | "alphabeticalDesc" | "numericalAsc" | "numericalDesc" | "alphabeticalCaseInsensitiveAsc" | "alphabeticalCaseInsensitiveDesc" | "naturalAsc" | "naturalDesc";
|
||||||
Disabled = "disabled",
|
|
||||||
AlphabeticalAsc = "alphabeticalAsc",
|
|
||||||
AlphabeticalDesc = "alphabeticalDesc",
|
|
||||||
NumericalAsc = "numericalAsc",
|
|
||||||
NumericalDesc = "numericalDesc",
|
|
||||||
AlphabeticalCaseInsensitiveAsc = "alphabeticalCaseInsensitiveAsc",
|
|
||||||
AlphabeticalCaseInsensitiveDesc = "alphabeticalCaseInsensitiveDesc",
|
|
||||||
NaturalAsc = "naturalAsc",
|
|
||||||
NaturalDesc = "naturalDesc",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultVariableSort = (): VariableSort => (VariableSort.Disabled);
|
export const defaultVariableSort = (): VariableSort => ("disabled");
|
||||||
|
|
||||||
// Options to config when to refresh a variable
|
// Options to config when to refresh a variable
|
||||||
// `never`: Never refresh the variable
|
// `never`: Never refresh the variable
|
||||||
// `onDashboardLoad`: Queries the data source every time the dashboard loads.
|
// `onDashboardLoad`: Queries the data source every time the dashboard loads.
|
||||||
// `onTimeRangeChanged`: Queries the data source when the dashboard time range changes.
|
// `onTimeRangeChanged`: Queries the data source when the dashboard time range changes.
|
||||||
export enum VariableRefresh {
|
export type VariableRefresh = "never" | "onDashboardLoad" | "onTimeRangeChanged";
|
||||||
Never = "never",
|
|
||||||
OnDashboardLoad = "onDashboardLoad",
|
|
||||||
OnTimeRangeChanged = "onTimeRangeChanged",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultVariableRefresh = (): VariableRefresh => (VariableRefresh.Never);
|
export const defaultVariableRefresh = (): VariableRefresh => ("never");
|
||||||
|
|
||||||
// Determine if the variable shows on dashboard
|
// Determine if the variable shows on dashboard
|
||||||
// Accepted values are `dontHide` (show label and value), `hideLabel` (show value only), `hideVariable` (show nothing).
|
// Accepted values are `dontHide` (show label and value), `hideLabel` (show value only), `hideVariable` (show nothing).
|
||||||
export enum VariableHide {
|
export type VariableHide = "dontHide" | "hideLabel" | "hideVariable";
|
||||||
DontHide = "dontHide",
|
|
||||||
HideLabel = "hideLabel",
|
|
||||||
HideVariable = "hideVariable",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultVariableHide = (): VariableHide => (VariableHide.DontHide);
|
export const defaultVariableHide = (): VariableHide => ("dontHide");
|
||||||
|
|
||||||
// FIXME: should we introduce this? --- Variable value option
|
// FIXME: should we introduce this? --- Variable value option
|
||||||
export interface VariableValueOption {
|
export interface VariableValueOption {
|
||||||
@@ -927,7 +855,7 @@ export interface QueryVariableSpec {
|
|||||||
refresh: VariableRefresh;
|
refresh: VariableRefresh;
|
||||||
skipUrlSync: boolean;
|
skipUrlSync: boolean;
|
||||||
description?: string;
|
description?: string;
|
||||||
datasource: DataSourceRef;
|
datasource?: DataSourceRef;
|
||||||
query: string | DataQueryKind;
|
query: string | DataQueryKind;
|
||||||
regex: string;
|
regex: string;
|
||||||
sort: VariableSort;
|
sort: VariableSort;
|
||||||
@@ -942,13 +870,12 @@ export interface QueryVariableSpec {
|
|||||||
export const defaultQueryVariableSpec = (): QueryVariableSpec => ({
|
export const defaultQueryVariableSpec = (): QueryVariableSpec => ({
|
||||||
name: "",
|
name: "",
|
||||||
current: { text: "", value: "", },
|
current: { text: "", value: "", },
|
||||||
hide: VariableHide.DontHide,
|
hide: "dontHide",
|
||||||
refresh: VariableRefresh.Never,
|
refresh: "never",
|
||||||
skipUrlSync: false,
|
skipUrlSync: false,
|
||||||
datasource: defaultDataSourceRef(),
|
|
||||||
query: "",
|
query: "",
|
||||||
regex: "",
|
regex: "",
|
||||||
sort: VariableSort.Disabled,
|
sort: "disabled",
|
||||||
options: [],
|
options: [],
|
||||||
multi: false,
|
multi: false,
|
||||||
includeAll: false,
|
includeAll: false,
|
||||||
@@ -980,7 +907,7 @@ export const defaultTextVariableSpec = (): TextVariableSpec => ({
|
|||||||
name: "",
|
name: "",
|
||||||
current: { text: "", value: "", },
|
current: { text: "", value: "", },
|
||||||
query: "",
|
query: "",
|
||||||
hide: VariableHide.DontHide,
|
hide: "dontHide",
|
||||||
skipUrlSync: false,
|
skipUrlSync: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1010,7 +937,7 @@ export const defaultConstantVariableSpec = (): ConstantVariableSpec => ({
|
|||||||
name: "",
|
name: "",
|
||||||
query: "",
|
query: "",
|
||||||
current: { text: "", value: "", },
|
current: { text: "", value: "", },
|
||||||
hide: VariableHide.DontHide,
|
hide: "dontHide",
|
||||||
skipUrlSync: false,
|
skipUrlSync: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1046,14 +973,14 @@ export interface DatasourceVariableSpec {
|
|||||||
export const defaultDatasourceVariableSpec = (): DatasourceVariableSpec => ({
|
export const defaultDatasourceVariableSpec = (): DatasourceVariableSpec => ({
|
||||||
name: "",
|
name: "",
|
||||||
pluginId: "",
|
pluginId: "",
|
||||||
refresh: VariableRefresh.Never,
|
refresh: "never",
|
||||||
regex: "",
|
regex: "",
|
||||||
current: { text: "", value: "", },
|
current: { text: "", value: "", },
|
||||||
defaultOptionEnabled: false,
|
defaultOptionEnabled: false,
|
||||||
options: [],
|
options: [],
|
||||||
multi: false,
|
multi: false,
|
||||||
includeAll: false,
|
includeAll: false,
|
||||||
hide: VariableHide.DontHide,
|
hide: "dontHide",
|
||||||
skipUrlSync: false,
|
skipUrlSync: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1092,8 +1019,8 @@ export const defaultIntervalVariableSpec = (): IntervalVariableSpec => ({
|
|||||||
auto: false,
|
auto: false,
|
||||||
auto_min: "",
|
auto_min: "",
|
||||||
auto_count: 0,
|
auto_count: 0,
|
||||||
refresh: VariableRefresh.Never,
|
refresh: "never",
|
||||||
hide: VariableHide.DontHide,
|
hide: "dontHide",
|
||||||
skipUrlSync: false,
|
skipUrlSync: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1130,7 +1057,7 @@ export const defaultCustomVariableSpec = (): CustomVariableSpec => ({
|
|||||||
options: [],
|
options: [],
|
||||||
multi: false,
|
multi: false,
|
||||||
includeAll: false,
|
includeAll: false,
|
||||||
hide: VariableHide.DontHide,
|
hide: "dontHide",
|
||||||
skipUrlSync: false,
|
skipUrlSync: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1148,7 +1075,7 @@ export const defaultCustomVariableKind = (): CustomVariableKind => ({
|
|||||||
// GroupBy variable specification
|
// GroupBy variable specification
|
||||||
export interface GroupByVariableSpec {
|
export interface GroupByVariableSpec {
|
||||||
name: string;
|
name: string;
|
||||||
datasource: DataSourceRef;
|
datasource?: DataSourceRef;
|
||||||
current: VariableOption;
|
current: VariableOption;
|
||||||
options: VariableOption[];
|
options: VariableOption[];
|
||||||
multi: boolean;
|
multi: boolean;
|
||||||
@@ -1162,12 +1089,11 @@ export interface GroupByVariableSpec {
|
|||||||
|
|
||||||
export const defaultGroupByVariableSpec = (): GroupByVariableSpec => ({
|
export const defaultGroupByVariableSpec = (): GroupByVariableSpec => ({
|
||||||
name: "",
|
name: "",
|
||||||
datasource: defaultDataSourceRef(),
|
|
||||||
current: { text: "", value: "", },
|
current: { text: "", value: "", },
|
||||||
options: [],
|
options: [],
|
||||||
multi: false,
|
multi: false,
|
||||||
includeAll: false,
|
includeAll: false,
|
||||||
hide: VariableHide.DontHide,
|
hide: "dontHide",
|
||||||
skipUrlSync: false,
|
skipUrlSync: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1185,7 +1111,7 @@ export const defaultGroupByVariableKind = (): GroupByVariableKind => ({
|
|||||||
// Adhoc variable specification
|
// Adhoc variable specification
|
||||||
export interface AdhocVariableSpec {
|
export interface AdhocVariableSpec {
|
||||||
name: string;
|
name: string;
|
||||||
datasource: DataSourceRef;
|
datasource?: DataSourceRef;
|
||||||
baseFilters: AdHocFilterWithLabels[];
|
baseFilters: AdHocFilterWithLabels[];
|
||||||
filters: AdHocFilterWithLabels[];
|
filters: AdHocFilterWithLabels[];
|
||||||
defaultKeys: MetricFindValue[];
|
defaultKeys: MetricFindValue[];
|
||||||
@@ -1197,11 +1123,10 @@ export interface AdhocVariableSpec {
|
|||||||
|
|
||||||
export const defaultAdhocVariableSpec = (): AdhocVariableSpec => ({
|
export const defaultAdhocVariableSpec = (): AdhocVariableSpec => ({
|
||||||
name: "",
|
name: "",
|
||||||
datasource: defaultDataSourceRef(),
|
|
||||||
baseFilters: [],
|
baseFilters: [],
|
||||||
filters: [],
|
filters: [],
|
||||||
defaultKeys: [],
|
defaultKeys: [],
|
||||||
hide: VariableHide.DontHide,
|
hide: "dontHide",
|
||||||
skipUrlSync: false,
|
skipUrlSync: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
package dashboard
|
package v2alpha0
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/grafana/grafana/packages/grafana-schema/src/common"
|
||||||
|
)
|
||||||
|
|
||||||
DashboardV2Spec: {
|
DashboardV2Spec: {
|
||||||
// Unique numeric identifier for the dashboard.
|
// Unique numeric identifier for the dashboard.
|
||||||
@@ -113,7 +117,7 @@ DataTransformerConfig: {
|
|||||||
// Optional frame matcher. When missing it will be applied to all results
|
// Optional frame matcher. When missing it will be applied to all results
|
||||||
filter?: MatcherConfig
|
filter?: MatcherConfig
|
||||||
// Where to pull DataFrames from as input to transformation
|
// Where to pull DataFrames from as input to transformation
|
||||||
topic?: "series" | "annotations" | "alertStates" // replaced with common.DataTopic
|
topic?: common.DataTopic
|
||||||
// Options to be passed to the transformer
|
// Options to be passed to the transformer
|
||||||
// Valid options depend on the transformer id
|
// Valid options depend on the transformer id
|
||||||
options: _
|
options: _
|
||||||
@@ -217,7 +221,7 @@ MatcherConfig: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Threshold: {
|
Threshold: {
|
||||||
value: number | null
|
value: number
|
||||||
color: string
|
color: string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -235,7 +239,7 @@ ValueMapping: ValueMap | RangeMap | RegexMap | SpecialValueMap
|
|||||||
// `range`: Maps numerical ranges to a display text and color. For example, if a value is within a certain range, you can configure a range value mapping to display Low or High rather than the number.
|
// `range`: Maps numerical ranges to a display text and color. For example, if a value is within a certain range, you can configure a range value mapping to display Low or High rather than the number.
|
||||||
// `regex`: Maps regular expressions to replacement text and a color. For example, if a value is www.example.com, you can configure a regex value mapping so that Grafana displays www and truncates the domain.
|
// `regex`: Maps regular expressions to replacement text and a color. For example, if a value is www.example.com, you can configure a regex value mapping so that Grafana displays www and truncates the domain.
|
||||||
// `special`: Maps special values like Null, NaN (not a number), and boolean values like true and false to a display text and color. See SpecialValueMatch to see the list of special values. For example, you can configure a special value mapping so that null values appear as N/A.
|
// `special`: Maps special values like Null, NaN (not a number), and boolean values like true and false to a display text and color. See SpecialValueMatch to see the list of special values. For example, you can configure a special value mapping so that null values appear as N/A.
|
||||||
MappingType: "value" | "range" | "regex" | "special"
|
MappingType: "value" | "range" | "regex" | "special" @cog(kind="enum",memberNames="ValueToText|RangeToText|RegexToText|SpecialValue")
|
||||||
|
|
||||||
// Maps text values to a color or different display text and color.
|
// Maps text values to a color or different display text and color.
|
||||||
// For example, you can configure a value mapping so that all instances of the value 10 appear as Perfection! rather than the number.
|
// For example, you can configure a value mapping so that all instances of the value 10 appear as Perfection! rather than the number.
|
||||||
@@ -287,7 +291,7 @@ SpecialValueMap: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Special value types supported by the `SpecialValueMap`
|
// Special value types supported by the `SpecialValueMap`
|
||||||
SpecialValueMatch: "true" | "false" | "null" | "nan" | "null+nan" | "empty"
|
SpecialValueMatch: "true" | "false" | "null" | "nan" | "null+nan" | "empty" @cog(kind="enum",memberNames="True|False|Null|NaN|NullAndNaN|Empty")
|
||||||
|
|
||||||
// Result used as replacement with text and color when the value matches
|
// Result used as replacement with text and color when the value matches
|
||||||
ValueMappingResult: {
|
ValueMappingResult: {
|
||||||
@@ -358,12 +362,9 @@ VizConfigKind: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
AnnotationQuerySpec: {
|
AnnotationQuerySpec: {
|
||||||
datasource: DataSourceRef
|
datasource?: DataSourceRef
|
||||||
query: DataQueryKind
|
query: DataQueryKind
|
||||||
|
builtIn?: bool
|
||||||
// TODO: Should be figured out based on datasource (Grafana ds)
|
|
||||||
// builtIn?: int
|
|
||||||
// Below are currently existing options for annotation queries
|
|
||||||
enable: bool
|
enable: bool
|
||||||
filter: AnnotationPanelFilter
|
filter: AnnotationPanelFilter
|
||||||
hide: bool
|
hide: bool
|
||||||
@@ -383,6 +384,7 @@ QueryOptionsSpec: {
|
|||||||
queryCachingTTL?: int
|
queryCachingTTL?: int
|
||||||
interval?: string
|
interval?: string
|
||||||
cacheTimeout?: string
|
cacheTimeout?: string
|
||||||
|
hideTimeOverride?: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
DataQueryKind: {
|
DataQueryKind: {
|
||||||
@@ -393,7 +395,7 @@ DataQueryKind: {
|
|||||||
|
|
||||||
PanelQuerySpec: {
|
PanelQuerySpec: {
|
||||||
query: DataQueryKind
|
query: DataQueryKind
|
||||||
datasource: DataSourceRef
|
datasource?: DataSourceRef
|
||||||
|
|
||||||
refId: string
|
refId: string
|
||||||
hidden: bool
|
hidden: bool
|
||||||
@@ -593,7 +595,7 @@ QueryVariableSpec: {
|
|||||||
refresh: VariableRefresh
|
refresh: VariableRefresh
|
||||||
skipUrlSync: bool | *false
|
skipUrlSync: bool | *false
|
||||||
description?: string
|
description?: string
|
||||||
datasource: DataSourceRef | *{}
|
datasource?: DataSourceRef
|
||||||
query: string | DataQueryKind | *""
|
query: string | DataQueryKind | *""
|
||||||
regex: string | *""
|
regex: string | *""
|
||||||
sort: VariableSort
|
sort: VariableSort
|
||||||
@@ -727,7 +729,7 @@ CustomVariableKind: {
|
|||||||
// GroupBy variable specification
|
// GroupBy variable specification
|
||||||
GroupByVariableSpec: {
|
GroupByVariableSpec: {
|
||||||
name: string | *""
|
name: string | *""
|
||||||
datasource: DataSourceRef | *{}
|
datasource?: DataSourceRef
|
||||||
current: VariableOption | *{
|
current: VariableOption | *{
|
||||||
text: ""
|
text: ""
|
||||||
value: ""
|
value: ""
|
||||||
@@ -751,7 +753,7 @@ GroupByVariableKind: {
|
|||||||
// Adhoc variable specification
|
// Adhoc variable specification
|
||||||
AdhocVariableSpec: {
|
AdhocVariableSpec: {
|
||||||
name: string | *""
|
name: string | *""
|
||||||
datasource: DataSourceRef | *{}
|
datasource?: DataSourceRef
|
||||||
baseFilters: [...AdHocFilterWithLabels] | *[]
|
baseFilters: [...AdHocFilterWithLabels] | *[]
|
||||||
filters: [...AdHocFilterWithLabels] | *[]
|
filters: [...AdHocFilterWithLabels] | *[]
|
||||||
defaultKeys: [...MetricFindValue] | *[]
|
defaultKeys: [...MetricFindValue] | *[]
|
||||||
|
|||||||
@@ -1,36 +1,32 @@
|
|||||||
import { DashboardCursorSync, DashboardV2Spec } from './dashboard.gen';
|
import { DashboardV2Spec } from './dashboard.gen';
|
||||||
|
|
||||||
export const handyTestingSchema: DashboardV2Spec = {
|
export const handyTestingSchema: DashboardV2Spec = {
|
||||||
id: 1,
|
id: 1,
|
||||||
title: 'Default Dashboard',
|
title: 'Default Dashboard',
|
||||||
description: 'This is a default dashboard',
|
description: 'This is a default dashboard',
|
||||||
cursorSync: DashboardCursorSync.Off,
|
cursorSync: 'Off',
|
||||||
liveNow: false,
|
liveNow: false,
|
||||||
preload: false,
|
preload: false,
|
||||||
editable: true,
|
editable: true,
|
||||||
links: [],
|
schemaVersion: 40,
|
||||||
tags: [],
|
tags: ['tag1', 'tag2'],
|
||||||
schemaVersion: 39,
|
|
||||||
timeSettings: {
|
timeSettings: {
|
||||||
timezone: 'browser',
|
autoRefresh: '5s',
|
||||||
from: 'now-6h',
|
autoRefreshIntervals: ['5s', '10s', '30s'],
|
||||||
to: 'now',
|
|
||||||
autoRefresh: '10s',
|
|
||||||
autoRefreshIntervals: ['10s', '1m', '5m', '15m', '30m', '1h', '6h', '12h', '1d'],
|
|
||||||
quickRanges: ['now/d', 'now/w', 'now/M', 'now/y'],
|
|
||||||
hideTimepicker: false,
|
|
||||||
weekStart: 'sunday',
|
|
||||||
fiscalYearStartMonth: 1,
|
fiscalYearStartMonth: 1,
|
||||||
|
from: 'now-1h',
|
||||||
|
hideTimepicker: false,
|
||||||
|
nowDelay: '1m',
|
||||||
|
quickRanges: [],
|
||||||
|
timezone: 'UTC',
|
||||||
|
to: 'now',
|
||||||
|
weekStart: 'monday',
|
||||||
},
|
},
|
||||||
|
annotations: [],
|
||||||
elements: {
|
elements: {
|
||||||
timeSeriesTest: {
|
'test-panel-uid': {
|
||||||
kind: 'Panel',
|
kind: 'Panel',
|
||||||
spec: {
|
spec: {
|
||||||
title: 'Time Series Test',
|
|
||||||
description: 'This is a test panel',
|
|
||||||
uid: 'timeSeriesTest',
|
|
||||||
links: [],
|
|
||||||
data: {
|
data: {
|
||||||
kind: 'QueryGroup',
|
kind: 'QueryGroup',
|
||||||
spec: {
|
spec: {
|
||||||
@@ -38,44 +34,63 @@ export const handyTestingSchema: DashboardV2Spec = {
|
|||||||
{
|
{
|
||||||
kind: 'PanelQuery',
|
kind: 'PanelQuery',
|
||||||
spec: {
|
spec: {
|
||||||
|
refId: 'A',
|
||||||
|
datasource: {
|
||||||
|
type: 'prometheus',
|
||||||
|
uid: 'datasource1',
|
||||||
|
},
|
||||||
query: {
|
query: {
|
||||||
kind: 'prometheus',
|
kind: 'prometheus',
|
||||||
spec: {
|
spec: {
|
||||||
query: 'up',
|
expr: 'test-query',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
datasource: { uid: 'gdev-prometheus', type: 'prometheus' },
|
|
||||||
hidden: false,
|
hidden: false,
|
||||||
refId: 'A',
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
queryOptions: {
|
||||||
|
timeFrom: '1h',
|
||||||
|
maxDataPoints: 100,
|
||||||
|
timeShift: '1h',
|
||||||
|
queryCachingTTL: 60,
|
||||||
|
interval: '1m',
|
||||||
|
cacheTimeout: '1m',
|
||||||
|
hideTimeOverride: false,
|
||||||
|
},
|
||||||
transformations: [
|
transformations: [
|
||||||
{
|
{
|
||||||
kind: 'limit',
|
kind: 'limit',
|
||||||
spec: {
|
spec: {
|
||||||
id: 'limit', // id is competing w/ kind
|
id: 'limit',
|
||||||
|
disabled: false,
|
||||||
|
filter: {
|
||||||
|
id: 'byValue',
|
||||||
|
options: {
|
||||||
|
reducer: 'sum',
|
||||||
|
},
|
||||||
|
},
|
||||||
options: {
|
options: {
|
||||||
limit: 10,
|
limit: 10,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
queryOptions: {
|
|
||||||
maxDataPoints: 100,
|
|
||||||
cacheTimeout: '1m',
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
description: 'Test Description',
|
||||||
|
links: [],
|
||||||
|
title: 'Test Panel',
|
||||||
|
uid: 'test-panel-uid',
|
||||||
vizConfig: {
|
vizConfig: {
|
||||||
kind: 'timeseries',
|
kind: 'timeseries',
|
||||||
spec: {
|
spec: {
|
||||||
pluginVersion: '11.0.0',
|
|
||||||
options: {},
|
|
||||||
fieldConfig: {
|
fieldConfig: {
|
||||||
defaults: {},
|
defaults: {},
|
||||||
overrides: [],
|
overrides: [],
|
||||||
},
|
},
|
||||||
|
options: {},
|
||||||
|
pluginVersion: '7.0.0',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -88,62 +103,252 @@ export const handyTestingSchema: DashboardV2Spec = {
|
|||||||
{
|
{
|
||||||
kind: 'GridLayoutItem',
|
kind: 'GridLayoutItem',
|
||||||
spec: {
|
spec: {
|
||||||
element: { kind: 'ElementReference', name: 'timeSeriesTest' },
|
element: {
|
||||||
|
kind: 'ElementReference',
|
||||||
|
name: 'test-panel-uid',
|
||||||
|
},
|
||||||
|
height: 0,
|
||||||
|
width: 0,
|
||||||
x: 0,
|
x: 0,
|
||||||
y: 0,
|
y: 0,
|
||||||
width: 12,
|
|
||||||
height: 6,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
variables: [],
|
links: [
|
||||||
annotations: [
|
|
||||||
{
|
{
|
||||||
kind: 'AnnotationQuery',
|
asDropdown: false,
|
||||||
|
icon: '',
|
||||||
|
includeVars: false,
|
||||||
|
keepTime: false,
|
||||||
|
tags: [],
|
||||||
|
targetBlank: false,
|
||||||
|
title: 'Test Link',
|
||||||
|
tooltip: '',
|
||||||
|
type: 'dashboards',
|
||||||
|
url: 'http://test.com',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
variables: [
|
||||||
|
{
|
||||||
|
kind: 'QueryVariable',
|
||||||
spec: {
|
spec: {
|
||||||
datasource: { type: 'datasource', uid: 'grafana' },
|
allValue: '*',
|
||||||
query: {
|
current: {
|
||||||
kind: 'grafana',
|
text: 'text1',
|
||||||
spec: {
|
value: 'value1',
|
||||||
queryType: 'timeRegions',
|
|
||||||
matchAny: false,
|
|
||||||
timeRegion: {
|
|
||||||
from: '12:27',
|
|
||||||
fromDayOfWeek: 2,
|
|
||||||
timezone: 'browser',
|
|
||||||
to: '11:30',
|
|
||||||
toDayOfWeek: 2,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
enable: true,
|
datasource: {
|
||||||
filter: {
|
type: 'prometheus',
|
||||||
ids: [],
|
uid: 'datasource1',
|
||||||
},
|
},
|
||||||
hide: false,
|
definition: 'definition1',
|
||||||
iconColor: 'blue',
|
description: 'A query variable',
|
||||||
name: 'Grafana annotations',
|
hide: 'dontHide',
|
||||||
|
includeAll: true,
|
||||||
|
label: 'Query Variable',
|
||||||
|
multi: true,
|
||||||
|
name: 'queryVar',
|
||||||
|
options: [],
|
||||||
|
query: 'query1',
|
||||||
|
refresh: 'onDashboardLoad',
|
||||||
|
regex: 'regex1',
|
||||||
|
skipUrlSync: false,
|
||||||
|
sort: 'disabled',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
kind: 'AnnotationQuery',
|
kind: 'CustomVariable',
|
||||||
spec: {
|
spec: {
|
||||||
datasource: { uid: 'gdev-prometheus', type: 'prometheus' },
|
allValue: 'All',
|
||||||
query: {
|
current: {
|
||||||
kind: 'prometheus',
|
text: 'option1',
|
||||||
spec: {
|
value: 'option1',
|
||||||
query: 'up',
|
},
|
||||||
|
description: 'A custom variable',
|
||||||
|
hide: 'dontHide',
|
||||||
|
includeAll: true,
|
||||||
|
label: 'Custom Variable',
|
||||||
|
multi: true,
|
||||||
|
name: 'customVar',
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
selected: true,
|
||||||
|
text: 'option1',
|
||||||
|
value: 'option1',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
selected: false,
|
||||||
|
text: 'option2',
|
||||||
|
value: 'option2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
query: 'option1, option2',
|
||||||
|
skipUrlSync: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
kind: 'DatasourceVariable',
|
||||||
|
spec: {
|
||||||
|
allValue: undefined,
|
||||||
|
current: {
|
||||||
|
text: 'text1',
|
||||||
|
value: 'value1',
|
||||||
},
|
},
|
||||||
enable: true,
|
defaultOptionEnabled: true,
|
||||||
filter: {
|
description: 'A datasource variable',
|
||||||
ids: [],
|
hide: 'dontHide',
|
||||||
|
includeAll: false,
|
||||||
|
label: 'Datasource Variable',
|
||||||
|
multi: false,
|
||||||
|
name: 'datasourceVar',
|
||||||
|
options: [],
|
||||||
|
pluginId: 'datasource1',
|
||||||
|
refresh: 'onDashboardLoad',
|
||||||
|
regex: 'regex1',
|
||||||
|
skipUrlSync: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
kind: 'ConstantVariable',
|
||||||
|
spec: {
|
||||||
|
current: {
|
||||||
|
text: 'value4',
|
||||||
|
value: 'value4',
|
||||||
},
|
},
|
||||||
hide: false,
|
description: 'A constant variable',
|
||||||
iconColor: 'red',
|
hide: 'dontHide',
|
||||||
name: 'Prometheus annotations',
|
label: 'Constant Variable',
|
||||||
|
name: 'constantVar',
|
||||||
|
query: 'value4',
|
||||||
|
skipUrlSync: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
kind: 'IntervalVariable',
|
||||||
|
spec: {
|
||||||
|
auto: false,
|
||||||
|
auto_count: 10,
|
||||||
|
auto_min: '1m',
|
||||||
|
current: {
|
||||||
|
text: '1m',
|
||||||
|
value: '1m',
|
||||||
|
},
|
||||||
|
description: 'An interval variable',
|
||||||
|
hide: 'dontHide',
|
||||||
|
label: 'Interval Variable',
|
||||||
|
name: 'intervalVar',
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
selected: true,
|
||||||
|
text: '1m',
|
||||||
|
value: '1m',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
selected: false,
|
||||||
|
text: '5m',
|
||||||
|
value: '5m',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
selected: false,
|
||||||
|
text: '10m',
|
||||||
|
value: '10m',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
query: '1m,5m,10m',
|
||||||
|
refresh: 'onDashboardLoad',
|
||||||
|
skipUrlSync: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
kind: 'TextVariable',
|
||||||
|
spec: {
|
||||||
|
current: {
|
||||||
|
text: 'value6',
|
||||||
|
value: 'value6',
|
||||||
|
},
|
||||||
|
description: 'A text variable',
|
||||||
|
hide: 'dontHide',
|
||||||
|
label: 'Text Variable',
|
||||||
|
name: 'textVar',
|
||||||
|
query: 'value6',
|
||||||
|
skipUrlSync: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
kind: 'GroupByVariable',
|
||||||
|
spec: {
|
||||||
|
current: {
|
||||||
|
text: 'text7',
|
||||||
|
value: 'value7',
|
||||||
|
},
|
||||||
|
datasource: {
|
||||||
|
type: 'prometheus',
|
||||||
|
uid: 'datasource2',
|
||||||
|
},
|
||||||
|
description: 'A group by variable',
|
||||||
|
hide: 'dontHide',
|
||||||
|
includeAll: false,
|
||||||
|
label: 'Group By Variable',
|
||||||
|
multi: false,
|
||||||
|
name: 'groupByVar',
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
text: 'option1',
|
||||||
|
value: 'option1',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'option2',
|
||||||
|
value: 'option2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
skipUrlSync: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
kind: 'AdhocVariable',
|
||||||
|
spec: {
|
||||||
|
baseFilters: [
|
||||||
|
{
|
||||||
|
condition: 'AND',
|
||||||
|
key: 'key1',
|
||||||
|
operator: '=',
|
||||||
|
value: 'value1',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
condition: 'OR',
|
||||||
|
key: 'key2',
|
||||||
|
operator: '=',
|
||||||
|
value: 'value2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
datasource: {
|
||||||
|
type: 'prometheus',
|
||||||
|
uid: 'datasource3',
|
||||||
|
},
|
||||||
|
defaultKeys: [
|
||||||
|
{
|
||||||
|
expandable: true,
|
||||||
|
group: 'defaultGroup1',
|
||||||
|
text: 'defaultKey1',
|
||||||
|
value: 'defaultKey1',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
description: 'An adhoc variable',
|
||||||
|
filters: [
|
||||||
|
{
|
||||||
|
condition: 'AND',
|
||||||
|
key: 'key3',
|
||||||
|
operator: '=',
|
||||||
|
value: 'value3',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
hide: 'dontHide',
|
||||||
|
label: 'Adhoc Variable',
|
||||||
|
name: 'adhocVar',
|
||||||
|
skipUrlSync: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
// This script is used to copy assets from the public folder to a temporary static folder within
|
||||||
|
// the .storybook directory.
|
||||||
|
// We selectively limit assets that are uploaded to the Storybook bucket to prevent rate limiting
|
||||||
|
// when publishing new storybook.
|
||||||
|
// Note: Storybook has a static copying feature but it copies entire directories which can contain thousands of icons.
|
||||||
|
|
||||||
|
import { copySync, emptyDirSync, lstatSync } from 'fs-extra';
|
||||||
|
import { resolve } from 'node:path';
|
||||||
|
|
||||||
|
// avoid importing from @grafana/data to prevent error: window is not defined
|
||||||
|
import { availableIconsIndex, IconName } from '../../grafana-data/src/types/icon';
|
||||||
|
import { getIconSubDir } from '../src/components/Icon/utils';
|
||||||
|
|
||||||
|
// doesn't require uploading 1000s of unused assets.
|
||||||
|
const iconPaths = Object.keys(availableIconsIndex)
|
||||||
|
.filter((iconName) => !iconName.startsWith('fa '))
|
||||||
|
.map((iconName) => {
|
||||||
|
const subDir = getIconSubDir(iconName as IconName, 'default');
|
||||||
|
return {
|
||||||
|
from: `../../../public/img/icons/${subDir}/${iconName}.svg`,
|
||||||
|
to: `./static/public/img/icons/${subDir}/${iconName}.svg`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
export function copyAssetsSync() {
|
||||||
|
const assets = [
|
||||||
|
{
|
||||||
|
from: '../../../public/fonts',
|
||||||
|
to: './static/public/fonts',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: '../../../public/img/grafana_text_logo-dark.svg',
|
||||||
|
to: './static/public/img/grafana_text_logo-dark.svg',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: '../../../public/img/grafana_text_logo-light.svg',
|
||||||
|
to: './static/public/img/grafana_text_logo-light.svg',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: '../../../public/img/fav32.png',
|
||||||
|
to: './static/public/img/fav32.png',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: '../../../public/lib',
|
||||||
|
to: './static/public/lib',
|
||||||
|
},
|
||||||
|
...iconPaths,
|
||||||
|
];
|
||||||
|
|
||||||
|
const staticDir = resolve(__dirname, 'static', 'public');
|
||||||
|
|
||||||
|
emptyDirSync(staticDir);
|
||||||
|
|
||||||
|
for (const asset of assets) {
|
||||||
|
const fromPath = resolve(__dirname, asset.from);
|
||||||
|
const toPath = resolve(__dirname, asset.to);
|
||||||
|
|
||||||
|
copySync(fromPath, toPath, {
|
||||||
|
filter: (src) => !lstatSync(src).isSymbolicLink(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
import path, { dirname, join } from 'path';
|
import path, { dirname, join } from 'node:path';
|
||||||
import type { StorybookConfig } from '@storybook/react-webpack5';
|
import type { StorybookConfig } from '@storybook/react-webpack5';
|
||||||
// avoid importing from @grafana/data to prevent node error: ERR_REQUIRE_ESM
|
import { copyAssetsSync } from './copyAssets';
|
||||||
import { availableIconsIndex, IconName } from '../../grafana-data/src/types/icon';
|
|
||||||
import { getIconSubDir } from '../src/components/Icon/utils';
|
|
||||||
|
|
||||||
// Internal stories should only be visible during development
|
// Internal stories should only be visible during development
|
||||||
const storyGlob =
|
const storyGlob =
|
||||||
@@ -12,17 +10,8 @@ const storyGlob =
|
|||||||
|
|
||||||
const stories = ['../src/Intro.mdx', storyGlob];
|
const stories = ['../src/Intro.mdx', storyGlob];
|
||||||
|
|
||||||
// We limit icon paths to only the available icons so publishing
|
// Copy the assets required by storybook before starting the storybook server.
|
||||||
// doesn't require uploading 1000s of unused assets.
|
copyAssetsSync();
|
||||||
const iconPaths = Object.keys(availableIconsIndex)
|
|
||||||
.filter((iconName) => !iconName.startsWith('fa '))
|
|
||||||
.map((iconName) => {
|
|
||||||
const subDir = getIconSubDir(iconName as IconName, 'default');
|
|
||||||
return {
|
|
||||||
from: `../../../public/img/icons/${subDir}/${iconName}.svg`,
|
|
||||||
to: `/public/img/icons/${subDir}/${iconName}.svg`,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
const mainConfig: StorybookConfig = {
|
const mainConfig: StorybookConfig = {
|
||||||
stories,
|
stories,
|
||||||
@@ -45,17 +34,18 @@ const mainConfig: StorybookConfig = {
|
|||||||
url: false,
|
url: false,
|
||||||
importLoaders: 2,
|
importLoaders: 2,
|
||||||
},
|
},
|
||||||
|
sassLoaderOptions: {
|
||||||
|
sassOptions: {
|
||||||
|
// silencing these warnings since we're planning to remove sass when angular is gone
|
||||||
|
silenceDeprecations: ['import', 'global-builtin'],
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
getAbsolutePath('@storybook/addon-storysource'),
|
getAbsolutePath('@storybook/addon-storysource'),
|
||||||
getAbsolutePath('storybook-dark-mode'),
|
getAbsolutePath('storybook-dark-mode'),
|
||||||
getAbsolutePath('@storybook/addon-mdx-gfm'),
|
|
||||||
getAbsolutePath('@storybook/addon-webpack5-compiler-swc'),
|
getAbsolutePath('@storybook/addon-webpack5-compiler-swc'),
|
||||||
],
|
],
|
||||||
core: {},
|
|
||||||
docs: {
|
|
||||||
autodocs: true,
|
|
||||||
},
|
|
||||||
framework: {
|
framework: {
|
||||||
name: getAbsolutePath('@storybook/react-webpack5'),
|
name: getAbsolutePath('@storybook/react-webpack5'),
|
||||||
options: {
|
options: {
|
||||||
@@ -66,29 +56,7 @@ const mainConfig: StorybookConfig = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
logLevel: 'debug',
|
logLevel: 'debug',
|
||||||
staticDirs: [
|
staticDirs: ['static'],
|
||||||
{
|
|
||||||
from: '../../../public/fonts',
|
|
||||||
to: '/public/fonts',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
from: '../../../public/img/grafana_text_logo-dark.svg',
|
|
||||||
to: '/public/img/grafana_text_logo-dark.svg',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
from: '../../../public/img/grafana_text_logo-light.svg',
|
|
||||||
to: '/public/img/grafana_text_logo-light.svg',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
from: '../../../public/img/fav32.png',
|
|
||||||
to: '/public/img/fav32.png',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
from: '../../../public/lib',
|
|
||||||
to: '/public/lib',
|
|
||||||
},
|
|
||||||
...iconPaths,
|
|
||||||
],
|
|
||||||
typescript: {
|
typescript: {
|
||||||
check: true,
|
check: true,
|
||||||
reactDocgen: 'react-docgen-typescript',
|
reactDocgen: 'react-docgen-typescript',
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ const preview: Preview = {
|
|||||||
knobs: {
|
knobs: {
|
||||||
disable: true,
|
disable: true,
|
||||||
},
|
},
|
||||||
layout: 'fullscreen',
|
|
||||||
options: {
|
options: {
|
||||||
// Sort stories first by Docs Overview, then alphabetically
|
// Sort stories first by Docs Overview, then alphabetically
|
||||||
// We should be able to use the builtin alphabetical sort, but is broken in SB 7.0
|
// We should be able to use the builtin alphabetical sort, but is broken in SB 7.0
|
||||||
@@ -83,6 +82,7 @@ const preview: Preview = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
tags: ['autodocs'],
|
||||||
};
|
};
|
||||||
|
|
||||||
export default preview;
|
export default preview;
|
||||||
@@ -118,22 +118,22 @@
|
|||||||
"@faker-js/faker": "^9.0.0",
|
"@faker-js/faker": "^9.0.0",
|
||||||
"@grafana/tsconfig": "^2.0.0",
|
"@grafana/tsconfig": "^2.0.0",
|
||||||
"@rollup/plugin-node-resolve": "15.3.0",
|
"@rollup/plugin-node-resolve": "15.3.0",
|
||||||
"@storybook/addon-a11y": "^8.1.6",
|
"@storybook/addon-a11y": "^8.4.2",
|
||||||
"@storybook/addon-actions": "^8.1.6",
|
"@storybook/addon-actions": "^8.4.2",
|
||||||
"@storybook/addon-docs": "^8.1.6",
|
"@storybook/addon-docs": "^8.4.2",
|
||||||
"@storybook/addon-essentials": "^8.1.6",
|
"@storybook/addon-essentials": "^8.4.2",
|
||||||
"@storybook/addon-mdx-gfm": "^8.1.6",
|
"@storybook/addon-storysource": "^8.4.2",
|
||||||
"@storybook/addon-storysource": "^8.1.6",
|
"@storybook/addon-webpack5-compiler-swc": "^1.0.5",
|
||||||
"@storybook/addon-webpack5-compiler-swc": "^1.0.2",
|
"@storybook/blocks": "^8.4.2",
|
||||||
"@storybook/blocks": "patch:@storybook/blocks@npm%3A8.1.6#~/.yarn/patches/@storybook-blocks-npm-8.1.6-892f57a6d7.patch",
|
"@storybook/components": "^8.4.2",
|
||||||
"@storybook/components": "^8.1.6",
|
"@storybook/core-events": "^8.4.2",
|
||||||
"@storybook/core-events": "^8.1.6",
|
"@storybook/manager-api": "^8.4.2",
|
||||||
"@storybook/mdx2-csf": "1.1.0",
|
"@storybook/mdx2-csf": "1.1.0",
|
||||||
"@storybook/preset-scss": "1.0.3",
|
"@storybook/preset-scss": "1.0.3",
|
||||||
"@storybook/preview-api": "^8.1.6",
|
"@storybook/preview-api": "^8.4.2",
|
||||||
"@storybook/react": "^8.1.6",
|
"@storybook/react": "^8.4.2",
|
||||||
"@storybook/react-webpack5": "^8.1.6",
|
"@storybook/react-webpack5": "^8.4.2",
|
||||||
"@storybook/theming": "^8.1.6",
|
"@storybook/theming": "^8.4.2",
|
||||||
"@testing-library/dom": "10.4.0",
|
"@testing-library/dom": "10.4.0",
|
||||||
"@testing-library/jest-dom": "6.6.3",
|
"@testing-library/jest-dom": "6.6.3",
|
||||||
"@testing-library/react": "16.0.1",
|
"@testing-library/react": "16.0.1",
|
||||||
@@ -166,6 +166,7 @@
|
|||||||
"csstype": "3.1.3",
|
"csstype": "3.1.3",
|
||||||
"esbuild": "0.24.0",
|
"esbuild": "0.24.0",
|
||||||
"expose-loader": "5.0.0",
|
"expose-loader": "5.0.0",
|
||||||
|
"fs-extra": "^11.2.0",
|
||||||
"mock-raf": "1.0.1",
|
"mock-raf": "1.0.1",
|
||||||
"process": "^0.11.10",
|
"process": "^0.11.10",
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
@@ -180,8 +181,8 @@
|
|||||||
"rollup-plugin-node-externals": "^7.1.3",
|
"rollup-plugin-node-externals": "^7.1.3",
|
||||||
"rollup-plugin-svg-import": "3.0.0",
|
"rollup-plugin-svg-import": "3.0.0",
|
||||||
"sass-loader": "16.0.3",
|
"sass-loader": "16.0.3",
|
||||||
"storybook": "^8.1.6",
|
"storybook": "^8.4.2",
|
||||||
"storybook-dark-mode": "^4.0.1",
|
"storybook-dark-mode": "4.0.1",
|
||||||
"style-loader": "4.0.0",
|
"style-loader": "4.0.0",
|
||||||
"typescript": "5.5.4",
|
"typescript": "5.5.4",
|
||||||
"webpack": "5.95.0"
|
"webpack": "5.95.0"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Preview, ArgTypes } from '@storybook/blocks';
|
import { Canvas, ArgTypes } from '@storybook/blocks';
|
||||||
import { AutoSaveField } from './AutoSaveField';
|
import { AutoSaveField } from './AutoSaveField';
|
||||||
import { Basic } from './AutoSaveField.story.tsx';
|
import * as AutoSaveFieldStories from './AutoSaveField.story';
|
||||||
|
|
||||||
# AutoSaveField
|
# AutoSaveField
|
||||||
|
|
||||||
@@ -217,9 +217,7 @@ The `AutoSaveField`component is comprised of:
|
|||||||
|
|
||||||
{' '}
|
{' '}
|
||||||
|
|
||||||
<Preview>
|
<Canvas of={AutoSaveFieldStories.Basic} />
|
||||||
<Basic />
|
|
||||||
</Preview>
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
### Placement
|
### Placement
|
||||||
|
|||||||
@@ -1,15 +1,12 @@
|
|||||||
import { Meta, Preview, ArgTypes } from '@storybook/blocks';
|
import { Meta, Canvas, ArgTypes, Unstyled } from '@storybook/blocks';
|
||||||
import { Button, LinkButton } from './Button';
|
import { Button, LinkButton } from './Button';
|
||||||
import { Alert } from '../Alert/Alert';
|
import { Alert } from '../Alert/Alert';
|
||||||
|
import { ExampleFrame } from '../../utils/storybook/ExampleFrame';
|
||||||
|
|
||||||
<Meta title="MDX|Button" component={Button} />
|
<Meta title="MDX|Button" component={Button} />
|
||||||
|
|
||||||
# Button
|
# Button
|
||||||
|
|
||||||
<Alert severity="warning" title={'Please note:'}>
|
|
||||||
After reviewing this component we are asking you to use the IconButton when you require a button with only an icon.
|
|
||||||
</Alert>
|
|
||||||
|
|
||||||
When using a button please always follow a11y rules (e.g. W3C Recommendation [3.3.2 Labels or instructions](https://www.w3.org/TR/WCAG21/#labels-or-instructions)) and make sure the context in which the button is located is also communicated by screen readers.
|
When using a button please always follow a11y rules (e.g. W3C Recommendation [3.3.2 Labels or instructions](https://www.w3.org/TR/WCAG21/#labels-or-instructions)) and make sure the context in which the button is located is also communicated by screen readers.
|
||||||
|
|
||||||
## Primary
|
## Primary
|
||||||
@@ -18,19 +15,17 @@ Used for "call to action", i.e. triggering the main action. There should never b
|
|||||||
|
|
||||||
If there is no primary action, all `Button` components should be secondary.
|
If there is no primary action, all `Button` components should be secondary.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<div>
|
<Button variant="primary" size="sm" style={{ margin: '5px' }}>
|
||||||
<Button variant="primary" size="sm" style={{ margin: '5px' }}>
|
{'Small'}
|
||||||
{'Small'}
|
</Button>
|
||||||
</Button>
|
<Button variant="primary" size="md" style={{ margin: '5px' }}>
|
||||||
<Button variant="primary" size="md" style={{ margin: '5px' }}>
|
{'Medium'}
|
||||||
{'Medium'}
|
</Button>
|
||||||
</Button>
|
<Button variant="primary" size="lg" style={{ margin: '5px' }}>
|
||||||
<Button variant="primary" size="lg" style={{ margin: '5px' }}>
|
{'Large'}
|
||||||
{'Large'}
|
</Button>
|
||||||
</Button>
|
</ExampleFrame>
|
||||||
</div>
|
|
||||||
</Preview>
|
|
||||||
|
|
||||||
## Secondary
|
## Secondary
|
||||||
|
|
||||||
@@ -39,70 +34,64 @@ The secondary `Button` is the default button style and can trigger various actio
|
|||||||
1. When next to the primary `Button`, the Secondary style can for example be used for "Cancel" or "Abort" actions.
|
1. When next to the primary `Button`, the Secondary style can for example be used for "Cancel" or "Abort" actions.
|
||||||
2. When there is no main important action on a given page, all `Button` components should use the secondary style.
|
2. When there is no main important action on a given page, all `Button` components should use the secondary style.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<div>
|
<Button variant="secondary" size="sm" style={{ margin: '5px' }}>
|
||||||
<Button variant="secondary" size="sm" style={{ margin: '5px' }}>
|
{'Small'}
|
||||||
{'Small'}
|
</Button>
|
||||||
</Button>
|
<Button variant="secondary" size="md" style={{ margin: '5px' }}>
|
||||||
<Button variant="secondary" size="md" style={{ margin: '5px' }}>
|
{'Medium'}
|
||||||
{'Medium'}
|
</Button>
|
||||||
</Button>
|
<Button variant="secondary" size="lg" style={{ margin: '5px' }}>
|
||||||
<Button variant="secondary" size="lg" style={{ margin: '5px' }}>
|
{'Large'}
|
||||||
{'Large'}
|
</Button>
|
||||||
</Button>
|
</ExampleFrame>
|
||||||
</div>
|
|
||||||
</Preview>
|
|
||||||
|
|
||||||
## Destructive
|
## Destructive
|
||||||
|
|
||||||
Used for triggering a removing or deleting action. Because of its dominant coloring, it should be used sparingly. If you need multiple Destructive `Button` components in one view, we recommend using a secondary `Button` or Link variant instead and only use the Destructive variant to double confirm.
|
Used for triggering a removing or deleting action. Because of its dominant coloring, it should be used sparingly. If you need multiple Destructive `Button` components in one view, we recommend using a secondary `Button` or Link variant instead and only use the Destructive variant to double confirm.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<div>
|
<Button variant="destructive" size="sm" style={{ margin: '5px' }}>
|
||||||
<Button variant="destructive" size="sm" style={{ margin: '5px' }}>
|
{'Small'}
|
||||||
{'Small'}
|
</Button>
|
||||||
</Button>
|
<Button variant="destructive" size="md" style={{ margin: '5px' }}>
|
||||||
<Button variant="destructive" size="md" style={{ margin: '5px' }}>
|
{'Medium'}
|
||||||
{'Medium'}
|
</Button>
|
||||||
</Button>
|
<Button variant="destructive" size="lg" style={{ margin: '5px' }}>
|
||||||
<Button variant="destructive" size="lg" style={{ margin: '5px' }}>
|
{'Large'}
|
||||||
{'Large'}
|
</Button>
|
||||||
</Button>
|
</ExampleFrame>
|
||||||
</div>
|
|
||||||
</Preview>
|
|
||||||
|
|
||||||
## Text
|
## Text
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<div>
|
<Button fill="text" size="sm" style={{ margin: '5px' }}>
|
||||||
<Button fill="text" size="sm" style={{ margin: '5px' }}>
|
{'Small'}
|
||||||
{'Small'}
|
</Button>
|
||||||
</Button>
|
<Button fill="text" size="md" style={{ margin: '5px' }}>
|
||||||
<Button fill="text" size="md" style={{ margin: '5px' }}>
|
{'Medium'}
|
||||||
{'Medium'}
|
</Button>
|
||||||
</Button>
|
<Button fill="text" size="lg" style={{ margin: '5px' }}>
|
||||||
<Button fill="text" size="lg" style={{ margin: '5px' }}>
|
{'Large'}
|
||||||
{'Large'}
|
</Button>
|
||||||
</Button>
|
</ExampleFrame>
|
||||||
</div>
|
|
||||||
</Preview>
|
|
||||||
|
|
||||||
<ArgTypes of={Button} />
|
|
||||||
|
|
||||||
## Links
|
## Links
|
||||||
|
|
||||||
To add an anchor that looks like a button use the `<LinkButton>` component and pass a href prop.
|
To add an anchor that looks like a button use the `<LinkButton>` component and pass a href prop.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<div>
|
<LinkButton href="/" size="sm" style={{ margin: '5px' }}>
|
||||||
<LinkButton href="/" size="sm" style={{ margin: '5px' }}>
|
{'Small'}
|
||||||
{'Small'}
|
</LinkButton>
|
||||||
</LinkButton>
|
<LinkButton href="/" size="md" style={{ margin: '5px' }}>
|
||||||
<LinkButton href="/" size="md" style={{ margin: '5px' }}>
|
{'Medium'}
|
||||||
{'Medium'}
|
</LinkButton>
|
||||||
</LinkButton>
|
<LinkButton href="/" size="lg" style={{ margin: '5px' }}>
|
||||||
<LinkButton href="/" size="lg" style={{ margin: '5px' }}>
|
{'Large'}
|
||||||
{'Large'}
|
</LinkButton>
|
||||||
</LinkButton>
|
</ExampleFrame>
|
||||||
</div>
|
|
||||||
</Preview>
|
## Props
|
||||||
|
|
||||||
|
<ArgTypes of={Button} />
|
||||||
@@ -1,16 +1,10 @@
|
|||||||
import type { Meta, StoryObj } from '@storybook/react';
|
import type { Meta, StoryObj } from '@storybook/react';
|
||||||
|
|
||||||
import { MultiCombobox } from './MultiCombobox';
|
import { MultiCombobox } from './MultiCombobox';
|
||||||
import mdx from './MultiCombobox.mdx';
|
|
||||||
|
|
||||||
const meta: Meta<typeof MultiCombobox> = {
|
const meta: Meta<typeof MultiCombobox> = {
|
||||||
title: 'Forms/MultiCombobox',
|
title: 'Forms/MultiCombobox',
|
||||||
component: MultiCombobox,
|
component: MultiCombobox,
|
||||||
parameters: {
|
|
||||||
docs: {
|
|
||||||
page: mdx,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default meta;
|
export default meta;
|
||||||
|
|||||||
Whitespace-only changes.
+52
@@ -0,0 +1,52 @@
|
|||||||
|
import React, { createContext, useCallback, useContext } from 'react';
|
||||||
|
|
||||||
|
/** @alpha */
|
||||||
|
export interface ElementSelectionContextState {
|
||||||
|
/**
|
||||||
|
* Turn on selection mode & show selection state
|
||||||
|
*/
|
||||||
|
enabled?: boolean;
|
||||||
|
/** List of currently selected elements */
|
||||||
|
selected: ElementSelectionContextItem[];
|
||||||
|
onSelect: (item: ElementSelectionContextItem, multi?: boolean) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ElementSelectionContextItem {
|
||||||
|
id: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ElementSelectionContext = createContext<ElementSelectionContextState | undefined>(undefined);
|
||||||
|
|
||||||
|
export interface UseElementSelectionResult {
|
||||||
|
isSelected?: boolean;
|
||||||
|
isSelectable?: boolean;
|
||||||
|
onSelect?: (evt: React.PointerEvent) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useElementSelection(id: string | undefined): UseElementSelectionResult {
|
||||||
|
if (!id) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
const context = useContext(ElementSelectionContext);
|
||||||
|
if (!context) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
const isSelected = context.selected.some((item) => item.id === id);
|
||||||
|
const onSelect = useCallback<React.PointerEventHandler>(
|
||||||
|
(evt) => {
|
||||||
|
if (!context.enabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// To prevent this click form clearing the selection
|
||||||
|
evt.stopPropagation();
|
||||||
|
|
||||||
|
context.onSelect({ id }, evt.shiftKey);
|
||||||
|
},
|
||||||
|
[context, id]
|
||||||
|
);
|
||||||
|
|
||||||
|
return { isSelected, onSelect, isSelectable: context.enabled };
|
||||||
|
}
|
||||||
@@ -1,46 +1,31 @@
|
|||||||
<svg viewBox="0 0 321 171" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 321 171">
|
||||||
<ellipse cx="160.5" cy="153.5" rx="160.5" ry="17.5" fill="#9087e9" fill-opacity="0.3" />
|
<ellipse cx="160.5" cy="153.5" fill="#9087e9" fill-opacity=".3" rx="160.5" ry="17.5"/>
|
||||||
<g id="grot-cta-cactus-1" fill="#9087e9">
|
<g id="grot-cta-cactus-1" fill="#9087e9">
|
||||||
<path d="M12.496 76.3187C12.4507 76.4394 12.4205 76.5149 12.3752 76.5753C12.2998 76.681 12.2394 76.7112 12.179 76.7263C12.1488 76.7263 12.1186 76.7263 12.0884 76.7112C11.9827 76.6659 11.9374 76.6055 11.8771 76.53C11.8167 76.4394 11.7412 76.3338 11.6808 76.2281C11.5449 76.0016 11.4242 75.7299 11.3185 75.428C11.2128 75.1411 11.1373 74.8392 11.1071 74.5373C10.8656 76.5904 11.0769 78.7945 11.3034 80.8627L11.4242 81.9799C12.496 93.1664 18.7913 101.62 30.0835 107.146C30.0835 102.813 30.0835 98.2539 30.1137 93.7401C29.223 93.3928 28.3172 92.955 27.5171 92.0493C25.2828 89.5281 24.6487 85.7842 24.075 82.4932C23.9996 82.0252 23.9241 81.5723 23.8335 81.1345L23.592 79.7607C23.0183 76.4545 22.4144 73.0427 20.6783 70.4008C19.7423 68.9818 18.3082 68.1816 16.723 68.1816C15.2285 68.1816 13.7792 68.9063 12.7677 70.1593C11.9676 71.1406 11.5147 72.303 11.2581 73.556C11.2883 73.4956 11.3185 73.4201 11.3638 73.3748C11.394 73.3296 11.4543 73.2994 11.4996 73.2994C11.5449 73.2994 11.5751 73.2994 11.6053 73.3296C11.7261 73.4352 11.7865 73.5409 11.8469 73.6617C11.9072 73.7825 11.9374 73.9183 11.9827 74.0542C12.1488 74.6279 12.345 75.1713 12.5262 75.745C12.5413 75.8054 12.5564 75.896 12.5413 76.0016C12.5413 76.1677 12.5111 76.2583 12.4809 76.3489L12.496 76.3187ZM25.4941 97.2576C25.5243 97.3632 25.4941 97.4689 25.4639 97.5444C25.4035 97.6803 25.3583 97.7407 25.2979 97.7708C25.2375 97.801 25.2073 97.8161 25.1771 97.8161C24.9959 97.7105 24.9506 97.6501 24.9205 97.5142C24.8752 97.3028 24.845 97.0915 24.8299 96.8952C24.8299 96.699 24.8299 96.4876 24.8299 96.2612C24.8299 96.231 24.845 96.1857 24.8601 96.1555C24.9054 96.0951 24.9205 96.08 24.9506 96.0649C24.9808 96.0649 25.011 96.0649 25.0261 96.1253C25.1318 96.3065 25.2224 96.4876 25.2979 96.6688C25.3734 96.85 25.4337 97.0462 25.479 97.2576H25.4941ZM23.8486 87.792C23.8788 87.6713 23.8939 87.5958 23.9392 87.5505C23.9845 87.4901 24.0298 87.4599 24.0901 87.4599C24.1656 87.4599 24.2109 87.4599 24.2713 87.5203C24.6789 87.8071 24.9808 88.0638 25.2224 88.5167C25.2526 88.562 25.2677 88.6223 25.2677 88.7129C25.2677 88.8488 25.2677 88.9092 25.2677 88.9696C25.2677 88.9998 25.2677 89.03 25.2375 89.0601C25.2375 89.1054 25.2073 89.1507 25.1771 89.1809C25.0261 89.2564 24.9808 89.2564 24.9506 89.2413C24.7091 89.1356 24.5279 88.9998 24.3619 88.8337C24.1958 88.6676 24.06 88.4865 23.8939 88.2751C23.8637 88.2298 23.8335 88.1544 23.8184 88.0789C23.8184 87.9732 23.8184 87.8826 23.8184 87.8071L23.8486 87.792ZM24.1807 101.605C24.2562 101.696 24.2864 101.802 24.3015 101.922C24.3166 102.104 24.3015 102.224 24.2864 102.345C24.2411 102.496 24.1958 102.587 24.1354 102.647C24.0449 102.768 23.9694 102.798 23.8788 102.813C23.8335 102.813 23.8033 102.813 23.7731 102.813C23.6523 102.768 23.6071 102.723 23.5467 102.647C23.1844 102.164 22.8371 101.681 22.505 101.183C22.4748 101.122 22.4446 101.047 22.4446 100.956C22.4446 100.82 22.4446 100.715 22.4446 100.624C22.4748 100.473 22.505 100.383 22.5503 100.307C22.5956 100.232 22.656 100.201 22.7164 100.201C22.8069 100.201 22.8673 100.232 22.9277 100.292C23.3504 100.73 23.758 101.183 24.1656 101.651L24.1807 101.605ZM21.9313 80.3796C21.9615 80.2589 22.0219 80.1532 22.0823 80.0928C22.1125 80.0626 22.1276 80.0626 22.1578 80.0475C22.2031 80.0173 22.2635 79.9871 22.3088 79.972C22.3691 79.972 22.4144 80.0022 22.4446 80.0173C22.4748 80.0173 22.505 80.0173 22.5201 80.0475C22.5805 80.1079 22.6258 80.2136 22.6409 80.3494C22.7164 80.9835 22.8824 81.5572 23.1844 82.1157C23.2447 82.2214 23.2598 82.3422 23.2598 82.4781C23.2598 82.5082 23.2598 82.5384 23.2598 82.5686C23.2598 82.6743 23.2296 82.78 23.1994 82.8706C23.1391 83.0215 23.0787 83.1121 23.0032 83.1876C22.8824 83.2782 22.822 83.3084 22.7466 83.3235C22.6409 83.3235 22.5956 83.3084 22.5503 83.2782C22.5201 83.2782 22.505 83.2631 22.4748 83.248C22.3993 83.1876 22.3389 83.097 22.2786 82.9762C22.1729 82.7649 22.0823 82.5535 22.0219 82.3573C21.9464 82.1459 21.9011 81.9346 21.871 81.7232C21.8408 81.5119 21.8257 81.2854 21.8257 81.0741C21.8257 80.8627 21.8559 80.6363 21.9011 80.3947L21.9313 80.3796ZM20.0292 72.8163C20.0443 72.5596 20.0745 72.3181 20.1349 72.0614C20.165 71.9256 20.2254 71.8199 20.2858 71.7595C20.316 71.7293 20.3462 71.7293 20.3613 71.7142C20.4066 71.684 20.467 71.6538 20.5123 71.6387C20.5727 71.6387 20.6179 71.6689 20.6632 71.6991C20.6934 71.6991 20.7236 71.6991 20.7387 71.7293C20.7991 71.7897 20.8595 71.8954 20.8897 72.0313C20.9954 72.5294 21.0105 73.0276 21.0255 73.5409C21.0255 73.6617 21.0255 73.7674 20.9803 73.8579C20.9803 73.8881 20.9501 73.9183 20.935 73.9334C20.9048 73.9787 20.8897 74.0391 20.8595 74.0844C20.8444 74.1146 20.8142 74.1146 20.784 74.1448C20.7538 74.175 20.7236 74.2052 20.6934 74.2203C20.6632 74.2203 20.633 74.2203 20.6179 74.2354C20.5878 74.2354 20.5425 74.2655 20.5123 74.2655C20.467 74.2655 20.4368 74.2655 20.4066 74.2504C20.3764 74.2504 20.3462 74.2504 20.3311 74.2354C20.3009 74.2203 20.2707 74.1901 20.2405 74.1599C20.2254 74.1448 20.1952 74.1297 20.1801 74.0995C20.15 74.0542 20.1349 74.0089 20.1047 73.96Line truncated
|
<path d="m12.5 76.3-.1.3-.2.1H12c-.1 0-.2 0-.2-.2l-.2-.3a4.4 4.4 0 0 1-.6-1.7c-.2 2 0 4.3.2 6.4l.1 1c1.1 11.3 7.4 19.7 18.7 25.2V93.7c-.9-.3-1.8-.7-2.6-1.7-2.2-2.5-2.9-6.2-3.4-9.5l-.3-1.4-.2-1.3c-.6-3.3-1.2-6.8-3-9.4a4.7 4.7 0 0 0-3.9-2.2c-1.5 0-3 .7-4 2-.7 1-1.2 2.1-1.4 3.4v-.2l.2-.1h.1l.2.4.2.4.5 1.6v.6Zm13 21v.2l-.2.3h-.1c-.2 0-.2-.1-.3-.3V96.1h.1a4.6 4.6 0 0 1 .5 1.2Zm-1.7-9.5.1-.2.2-.1h.2l1 1v.5l-.1.2H25c-.3 0-.5-.2-.6-.4l-.5-.5v-.5Zm.4 13.8.1.3v.4c0 .2-.1.3-.2.3 0 .2-.1.2-.2.2h-.1c-.1 0-.2 0-.3-.2a32.3 32.3 0 0 1-1-1.6v-.7l.2-.1h.2l1.3 1.5Zm-2.3-21.2.2-.3.2-.1h.2l.1.3c.1.7.3 1.3.6 1.8v.4a1 1 0 0 1-.2.7l-.3.1h-.2l-.2-.3a4.2 4.2 0 0 1-.5-2l.1-.6ZM20 72.8l.1-.7c0-.2.1-.3.2-.3l.2-.2.2.1.2.3.1 1.5v.4l-.1.2h-.1l-.1.1h-.4l-.1-.1-.1-.1V72.8Zm-.7 17.3.3-.2h.1l1.1.4h.2v.3h.1v.6l-.1.2h-.4c-.3 0-.7-.2-1-.4-.2 0-.2-.2-.3-.3v-.6Zm-2.5-10.6v-.2l.2-.2h.2l.2.1.3.5.3.5.1.3v.3l-.2.3-.3.1h-.1a.8.8 0 0 1-.3-.3l-.4-1v-.3Zm0 14v.7h-.1l-.2.2c-.5 0-.7-.2-1.1-.5l-.2-.3V93l.3-.2h.2l.5.2.4.4.2.3Zm-1.6-24.4V69c0-.2.1-.2.2-.3H15.7l.3.3.2.6.1.3v.4l-.3.3-.2.1h-.2v-.1l-.3-.4-.1-.7v-.3ZM14 82.8s0-.2.2-.3h.2c0-.1.1 0 .1 0 .2 0 .2 0 .3.2l.2.5.2 1.8v.4l-.2.2-.1.2H14.3a.8.8 0 0 1-.2-.5L14 84v-1.2ZM60.2 62c0-20.3-7-23-14-23s-14 2.7-14 23l-.2 8.3c-.2 17.3-.7 53.5.5 60 2.6 14.1 7.7 14.1 11.7 14.1H48c4.1 0 9.2 0 11.9-14.3 1.1-6.4.7-42.5.4-59.8V62Zm-26.7-3.4.3-.4h.4l.1.3v.8l-.3.3-.1.3-.1.3-.2.1h-.1a.4.4 0 0 1-.2-.3c-.2-.5 0-1 .2-1.4Zm-.4 40H33l-.2.1h-.1l-.2-.1V98a16.4 16.4 0 0 1 .6-2.4c0-.1 0-.2.2-.2l.1-.1h.2l.2.2v.6l-.2 1.2-.5 1.1Zm0-21c0 .2-.1.2-.2.2h-.1l-.1-.2v-.4a11 11 0 0 1 .7-1.7h.2l.2.3v.5a10.3 10.3 0 0 1-.7 1.4Zm.5 40.1.2-.2H34l.2.2v.5c0 .4-.2.7-.3 1l-.4 1.1-.1.2-.2.1h-.2l-.1-.3v-.2c-.1-.2-.1-.3 0-.4l.2-1 .4-1Zm-1.2-51.3v-.3h.4c.5.5 1 .8 1.3 1.4V68.4l-.3.2-.2-.1c-.5-.5-.8-1-1.2-1.6v-.5Zm-.4 19v-.2l.2-.2.2-.1h.1a28.7 28.7 0 0 1 1 2.1v.3l-.2.3-.2.1h-.2a.6.6 0 0 1-.2-.3l-.7-1.6v-.3Zm0 22.2V107.3h.3l1.1 1.4.1.4v.4l-.2.4-.2.1h-.2a.6.6 0 0 1-.3-.3l-.7-1.9v-.2Zm2.4 21.9-.2.3-.2.1-.4-.1-1.2-1.8V127.4H32.7l.8.7.7.7.2.3v.4Zm.3-77.7-.1.2-.2.2-.3.1-.2-.1a.7.7 0 0 1-.2-.4l-.2-1.4v-.2l.2-.1.1-.2H34.1l.2.2.4 1.2v.4Zm1.5 86.2v.3l-.3.2h-.2l-.1-.2-.2-.2v-.3l-.1-1 .1-.6.4-.2.2.1h.1l.2.6v1.3Zm7.4-30.5.5-1.5c0-.2.1-.2.2-.3h.4l.2.3.1.3v.5l-.8 1.8-.2.1h-.2a.7.7 0 0 1-.3-.4v-.3l.1-.5ZM43 81.2h.2l.1.4v.7l-.9 1.2-.1.3H42a.4.4 0 0 1-.2-.2l-.1-.4c0-.3 0-.8.3-1.2.1-.3.4-.7.8-.8h.1ZM41.5 70l-.2-.1-.2-.3V69a9.5 9.5 0 0 1 1-1.6l.2-.2.3.1.1.3.1.4v.3l-1 1.6-.3.1Zm0-19.7.4-.7.2-.2h.4l.2.2.1.3V50.8l-.7.8h-.6v-.1l-.2-.3V51l.2-.8ZM40 42v-.2l.2-.1.1-.1h.1l.2.2.6 1.2v.8l-.2.3h-.5c-.2-.1-.2-.3-.3-.4v-.8l-.2-.7V42Zm-.4 15.5c0-.2.1-.3.2-.3l.2-.2h.2l.2.3.5.8.1.4v.5l-.2.4-.3.2a.5.5 0 0 1-.3-.3c-.4-.4-.5-.8-.6-1.3v-.5Zm1.8 52c0 .2-.1.2-.2.3l-.2.2c-.2 0-.3-.1-.3-.2l-.7-1V108h.4a21.9 21.9 0 0 1 1 1.2v.4Zm-2.8-34.7v-.3l.1-.3h.5l1.3 1.5.1.1v1l-.2.2H40a4 4 0 0 1-1.4-2v-.3ZM39.7 91l-.8-1.2v-1l.2-.1h.2l1 1.2.2.3v.5l-.2.3-.3.1-.3-.1Zm0 24.9v-.5l.2-.2.1-.1.3.1 1.2 1.6.1.4v.5l-.2.3-.2.2H41a.6.6 0 0 1-.2-.3l-.5-1-.5-1Zm2.1 13-.1.2-.3.2c-.2 0-.2-.1-.3-.2 0-.2-.2-.3-.3-.5l-.3-.5v-.9h.4l.8 1 .1.2v.4Zm.8-29.7c-.2.7-.5 1.2-1 1.6l-.2.2-.2-.2v-.3l-.1-.3v-.3l.4-.8.6-.6.2-.1h.2l.1.3v.5Zm1.2 39.1a24.8 24.8 0 0 0-.5 1h-.2l-.1-.2-.1-.3v-.2l.5-.9.1-.1h.2l.1.2v.5Zm.7-8.2-.4 2.2c0 .2-.1.3-.2.3l-.2.1h-.1l-.2-.1v-.2c-.1-.2-.1-.3 0-.4l.3-2.2c0-.2.1-.3.2-.3l.2-.2.2.1.1.1.1.2v.4Zm.7-10.4-.5 1.6v.4H44l-.1-.2-.1-.3V120c.1-.5.3-1 .7-1.3h.4l.1.3v.6Zm7.2-41 .1-.3.3-.1h.2l.2.2v.2l.1.1v.3c0 .5-.2 1-.3 1.4l-.1.3h-.4l-.1-.1-.2-.2V80l.2-1.3Zm-.2 15.9H52a.7.7 0 0 1-.3-.4v-.4a19.9 19.9 0 0 1 .7-2.9H52.7l.2.2.1.3v.3a22.1 22.1 0 0 1-.6 2.7c0 .2-.1.2-.2.2Zm-.5-28.4a1.9 1.9 0 0 0 .2.2v.2l.1.4c0 .3 0 .6-.2 1l-.1.1h-.3l-.1-.3c-.2-.3-.2-.6-.2-1v-.5l.2-.1h.4ZM50.9 50h.4l.2.4v.8c-.4.5-.7 1-.8 1.5l-.1.2h-.4l-.1-.2-.1-.3c0-.8.2-1.6.7-2.3l.2-.1ZM49 59v-.2l.3-.1h.2l.7 1v.8l-.2.1-.3-.1-.7-1V59Zm0 14.3.2-.3h.5l.6.7v.8l-.1.4-.3.2h-.1a.6.6 0 0 1-.3-.3l-.4-.9V73.3Zm.6-32.7.2-.5.5-.3h.1l.2.1.1.3v.4l-.2.2-.1.1-.1.2-.2.3h-.4l-.1-.4v-.4Zm-1 3.8a.9.9 0 0 1 .3-.5l.1-.2.3.2a66.8 66.8 0 0 1 .8 1.8v.3l-.2.3h-.4a.5.5 0 0 1-.2-.2l-.6-1.4v-.3Zm-.1 40.8v-.4l.2-.3c.1-.2.2-.2.3-.2l.3.1c.6.7 1 1.3 1 2.2v.3l-.1.1-.1.2H50l-.2.2h-.4L49 87c-.3-.4-.5-1-.6-1.5v-.3Zm.4 13.9v-.6l.3-.2h.3l1.4 1.3.1.2v1.1l-.2.2h-.2l-.2-.1-1.4-1.6-.1-.3Zm.1 14.4v-.8l.2-.2h.2l1 .8.2.2V114.5l-.1.2-.2.1H50a.7.7 0 0 1-.3-.1l-.4-.6-.4-.5Zm.5 14.2a1.2 1.2 0 0 1 .2-.6h.4l1 1.5v.8c0 .2-.1.3-.2.3l-.3.2h-.2v-.1l-.3-.3a6.1 6.1 0 0 1-.6-1.6v-.2Zm1.6 13.4v.2l-.1.2-.2.2h-.5c-.5-.4-.7-1-.8-1.7v-.2l.2-.2.2-.1.3.1.6.6.2.2v.7h.1Zm.8-6c0 .4-.2.8-.4 1.2l-.2.1h-.1l-.2-.2v-1.5l.2-.3.2-.2h.2l.2.2v.3l.1.3Zm1.4-15.6-.1.3a3 3 0 0 0-.7 1.5l-.1.3H52v-.1l-.2-.3v-.6l.7-1.7.2-.2h.1l.2.1a1 1 0 0 1 .3.6v.1Zm.2-13.8a34 34 0 0 0-1.2 2.7h-.2l-.2-.2v-.2c0-.1-.1-.2 0-.2 0-.9.2-1.6.5-2.4l.4-.7.1-.2H53.2l.3.2v.2c.2.3 0 .6 0 .9ZM59 57h.2l.2.1.1.3v.5l-.1.3-.2.2v.6l-.1.2H58.8a.5.5 0 0 1-.2-.2l-.2-.5V58c0-.4.3-.8.7-1Zm-1.5 21.3c.2-.5.4-1 .8-1.4h.4v.3l.1.3-.3.9-.4.8-.1.1h-.3l-.2-.3v-.7Zm0 9.3v-.4h.5a6.4 6.4 0 0 1 1 1.3v.5lLine truncated
|
||||||
<path d="M60.248 62.0524C60.248 41.7325 53.1375 39 46.178 39C39.2185 39 32.1081 41.7325 32.1081 62.0524C32.1081 63.3205 32.0628 66.2794 32.0175 70.28C31.791 87.641 31.3231 123.752 32.5157 130.274C35.1274 144.449 40.1545 144.449 44.1853 144.449H48.0349C52.1261 144.449 57.2287 144.449 59.8555 130.138C61.0481 123.661 60.565 87.6259 60.3386 70.3102C60.2782 66.2794 60.248 63.3054 60.248 62.0373V62.0524ZM33.4517 58.6104C33.5422 58.4745 33.6479 58.3387 33.7687 58.2179C33.8291 58.1575 33.9046 58.1273 33.9649 58.1273C34.0857 58.1424 34.1461 58.1877 34.2065 58.2481C34.282 58.3387 34.3122 58.4443 34.3424 58.55C34.3726 58.7161 34.3877 58.8368 34.3726 58.9425C34.3273 59.1086 34.2971 59.1992 34.2065 59.2595L34.0404 59.5615L33.8744 59.8634C33.8744 59.9842 33.8291 60.0899 33.7687 60.1804C33.663 60.271 33.6177 60.3012 33.5724 60.3163C33.5121 60.3314 33.4819 60.3163 33.4517 60.3012C33.3309 60.2257 33.2856 60.1502 33.2554 60.0144C33.1346 59.5011 33.2101 59.0331 33.4668 58.6255L33.4517 58.6104ZM33.0893 98.5105C33.0592 98.586 33.0139 98.6464 32.9686 98.6766C32.8931 98.7219 32.8629 98.737 32.8327 98.737C32.7572 98.737 32.7119 98.7219 32.6817 98.6917C32.6214 98.6464 32.5761 98.6011 32.5459 98.5558C32.5006 98.4652 32.4855 98.42 32.4704 98.3747C32.4553 98.2539 32.4402 98.1935 32.4553 98.118C32.5308 97.6953 32.6063 97.2877 32.7119 96.8801C32.8176 96.4725 32.9384 96.08 33.1044 95.6875C33.1497 95.5818 33.195 95.5214 33.2554 95.461C33.346 95.4006 33.3762 95.3855 33.4215 95.3855C33.5271 95.3855 33.5724 95.4006 33.6177 95.4459C33.7083 95.5063 33.7536 95.5667 33.7838 95.6271C33.8442 95.7328 33.8593 95.7932 33.8744 95.8535C33.9046 96.0045 33.9046 96.0951 33.8895 96.1706C33.7989 96.5782 33.6932 96.9707 33.5573 97.3632C33.4215 97.7406 33.2554 98.118 33.0893 98.5105ZM33.0893 77.6924C33.029 77.783 32.9686 77.8283 32.9082 77.8283C32.8478 77.8283 32.8025 77.8132 32.7723 77.7679C32.7119 77.6924 32.6968 77.6471 32.6666 77.6018C32.6365 77.5263 32.6214 77.466 32.6214 77.3905C32.6214 77.2848 32.6214 77.2244 32.6214 77.1791C32.8025 76.6508 33.0139 76.1677 33.2705 75.6695C33.3007 75.6091 33.3309 75.5638 33.3762 75.5336C33.5422 75.5034 33.5875 75.5336 33.6328 75.5789C33.7083 75.6695 33.7536 75.7148 33.7838 75.7903C33.8291 75.8808 33.8442 75.9563 33.8593 76.0318C33.8593 76.1677 33.8593 76.2431 33.8442 76.3035C33.7385 76.5451 33.6177 76.7866 33.497 77.0131C33.3762 77.2546 33.2403 77.4811 33.0893 77.7075V77.6924ZM33.6026 117.728C33.6479 117.638 33.6932 117.577 33.7536 117.532C33.8442 117.472 33.8744 117.457 33.9197 117.457C34.0253 117.457 34.0706 117.472 34.1159 117.502C34.1914 117.547 34.2367 117.608 34.2669 117.668C34.3122 117.774 34.3424 117.819 34.3424 117.879C34.3726 118.03 34.3726 118.106 34.3424 118.181C34.2518 118.559 34.131 118.921 34.0102 119.268C33.8895 119.615 33.7385 119.978 33.6026 120.325C33.5573 120.431 33.5121 120.491 33.4668 120.536C33.3913 120.582 33.3611 120.612 33.3309 120.612C33.2403 120.612 33.195 120.582 33.1497 120.551C33.0592 120.476 33.0139 120.4 32.9837 120.325C32.9384 120.219 32.9233 120.144 32.9082 120.068C32.8931 119.902 32.8931 119.827 32.9082 119.736C33.0139 119.389 33.1044 119.042 33.2101 118.71C33.3158 118.378 33.4366 118.03 33.5875 117.713L33.6026 117.728ZM32.3647 66.4304C32.3949 66.2945 32.4251 66.204 32.4704 66.1436C32.5157 66.0832 32.561 66.053 32.6214 66.0379C32.7119 66.0379 32.7572 66.053 32.8176 66.1134C33.2554 66.5512 33.7234 66.9437 34.0706 67.457C34.1159 67.5173 34.131 67.6079 34.1461 67.7136C34.1461 67.8646 34.1461 67.9853 34.1461 68.091C34.1159 68.2571 34.0857 68.3628 34.0253 68.4382C33.98 68.5137 33.9197 68.5439 33.8442 68.559C33.7385 68.559 33.6781 68.5288 33.6026 68.4684C33.1346 68.0306 32.8025 67.4721 32.4402 66.9437C32.41 66.8984 32.3949 66.8078 32.3798 66.7323C32.3798 66.5965 32.3798 66.5059 32.3798 66.4153L32.3647 66.4304ZM32.0024 85.452C32.0024 85.3765 32.0326 85.286 32.0628 85.2256C32.1081 85.1048 32.1534 85.0293 32.2138 84.984C32.3043 84.9086 32.3496 84.8935 32.3949 84.8784C32.4704 84.8784 32.5006 84.8784 32.5459 84.9086C32.6516 84.984 32.6968 85.0595 32.7421 85.1501C32.9837 85.6634 33.2252 86.1767 33.4366 86.705C33.4819 86.7956 33.4819 86.9013 33.4819 87.007C33.4668 87.173 33.4517 87.2636 33.4215 87.3391C33.3762 87.475 33.3158 87.5504 33.2554 87.5957C33.1648 87.6712 33.1044 87.7014 33.0592 87.7014C32.9686 87.7014 32.9384 87.6863 32.9082 87.6561C32.8025 87.5806 32.7421 87.5052 32.6968 87.3995C32.4704 86.8711 32.259 86.3276 32.0477 85.7992C32.0175 85.7087 32.0024 85.6181 32.0024 85.5275C32.0024 85.4973 32.0024 85.4822 32.0024 85.452ZM31.9118 107.644C31.942 107.523 31.9571 107.493 31.9722 107.433C32.0326 107.327 32.0628 107.312 32.093 107.282C32.2138 107.236 32.259 107.267 32.3194 107.312C32.7421 107.75 33.0743 108.218 33.4064 108.731C33.4819 108.837 33.5121 108.972 33.5271 109.108C33.5271 109.138 33.5271 109.169 33.5271 109.199C33.5271 109.32 33.5271 109.44 33.4819 109.546C33.4366 109.682 33.3762 109.788 33.3158 109.863C33.195 109.969 33.1346 110.014 33.0592 110.014C32.9837 110.014 32.9384 109.99Line truncated
|
|
||||||
<path d="M63.1768 78.145C63.0711 78.3262 63.0107 78.5073 62.9654 78.7036C62.6786 78.7791 62.3918 78.8395 62.0898 78.8999C62.1351 83.0967 62.1955 87.7313 62.2257 92.4565C63.1919 92.4565 64.2788 92.2301 65.4262 91.8074C65.4262 91.7923 65.396 91.7319 65.3658 91.6715C65.3658 91.6413 65.3356 91.6111 65.3356 91.5809C65.3054 91.4904 65.3054 91.3696 65.3054 91.2488C65.3356 90.9167 65.3507 90.7959 65.4866 90.494C65.5168 90.4185 65.562 90.3732 65.6073 90.3279C65.6828 90.2826 65.7281 90.2675 65.7583 90.2675C65.7885 90.2675 65.8187 90.2826 65.8489 90.2977C65.9395 90.343 65.9847 90.4034 66.0149 90.4789C66.1508 90.811 66.181 91.0526 66.2112 91.3998C66.2112 91.43 66.2112 91.4602 66.2112 91.4904C69.7287 90.026 72.899 87.7011 75.6012 84.6365C75.5559 84.6063 75.5107 84.5762 75.4654 84.5158C75.1785 84.1836 75.1031 83.7609 75.2087 83.3684C75.2389 83.2326 75.2993 83.1118 75.3597 82.9759C75.405 82.9004 75.4654 82.8552 75.5107 82.8401C75.6918 82.8401 75.7371 82.8702 75.7824 82.9155C75.8881 83.0363 75.9334 83.1118 75.9636 83.2024C76.0088 83.4288 76.0843 83.6553 76.1447 83.8666C76.1598 83.9421 76.1598 84.0176 76.1447 84.1082C76.1447 84.0478 76.1447 83.9874 76.1447 83.927C78.5602 81.0134 80.5831 77.511 82.0776 73.4953C82.0776 73.4651 82.1078 73.4198 82.1078 73.4047C82.1078 73.4047 82.0475 73.4349 81.9871 73.45C81.8814 73.45 81.821 73.4047 81.7757 73.3745C81.6549 73.2538 81.5946 73.1481 81.5493 72.9971C81.4436 72.6499 81.4134 72.3329 81.4134 71.9705C81.4134 71.88 81.4436 71.7894 81.4889 71.6988C81.5644 71.578 81.6248 71.5478 81.6851 71.5327C81.7757 71.5327 81.8361 71.5478 81.9116 71.6384C82.0173 71.7743 82.1078 71.8951 82.1833 72.0158C82.2588 72.1366 82.3192 72.2725 82.3796 72.4385C82.4249 72.5593 82.44 72.665 82.4249 72.7707C82.4249 72.7103 82.4249 72.6348 82.3947 72.5744C82.8476 71.2761 83.3609 69.6457 83.8288 67.8039C83.8288 67.8039 83.7534 67.7737 83.7081 67.7284C83.6326 67.6378 83.5873 67.5775 83.5571 67.502C83.5118 67.4114 83.4967 67.3208 83.4816 67.2453C83.4816 67.1095 83.4816 67.0189 83.5118 66.9585C83.6779 66.6113 83.8288 66.2792 84.0251 65.9621C84.0704 65.9017 84.1157 65.8565 84.1459 65.8263C84.3119 65.7961 84.3723 65.8263 84.4176 65.8715C84.3723 65.8263 84.3421 65.8112 84.2968 65.7961C84.5837 64.377 85.2328 60.6934 85.0064 57.1759C84.946 57.1458 84.8856 57.0854 84.8403 57.0099C84.6139 56.708 84.3874 56.406 84.1761 56.089C84.1157 55.9984 84.0855 55.8927 84.0704 55.772C84.0553 55.5757 84.0704 55.4549 84.0855 55.3493C84.1308 55.1983 84.161 55.1077 84.2214 55.0322C84.3119 54.9115 84.3874 54.8662 84.4629 54.8662C84.5082 54.8662 84.5384 54.8662 84.5686 54.8662C84.6592 54.8964 84.7044 54.9417 84.7497 54.9719C84.478 53.5528 83.9949 52.2545 83.2099 51.2883C82.2286 50.0806 80.885 49.5371 79.0432 49.6428C73.6689 49.9598 72.3706 57.9761 71.5101 63.2749C71.344 64.2864 71.193 65.2073 71.027 65.9923C69.94 71.2459 68.2039 76.5901 63.7505 78.4017C63.7203 78.2356 63.675 78.1601 63.6146 78.0997C63.675 78.1601 63.7203 78.2507 63.7203 78.3262C63.7354 78.4922 63.7807 78.6432 63.8259 78.7791C63.8712 78.9301 63.9316 79.0659 63.992 79.2169C64.0222 79.2924 64.0373 79.398 64.0373 79.5037C64.0373 79.6849 64.0071 79.7906 63.9769 79.8962C63.9316 80.017 63.8863 80.0925 63.841 80.168C63.7505 80.2736 63.6901 80.3189 63.6146 80.3189C63.5693 80.3189 63.5391 80.3189 63.5089 80.3038C63.3881 80.2585 63.3278 80.1982 63.2674 80.1227C63.1466 79.9717 63.056 79.8056 62.9956 79.6396C62.9352 79.4735 62.9051 79.3075 62.89 79.1263C62.89 78.9753 62.89 78.8093 62.9352 78.6583C62.9805 78.4621 63.0409 78.2809 63.1466 78.0997L63.1768 78.145ZM79.8283 77.9488C79.8283 77.9488 79.8283 78.0545 79.7981 78.1148C79.7981 78.145 79.7679 78.1752 79.7679 78.2054C79.7528 78.2507 79.7377 78.296 79.7075 78.3413C79.6924 78.3715 79.6622 78.3866 79.6471 78.4168C79.6169 78.447 79.5867 78.4772 79.5414 78.4923C79.5112 78.4923 79.481 78.5073 79.4509 78.5224C79.4207 78.5224 79.4056 78.5375 79.3754 78.5375C79.3452 78.5375 79.2999 78.5375 79.2546 78.5375C79.1791 78.613 79.1489 78.6583 79.1187 78.6734C79.0432 78.7036 79.0131 78.7187 78.9829 78.7187C78.9225 78.7187 78.8772 78.6885 78.8319 78.6583C78.7564 78.5828 78.7111 78.5224 78.6809 78.4621C78.6507 78.4017 78.6205 78.3262 78.6054 78.2507C78.5904 78.1299 78.5753 78.0545 78.5903 77.9941C78.6054 77.8733 78.6356 77.7676 78.6658 77.6619C78.7413 77.4657 78.8621 77.3298 79.0432 77.2392C79.1338 77.1939 79.2395 77.1638 79.3603 77.1487C79.4358 77.1487 79.481 77.1638 79.5112 77.1789C79.632 77.2392 79.6622 77.2845 79.7075 77.3298C79.7679 77.4204 79.7981 77.511 79.8132 77.5865C79.8283 77.7223 79.8434 77.7978 79.8434 77.8582C79.8434 77.8884 79.8434 77.9186 79.8434 77.9639L79.8283 77.9488ZM81.353 61.4634C81.353 61.5841 81.3681 61.7049 81.353 61.8257C81.3379 61.9766 81.3077 62.0823 81.2775 62.1578C81.0058 62.656 80.6586 63.0636 80.6888 63.6675C80.6888 63.8486 80.6435 63.9845 80.5831 64.0902C80.5529 64.1204 80.5227 64.1354 80.5076 64.1505C80.4472 64.1958 80.4019 64.2411 80.3265 64.2562C80.251 64.2713 80.2057 64.2562 80.1604 64.226C80.1302 64.226 80.1 64.226 8Line truncated
|
|
||||||
</g>
|
</g>
|
||||||
<g id="grot-cta-cactus-2" fill="#9087e9">
|
<g id="grot-cta-cactus-2" fill="#9087e9">
|
||||||
<path d="M185.199 118.399C185.239 118.849 185.289 119.299 185.349 119.759C185.479 119.789 185.539 119.819 185.609 119.829C185.659 119.849 185.689 119.879 185.699 119.929C185.699 120.009 185.699 120.039 185.699 120.069C185.669 120.139 185.659 120.159 185.639 120.179C185.559 120.219 185.539 120.209 185.529 120.189C185.479 120.129 185.419 120.069 185.359 120.029C185.379 120.039 185.389 120.059 185.399 120.069C185.679 122.009 186.169 123.919 187.209 125.639C187.059 125.669 187.039 125.979 187.189 126.029C187.289 126.069 187.389 126.099 187.489 126.129C187.979 126.779 188.499 127.409 189.139 127.979C189.579 128.369 190.669 129.269 191.989 129.949C191.959 129.969 191.929 129.989 191.889 130.019C191.829 130.069 191.809 130.169 191.819 130.249C191.799 130.159 191.819 130.059 191.889 130.019C191.939 129.989 191.969 129.959 191.999 129.939C192.029 129.919 192.069 129.899 192.119 129.879C192.139 129.879 192.159 129.869 192.179 129.869C192.229 129.869 192.269 129.909 192.299 129.949C192.339 130.019 192.349 130.069 192.359 130.129C192.739 130.319 193.129 130.459 193.529 130.569C193.559 129.869 193.589 129.219 193.579 128.669V127.419C193.559 126.839 193.559 126.249 193.549 125.669C193.139 125.549 192.759 125.379 192.419 125.159C192.409 125.119 192.389 125.079 192.369 125.059C192.389 125.089 192.419 125.129 192.429 125.179L192.449 125.249C192.449 125.249 192.449 125.329 192.449 125.369C192.429 125.429 192.419 125.459 192.409 125.479C192.369 125.529 192.349 125.539 192.319 125.549C192.269 125.549 192.239 125.539 192.199 125.489L192.159 125.439C192.159 125.439 192.109 125.359 192.099 125.309C192.099 125.239 192.099 125.209 192.109 125.169C192.129 125.109 192.159 125.069 192.179 125.049C192.219 125.019 192.239 125.009 192.269 125.009C192.249 125.009 192.229 125.009 192.219 125.029C191.039 124.149 190.309 122.599 190.059 120.419C190.009 120.399 189.979 120.379 189.949 120.349C189.899 120.269 189.879 120.219 189.879 120.169C189.879 120.029 189.889 119.929 189.939 119.799C189.959 119.749 189.979 119.719 189.999 119.689C189.989 119.429 189.959 119.199 189.949 118.929C189.919 117.759 190.009 116.169 190.099 114.629C190.179 113.299 190.249 112.039 190.249 111.059C190.249 109.549 189.719 107.149 188.319 107.149C188.049 107.149 187.739 107.239 187.409 107.399C187.369 107.369 187.349 107.359 187.329 107.339L187.399 107.379C187.459 107.419 187.489 107.459 187.509 107.509C187.529 107.599 187.539 107.639 187.529 107.689C187.519 107.759 187.489 107.799 187.459 107.829C187.409 107.879 187.379 107.889 187.349 107.899C187.309 107.899 187.289 107.899 187.269 107.879C187.209 107.829 187.189 107.789 187.169 107.729L187.139 107.619C187.139 107.619 187.139 107.569 187.139 107.539C186.979 107.619 186.819 107.719 186.649 107.849C186.169 108.199 185.859 108.679 185.659 109.139C185.629 109.099 185.589 109.079 185.559 109.079C185.599 109.079 185.639 109.099 185.669 109.159C185.719 109.219 185.759 109.289 185.799 109.359C185.849 109.439 185.869 109.509 185.869 109.579C185.869 109.599 185.869 109.619 185.869 109.639C185.869 109.689 185.869 109.729 185.849 109.769C185.849 109.789 185.839 109.809 185.829 109.819C185.809 109.859 185.789 109.879 185.759 109.909C185.689 109.969 185.649 109.979 185.609 109.989C185.549 109.989 185.509 109.959 185.479 109.919C185.419 109.829 185.389 109.759 185.379 109.649C185.379 109.719 185.399 109.779 185.419 109.829C185.369 110.009 185.329 110.179 185.309 110.319C185.149 111.249 185.059 112.269 185.019 113.359C185.029 113.319 185.049 113.289 185.099 113.279C185.129 113.279 185.159 113.279 185.179 113.279C185.219 113.279 185.239 113.289 185.299 113.319C185.349 113.339 185.379 113.379 185.399 113.429C185.429 113.499 185.429 113.549 185.419 113.599C185.399 113.669 185.389 113.709 185.359 113.749C185.329 113.789 185.299 113.809 185.259 113.819C185.199 113.819 185.169 113.799 185.139 113.759C185.099 113.709 185.079 113.679 185.069 113.649C185.049 113.619 185.039 113.579 185.019 113.529C185.019 113.509 185.019 113.489 185.019 113.479C184.969 114.969 185.019 116.609 185.179 118.439L185.199 118.399ZM192.869 128.049C192.869 128.049 192.899 127.979 192.919 127.949C192.949 127.919 192.979 127.899 192.999 127.899C193.089 127.939 193.109 127.969 193.129 128.009C193.169 128.099 193.209 128.179 193.239 128.269C193.249 128.299 193.249 128.339 193.239 128.379C193.229 128.449 193.219 128.469 193.209 128.499C193.179 128.559 193.159 128.569 193.139 128.579C193.089 128.589 193.059 128.579 193.029 128.529C192.979 128.459 192.929 128.379 192.889 128.309C192.869 128.269 192.859 128.229 192.859 128.189C192.859 128.119 192.859 128.079 192.879 128.049H192.869ZM190.119 122.739C190.259 122.699 190.339 122.709 190.419 122.709C190.479 122.709 190.509 122.739 190.529 122.779C190.559 122.829 190.559 122.869 190.559 122.919C190.549 122.989 190.529 123.029 190.509 123.059C190.479 123.099 190.449 123.129 190.419 123.129C190.399 123.129 190.379 123.129 190.359 123.099C190.289 123.019 190.219 122.949 190.139 122.889C190.109 122.759 190.109 122.759 190.109Line truncated
|
<path d="m185.2 118.4.1 1.4h.3l.1.1v.2c-.1.1-.2.1-.2 0h-.1c.3 2 .8 3.8 1.8 5.5-.1 0-.2.4 0 .4l.3.1a12.4 12.4 0 0 0 4.5 3.8l-.1.1v.2c-.1 0 0-.1 0-.2h.1l.1-.1h.2v.2l1.2.5v-4.9l-1-.5-.1-.1v.4h-.2l-.1-.2V125h.2c-1.3-.9-2-2.4-2.2-4.6h-.2V119.7l.1-.1v-.8a57.4 57.4 0 0 1 .2-7.8c0-1.6-.5-4-1.9-4l-.9.3.1.1V107.8l-.2.1-.1-.2v-.2a3.1 3.1 0 0 0-1.5 1.6h-.1l.2.3v.5H185.5l-.1-.3v.7a23 23 0 0 0-.3 3h.2l.1.1V113.7l-.1.1h-.2V113.5v5l.1-.1Zm7.7 9.6.1-.1.1.1.1.3v.2h-.2l-.1-.2V128Zm-2.8-5.3h.4v.4h-.1l-.3-.2v-.2Zm-.1 5.4v.2h-.1l-.1.1h-.1l-.1-.4v-.2h.2l.1.2v.1Zm0-13.4h-.1l-.1.1-.1-.1v-.4h.2l.1.2v.2Zm-.5-4.2h.2l.3.5v.2l-.1.2h-.1l-.2-.1a3 3 0 0 1-.1-.6v-.2Zm-.1 6.3v-.1h.2l.2.3v.4H189.5v-.3h-.1v-.2Zm-.4 7.8v-.1H189.7v.4h-.1l-.4-.1v-.2Zm-.5-16.5h.2v.4h-.1v.1h-.1v-.5Zm-.2 13.8h.2V122.5h-.2l-.1-.3v-.2Zm-.5-8.1v-.1c0-.1 0 0 .1 0h.1v.1l.1.1v.1l-.1.1-.2-.2v-.1Zm0 4.3.1-.1h.1l.1.1V118.8H187.7v-.7Zm-.5-7.7h.2l.1.2v.2l-.2.2h-.2v-.6Zm-.3 5.7c.1-.1.2 0 .2 0l.3.3v.2h-.1c0 .1 0 0-.1 0h-.1l-.1-.3v-.2Zm-.7 6.4.1-.3h.2v.7h-.1c-.2 0-.2 0-.2-.2v-.2Zm-1-6.6v-.1h.2l.2.1v.2l-.1.2-.2.1-.2-.3.1-.2ZM204.8 110.7V113.5l-.1 1.8v.2l.2-.1 1.1-.9v-.2l.1-.2.1.1v.1h.1a9 9 0 0 0 2.2-3V111l.1-.2h.1c.3-.6.5-1.3.6-2l-.1-.1v-.2c.1-.1.1-.1.2 0l.2-2v-.5l.1-2.2v-1.1c0-1 0-1.7-.5-2.2a2 2 0 0 0-1.4-.5c-.4 0-.7 0-1 .3-.6.3-1 .8-1 1.3v.4h-.2V103.6h-.1.2l.1.1v.4h-.2V106.7l-.1.1v1l-.1.4c0 .8-.2 1.8-.5 2.5v.5l-.1-.1v-.3Zm3.6-4.6-.1.2-.2-.1v-.6h.2v.2h.1v.3Zm.1-3.5h.1l.1.1V103l-.2.2h-.2v-.2l.1-.4h.1Zm-.5-2.2v-.2h.3l.1.2v.4h-.2l-.1-.2-.1-.1v-.1Zm-.5 8.7v-.2H207.9v.4l-.2.1h-.1V109Zm-.6-7.9.1-.2H207.3v.4l-.2.3h-.2v-.5Zm-.2 2.8v-.1H207l.1.2v.2h-.2l-.1-.1v-.2Zm-.1 2.7v-.2l.3-.2h.1V106.6c0 .2-.2.3-.3.4h-.1V106.7Zm0 4v-.2h.2l.1.3v.4h-.2l-.2-.2v-.4Zm-.9-1.3v-.2h.1l.1-.1h.1v.4l-.2.1-.1-.1v-.1Zm-.7 3.5.3-.2h.1l.1.2v.2l-.2.1h-.2l-.1-.1v-.2ZM194.1 109.2v.1c.1-.1.1 0 .1 0l.3.4v.2a1 1 0 0 1-.4-.6v.2l.2 1.6.2 3v5.8l.4.2v.6l-.1-.1v-.1l-.2-.2v10.4c-.1 3-.3 6.9 1.5 8.7.6.7 1.6 1 2.7 1 2.9 0 4.3-2.5 4.3-7.5v-.1l-.2.5h-.2v-.2l.3-.4v-.1h.1a73 73 0 0 1 0-3l-.2-.5v-.2h.1c.2 0 .2.2.2.3l.1-3.8v.3l-.1.1h-.1v-.5l.1-.3c.2-.4.2-.7.2-1v-1.4.1l-.1.1h-.2v-.2l.2-.2v-.1h.1l.2-7h-.1l-.1.2-.1-.2v-.1l.2-.3s.2 0 .2-.2v.1-1.4a88 88 0 0 0-.2-5c-.1-.1 0-.2 0-.2v-.3a28 28 0 0 0-.3-3.3v.2l-.2.3h-.1v-.8l.1-.1h.1v-.3c-.3-1.4-1.3-3.8-4.3-3.8a4.5 4.5 0 0 0-4.2 3l-.3 1 .2.5v.1h-.1l-.1-.3a19 19 0 0 0-.2 4.8Zm8.8 9.5h.1l.2.4v.2h-.1l-.2-.4v-.2Zm-.2-7.1h.1v.7l-.2-.1v-.2l.1-.4Zm-2.3 13.8c-.1.1-.1.1-.2 0v-.4h.2v.4Zm.5-13.2-.2.3-.4.3v-.2l.1-.3.3-.3.2.1v.1Zm-.4 4.1h-.1v-.7h.1v.7Zm0 3.3v-.2l.2-.3.1-.3.2-.1.1.2c0 .3-.1.7-.5.7Zm.4 14h-.2v-.5c.2 0 .2.2.3.3v.2Zm.3-2.8-.3.2v-.2l.2-.4h.2l-.1.4Zm.2-3.8v.1c0 .4-.1.7-.4.9v-.5l.2-.4v-.1h.2Zm-.1-4.3v.2l-.1.4-.3.3-.1-.2c0-.3.2-.5.4-.7Zm-.3-21.2v-.2h.1s.1.1 0 .2V102h-.1v-.6Zm-.3 3.8.1-.1.1.1v.7h-.2v-.7Zm-.5 3.5.1.1.1.3V109.5h-.1l-.1-.2-.1-.2v-.2Zm-.2 12v.2l.1.2v.6c-.2-.2-.2-.5-.3-.7v-.2h.2Zm-.3-6.8h.2v.4l-.2-.3v-.1Zm0 14.4.1-.2h.1c.2.1.3.2.3.4l.2.4v.1H200l-.1-.2-.2-.2v-.2Zm-3-11.1h.1l.2.3v.3h-.1l-.2-.4v-.2Zm0 4.6h.2l.1.3V122.5h-.1l-.2-.3V121.9Zm.6 7.5v.1l-.1.1-.3-.4V128.9h.2v.1l.2.4Zm-.5 2.5c.1-.1.2 0 .2 0l.2.2v.1h-.1a1 1 0 0 1-.3-.3Zm.8 3.8v.1h-.2l-.3-.7v-.2c.2 0 .3.2.3.3l.2.4v.1Zm.1-7.7v-.5c.2-.1.2-.3.3-.4h.2v.2l-.3.5v.1h-.2Zm.6 4.4V132.7c0 .2-.2.3-.4.4l-.1-.2.2-.3s.2 0 .2-.2h.1Zm0-11.9-.2.2c0 .2-.1.3-.3.4V120.8l.1-.3.1-.2h.2v.2Zm-.2-5.6v.4l-.1.2-.1.2h-.1l-.1-.1v-.1l.3-.6Zm-.4-8h.2v.4l-.2.3h-.2v-.2l.2-.4Zm-.4 18 .1.1.2.5-.1.1h-.1c0-.2 0-.3-.2-.3V125c0-.1.1-.1.1 0Zm-.4-23 .2.1v.3l.1.3v.2h-.1l-.1-.2-.1-.4v-.2Zm-.2 8.1h.2l.2.6-.1.2-.2-.1-.1-.4v-.3Zm-1.3 6.8V117.1l-.5.6-.1-.1V117.3l.5-.5Zm-.7-9.6.4-.7h.1s.1.1 0 .2a3 3 0 0 1-.3.8h-.1l-.1-.2v-.1Zm0 5.5v.2l.1.2v.2h-.1l-.3-.3V112.7l.1-.1h.1Z"/>
|
||||||
<path d="M204.809 110.7C204.809 110.64 204.839 110.62 204.869 110.62C204.839 110.62 204.819 110.64 204.809 110.7C204.809 110.75 204.809 110.78 204.799 110.82C204.779 110.85 204.759 110.87 204.739 110.9C204.739 111.76 204.739 112.61 204.719 113.46C204.719 114.1 204.709 114.72 204.699 115.34C204.699 115.4 204.699 115.47 204.699 115.53C204.759 115.48 204.829 115.44 204.889 115.39C204.909 115.36 204.939 115.34 204.989 115.33C205.339 115.06 205.689 114.78 205.999 114.52C205.999 114.5 205.989 114.49 205.999 114.46C205.999 114.42 206.009 114.38 206.019 114.34C206.019 114.3 206.029 114.26 206.039 114.22C206.059 114.15 206.099 114.12 206.139 114.12C206.179 114.12 206.219 114.15 206.229 114.22C206.229 114.25 206.239 114.28 206.249 114.32C206.279 114.3 206.319 114.27 206.339 114.24C207.249 113.45 207.979 112.44 208.509 111.33C208.459 111.22 208.449 111.19 208.449 111.16C208.449 111.07 208.459 111.02 208.489 110.99L208.639 110.82C208.639 110.82 208.679 110.78 208.699 110.78C208.999 110.18 209.189 109.52 209.329 108.84L209.249 108.76C209.249 108.76 209.209 108.69 209.199 108.65C209.199 108.58 209.199 108.55 209.199 108.52C209.219 108.46 209.229 108.44 209.249 108.42C209.309 108.39 209.339 108.4 209.359 108.42C209.509 107.8 209.599 107.13 209.649 106.46C209.599 106.36 209.599 106.34 209.599 106.32C209.599 106.25 209.599 106.22 209.619 106.2L209.689 106.04C209.739 105.29 209.749 104.53 209.739 103.78C209.729 103.76 209.719 103.75 209.709 103.72C209.709 103.69 209.699 103.65 209.699 103.61C209.699 103.54 209.709 103.51 209.719 103.49C209.739 103.31 209.739 103.18 209.739 103.05V102.66C209.739 101.79 209.739 100.97 209.189 100.47C208.859 100.17 208.359 100 207.819 100C207.439 100 207.059 100.09 206.749 100.25C206.179 100.55 205.879 101.05 205.709 101.55C205.729 101.58 205.749 101.6 205.779 101.64C205.809 101.67 205.809 101.72 205.809 101.76C205.799 101.83 205.789 101.86 205.779 101.88C205.749 101.94 205.729 101.95 205.709 101.96C205.659 101.98 205.629 101.96 205.609 101.92C205.559 102.18 205.529 102.43 205.529 102.63C205.529 103 205.529 103.36 205.529 103.73C205.519 103.75 205.499 103.76 205.489 103.79C205.509 103.74 205.529 103.71 205.559 103.69C205.669 103.66 205.699 103.68 205.719 103.7C205.759 103.75 205.789 103.79 205.799 103.83C205.809 103.88 205.819 103.93 205.809 103.97C205.799 104.06 205.779 104.11 205.739 104.15C205.679 104.22 205.649 104.24 205.579 104.29C205.539 105.02 205.539 105.71 205.509 106.4C205.529 106.41 205.539 106.45 205.549 106.49C205.549 106.56 205.549 106.59 205.549 106.63C205.539 106.67 205.519 106.7 205.499 106.72C205.499 107.02 205.489 107.32 205.449 107.63L205.399 108.11C205.319 108.92 205.219 109.93 204.899 110.61C204.939 110.65 204.959 110.68 204.959 110.71C204.979 110.8 204.979 110.9 204.969 111C204.969 111.05 204.959 111.08 204.939 111.1C204.789 111.08 204.779 111.05 204.779 111C204.779 110.97 204.779 110.95 204.779 110.92C204.779 110.84 204.779 110.78 204.799 110.68L204.809 110.7ZM208.439 106.07C208.439 106.07 208.399 106.15 208.369 106.18C208.319 106.23 208.289 106.24 208.259 106.25C208.169 106.21 208.159 106.18 208.149 106.16C208.069 105.97 208.049 105.9 208.049 105.74C208.049 105.71 208.059 105.67 208.079 105.64C208.109 105.59 208.139 105.57 208.159 105.56C208.189 105.56 208.219 105.57 208.239 105.61C208.259 105.63 208.279 105.66 208.299 105.68L208.359 105.75C208.359 105.75 208.419 105.84 208.439 105.89C208.449 105.98 208.449 106.02 208.439 106.07ZM208.549 102.55C208.549 102.55 208.609 102.57 208.629 102.59C208.669 102.63 208.689 102.66 208.699 102.7C208.719 102.75 208.729 102.8 208.729 102.84C208.729 102.91 208.719 102.95 208.699 102.99C208.619 103.12 208.589 103.15 208.459 103.22C208.379 103.22 208.349 103.19 208.339 103.15C208.319 103.09 208.309 103.04 208.319 103.01C208.349 102.85 208.369 102.77 208.449 102.62C208.479 102.57 208.509 102.55 208.549 102.54V102.55ZM207.979 100.36C207.979 100.36 207.979 100.31 207.989 100.28C208.009 100.22 208.019 100.21 208.029 100.19C208.189 100.21 208.229 100.24 208.269 100.26C208.309 100.29 208.339 100.32 208.399 100.37C208.439 100.41 208.459 100.45 208.469 100.5C208.479 100.58 208.479 100.63 208.469 100.68C208.449 100.75 208.429 100.78 208.409 100.81C208.369 100.86 208.339 100.87 208.309 100.88C208.249 100.88 208.219 100.86 208.179 100.81C208.129 100.75 208.099 100.7 208.069 100.64C208.039 100.59 208.009 100.54 207.969 100.46C207.969 100.44 207.959 100.41 207.959 100.38C207.959 100.37 207.959 100.36 207.959 100.35L207.979 100.36ZM207.459 109.07C207.479 109 207.519 108.94 207.569 108.88C207.609 108.83 207.649 108.81 207.689 108.81C207.749 108.81 207.779 108.83 207.809 108.86C207.839 108.91 207.859 108.95 207.879 108.99C207.899 109.06 207.899 109.11 207.889 109.16C207.869 109.24 207.849 109.28 207.809 109.31C207.729 109.37 207.699 109.39 207.609 109.42C207.479 109.38 207.469 109.35 207.459 109.33C207.439 109.26 207.439 109.24 207.439 109.21C207.439 109.13 207.449 109.09 207.459 109.07ZM206.929 101.24C206.959 101.16 206.999 101.09 207.049 101.01C2Line truncated
|
|
||||||
<path d="M194.11 109.23C194.11 109.23 194.08 109.28 194.09 109.3C194.09 109.27 194.09 109.25 194.11 109.23C194.2 109.2 194.22 109.21 194.24 109.25C194.3 109.42 194.39 109.59 194.51 109.73C194.53 109.75 194.54 109.78 194.54 109.81C194.54 109.86 194.54 109.88 194.54 109.9C194.45 109.99 194.44 109.98 194.42 109.97C194.32 109.88 194.24 109.78 194.19 109.67C194.14 109.56 194.11 109.44 194.1 109.3C194.1 109.36 194.13 109.41 194.14 109.47C194.18 110.02 194.23 110.57 194.27 111.11C194.36 112.15 194.45 113.13 194.47 114.07C194.52 116 194.56 117.95 194.59 119.9C194.73 119.93 194.83 120.01 194.89 120.12C194.94 120.2 194.98 120.3 194.99 120.4C194.99 120.49 194.99 120.57 194.97 120.65C194.96 120.72 194.92 120.74 194.88 120.74C194.78 120.68 194.77 120.64 194.77 120.6C194.77 120.57 194.77 120.54 194.75 120.5C194.72 120.42 194.66 120.35 194.59 120.29C194.62 122.67 194.65 125.04 194.67 127.37V128.62C194.69 129.22 194.66 129.94 194.62 130.71C194.5 133.61 194.32 137.59 196.07 139.41C196.74 140.11 197.65 140.45 198.84 140.45C201.7 140.45 203.15 137.9 203.15 132.86V132.8C203.07 132.96 203 133.11 202.91 133.26C202.89 133.29 202.86 133.31 202.84 133.31C202.81 133.31 202.77 133.29 202.75 133.26C202.72 133.22 202.72 133.18 202.72 133.14C202.72 133.1 202.74 133.05 202.76 133.02C202.82 132.91 202.9 132.8 202.97 132.69C203 132.65 203.02 132.6 203.05 132.56C203.07 132.53 203.09 132.52 203.11 132.52C203.14 132.52 203.17 132.56 203.18 132.6C203.17 131.59 203.18 130.61 203.21 129.63C203.09 129.62 203.08 129.59 203.07 129.55C203.05 129.4 202.98 129.25 202.93 129.11C202.91 129.05 202.91 128.96 202.95 128.91C202.97 128.89 203 128.87 203.02 128.87C203.05 128.87 203.07 128.87 203.08 128.89C203.16 128.98 203.21 129.08 203.24 129.18C203.24 127.89 203.29 126.65 203.33 125.42C203.31 125.53 203.29 125.65 203.25 125.75C203.23 125.8 203.2 125.82 203.17 125.82C203.12 125.82 203.11 125.8 203.09 125.78C203.05 125.73 203.04 125.69 203.04 125.65C203.04 125.53 203.07 125.42 203.1 125.32C203.13 125.21 203.17 125.11 203.2 125C203.22 124.94 203.24 124.92 203.27 124.92C203.35 124.63 203.36 124.29 203.38 123.96C203.4 123.5 203.41 123.02 203.43 122.56C203.41 122.61 203.38 122.65 203.36 122.7C203.34 122.74 203.32 122.79 203.29 122.83C203.27 122.86 203.24 122.87 203.22 122.87C203.19 122.87 203.16 122.83 203.15 122.79C203.13 122.72 203.13 122.67 203.14 122.64C203.18 122.54 203.24 122.46 203.3 122.38C203.32 122.35 203.34 122.31 203.36 122.28C203.38 122.25 203.4 122.24 203.42 122.24C203.45 122.24 203.47 122.27 203.48 122.31C203.47 122.28 203.45 122.26 203.44 122.25C203.53 119.95 203.6 117.62 203.61 115.3C203.58 115.33 203.53 115.35 203.5 115.38C203.46 115.41 203.43 115.44 203.39 115.46C203.27 115.34 203.27 115.32 203.28 115.29C203.28 115.23 203.29 115.2 203.3 115.19C203.35 115.1 203.42 115.02 203.49 114.95C203.56 114.88 203.65 114.82 203.73 114.75C203.69 114.78 203.66 114.81 203.62 114.84C203.62 114.37 203.62 113.89 203.63 113.41C203.65 111.7 203.66 109.96 203.58 108.27C203.55 108.34 203.53 108.35 203.5 108.36C203.48 108.36 203.46 108.36 203.44 108.34C203.39 108.29 203.41 108.21 203.44 108.16C203.48 108.09 203.52 108.02 203.56 107.95C203.5 106.79 203.38 105.67 203.19 104.58C203.18 104.64 203.17 104.7 203.16 104.76C203.13 104.88 203.09 104.99 203.04 105.1C203.02 105.14 203 105.15 202.98 105.15C202.89 105.08 202.88 105.06 202.88 105.03C202.88 104.78 202.91 104.53 202.98 104.29C202.99 104.26 203.01 104.22 203.03 104.2C203.07 104.17 203.08 104.16 203.1 104.16C203.1 104.08 203.1 103.99 203.08 103.91C202.78 102.47 201.82 100.06 198.84 100.06C196.99 100.06 195.35 101.23 194.65 103.03C194.52 103.37 194.42 103.73 194.33 104.09C194.4 104.25 194.46 104.4 194.51 104.57C194.51 104.6 194.51 104.64 194.51 104.67C194.49 104.72 194.47 104.73 194.45 104.74C194.42 104.74 194.4 104.74 194.38 104.69C194.34 104.6 194.31 104.5 194.27 104.41C193.98 105.89 194 107.54 194.11 109.22V109.23ZM202.88 118.65C202.88 118.65 202.93 118.61 202.96 118.61C202.99 118.61 203.01 118.62 203.03 118.65C203.11 118.8 203.17 118.96 203.23 119.12C203.24 119.15 203.23 119.19 203.23 119.22C203.21 119.27 203.19 119.3 203.16 119.3C203.14 119.3 203.12 119.3 203.1 119.26C203.02 119.13 202.94 119.01 202.88 118.87C202.86 118.84 202.85 118.79 202.85 118.76C202.85 118.72 202.85 118.68 202.88 118.65ZM202.69 111.58C202.69 111.58 202.72 111.54 202.74 111.54C202.79 111.58 202.81 111.6 202.81 111.63C202.81 111.66 202.81 111.69 202.8 111.71C202.82 111.93 202.77 112.1 202.72 112.26C202.63 112.24 202.62 112.22 202.63 112.2C202.64 112.15 202.66 112.1 202.67 112.06C202.64 112.05 202.62 112 202.62 111.95C202.63 111.83 202.65 111.7 202.7 111.59L202.69 111.58ZM200.42 125.38C200.42 125.38 200.42 125.45 200.4 125.48C200.29 125.52 200.26 125.5 200.25 125.44L200.17 125.1C200.17 125.1 200.17 125.02 200.19 124.99C200.22 124.95 200.24 124.94 200.26 124.94C200.33 124.96 200.35 124.99 200.36 125.03C200.37 125.09 200.38 125.16 200.39 125.22C200.39 125.27 200.41 125.33 200.42 125.38ZM200.86 112.2C200.82 112.29 200.75 112.37 200.69 112.45C200Line truncated
|
|
||||||
</g>
|
</g>
|
||||||
<path opacity="0.3" d="M125.654 159.24C155.834 159.24 180.3 156.368 180.3 152.825C180.3 149.282 155.834 146.409 125.654 146.409C95.4736 146.409 71.0078 149.282 71.0078 152.825C71.0078 156.368 95.4736 159.24 125.654 159.24Z" fill="#080821"/>
|
<path fill="#080821" d="M125.7 159.2c30.1 0 54.6-2.8 54.6-6.4 0-3.5-24.5-6.4-54.6-6.4-30.2 0-54.7 2.9-54.7 6.4 0 3.6 24.5 6.4 54.7 6.4Z" opacity=".3"/>
|
||||||
<path d="M189.979 110.609C194.593 111.964 202.76 118.5 200.546 124.948C198.332 131.397 190.512 130.335 181.539 123.907" fill="#F99F10"/>
|
<path fill="#F99F10" d="M190 110.6c4.6 1.4 12.8 7.9 10.5 14.3-2.2 6.5-10 5.4-19-1"/>
|
||||||
<path d="M189.979 110.609C194.593 111.964 202.76 118.5 200.546 124.948C198.332 131.397 190.512 130.335 181.539 123.907" stroke="#3A1103" stroke-width="2.06554" stroke-miterlimit="10" stroke-linecap="round"/>
|
<path stroke="#3A1103" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2.1" d="M190 110.6c4.6 1.4 12.8 7.9 10.5 14.3-2.2 6.5-10 5.4-19-1"/>
|
||||||
<path d="M115.554 36.1128C102.429 26.9625 85.6365 24.9093 82.6828 28.1935C80.2867 30.8539 89.3379 45.4284 87.8714 49.6875C86.409 53.9466 73.5696 51.1912 72.1651 56.607C71.5 59.1807 81.3484 65.3897 81.084 68.9837C80.8196 72.5778 73.2143 71.5615 72.6566 76.2131C72.2807 79.3403 79.2209 80.0302 78.9565 83.7565C78.6921 87.4827 73.6811 86.8011 73.9001 90.4116C74.0777 93.3405 79.5555 91.4113 81.0221 96.3356C82.4845 101.26 115.558 36.1128 115.558 36.1128H115.554Z" fill="#EF6122"/>
|
<path fill="#EF6122" d="M115.6 36.1c-13.2-9.1-30-11.2-33-8-2.3 2.8 6.7 17.3 5.3 21.6-1.5 4.2-14.3 1.5-15.7 7-.7 2.5 9.1 8.7 8.9 12.3-.3 3.6-7.9 2.6-8.4 7.2-.4 3.1 6.5 3.8 6.3 7.6-.3 3.7-5.3 3-5.1 6.6.2 3 5.7 1 7.1 6 1.5 4.9 34.6-60.3 34.6-60.3Z"/>
|
||||||
<path d="M57.0086 123.507C57.4093 111.461 65.816 108.788 71.9217 110.845C78.0233 112.902 77.6845 119.995 76.1437 122.664C73.6815 126.923 70.0669 125.085 71.4177 122.102C72.4175 119.239 72.6034 115.265 67.8733 116.529C61.9948 118.103 63.8248 133.909 76.2015 130.802C84.6785 128.675 84.0134 119.698 83.34 106.607C81.5347 93.9407 83.4887 77.3338 88.8757 61.5696C99.7899 29.6282 165.536 19.2468 187.36 48.7922C215.712 87.1699 184.448 124.655 179.639 129.443C164.66 141.068 167.089 151.586 156.357 152.284C146.157 152.949 146.996 142.584 140.25 142.006C139.853 142.006 139.457 142.006 139.06 141.997C131.141 142.58 129.612 152.457 117.669 152.284C107.936 152.143 112.27 143.642 105.768 139.564C104.404 138.92 103.223 138.465 102.132 138.168C101.273 137.986 100.319 137.854 99.2406 137.788C98.9927 137.771 97.4931 137.78 97.0552 137.78C93.1926 137.85 90.8751 138.763 82.1461 140.539C66.4191 143.737 56.6698 133.698 57.0086 123.507Z" fill="#FAC20C" stroke="#3A1103" stroke-width="2.06554" stroke-miterlimit="10"/>
|
<path fill="#FAC20C" stroke="#3A1103" stroke-miterlimit="10" stroke-width="2.1" d="M57 123.5c.4-12 8.8-14.7 15-12.7 6 2.1 5.7 9.2 4.1 11.9-2.4 4.2-6 2.4-4.7-.6 1-2.9 1.2-6.8-3.5-5.6-6 1.6-4 17.4 8.3 14.3 8.5-2.1 7.8-11.1 7.1-24.2-1.8-12.7.2-29.3 5.6-45 10.9-32 76.6-42.4 98.5-12.8 28.3 38.4-3 75.9-7.8 80.6-15 11.7-12.5 22.2-23.2 22.9-10.2.6-9.4-9.7-16.2-10.3h-1.1c-8 .6-9.5 10.5-21.4 10.3-9.8-.2-5.4-8.7-12-12.7-1.3-.7-2.5-1.1-3.6-1.4l-2.9-.4h-2.1c-4 0-6.2 1-15 2.7-15.7 3.2-25.4-6.8-25-17Z"/>
|
||||||
<path d="M99.9346 44.2687C122.292 28.4302 148.314 37.0807 151.639 39.2784C154.965 41.4761 159.678 38.8653 157.03 32.268C148.157 10.175 125.262 -1.06152 119.099 2.7432C112.208 6.99821 120.875 25.9764 116.372 30.4255C112.757 33.9948 110.295 31.2683 104.148 29.2069C98.5961 27.3437 99.9346 44.2687 99.9346 44.2687Z" fill="#EF6122"/>
|
<path fill="#EF6122" d="M100 44.3a54.4 54.4 0 0 1 51.6-5c3.4 2.2 8-.4 5.4-7-8.8-22.1-31.7-33.4-37.9-29.6-6.9 4.3 1.8 23.3-2.7 27.7-3.6 3.6-6.1.9-12.3-1.2-5.5-1.9-4.2 15-4.2 15Z"/>
|
||||||
<path d="M139.09 19.7477C139.075 19.4295 139.023 19.0921 138.93 18.6947C138.837 18.2973 138.687 17.8773 138.477 17.4183C138.265 16.9789 137.977 16.4983 137.607 16.0548C137.472 15.8734 137.317 15.6929 137.141 15.5311C137.416 14.5044 136.856 13.603 136.856 13.603C135.867 13.5262 135.246 13.8727 135.005 14.0466C134.966 14.0269 134.926 14.0048 134.886 14.0047C134.729 13.943 134.551 13.8603 134.375 13.8177C134.197 13.7551 134.019 13.7121 133.842 13.6494C133.664 13.6064 133.468 13.5648 133.27 13.5208C133.23 13.5207 133.21 13.5197 133.172 13.4999C132.759 12.1245 131.541 11.5302 131.541 11.5302C130.158 12.3787 129.859 13.6023 129.859 13.6023C129.859 13.6023 129.858 13.6219 129.839 13.6808C129.759 13.6984 129.681 13.7183 129.601 13.7359C129.501 13.7745 129.381 13.8116 129.282 13.8306C129.183 13.8691 129.062 13.9063 128.963 13.9449C128.764 14.0398 128.543 14.1352 128.343 14.232C128.143 14.3485 127.943 14.4631 127.762 14.5786C127.744 14.558 127.724 14.5589 127.724 14.5589C125.833 13.8128 124.133 14.6764 124.133 14.6764C123.939 16.6946 124.829 17.9997 125.023 18.2397C124.981 18.3584 124.939 18.4949 124.899 18.6141C124.752 19.0685 124.645 19.5407 124.558 20.0359C124.556 20.115 124.535 20.1734 124.535 20.2529C122.737 21.0541 122.191 22.8301 122.191 22.8301C123.629 24.5402 125.35 24.6885 125.35 24.6885C125.561 25.088 125.812 25.4498 126.085 25.8112C126.201 25.9518 126.318 26.0929 126.454 26.2345C125.893 27.7522 126.485 29.0495 126.485 29.0495C128.128 29.1363 129.212 28.3815 129.433 28.2066C129.59 28.2683 129.769 28.3113 129.927 28.3533C130.421 28.5 130.935 28.5682 131.45 28.6167C131.569 28.6189 131.708 28.6201 131.827 28.6223L131.886 28.6234L131.926 28.6235L132.005 28.6255L132.084 28.6276C132.839 29.7513 134.183 29.9117 134.183 29.9117C135.172 28.9182 135.228 27.9078 135.232 27.6898L135.232 27.6702L135.233 27.6304L135.233 27.5906C135.434 27.4545 135.634 27.3002 135.815 27.1448C136.198 26.7939 136.561 26.4042 136.846 25.9927C136.866 25.954 136.907 25.9148 136.927 25.876C138.016 25.954 138.802 25.2336 138.802 25.2336C138.643 24.101 137.998 23.5344 137.861 23.4143L137.843 23.3936L137.823 23.3926C137.823 23.3926 137.803 23.3917 137.804 23.372C137.805 23.3126 137.827 23.2345 137.828 23.1751C137.83 23.0563 137.852 22.9385 137.853 22.7995L137.855 22.7003L137.855 22.6606L137.856 22.6409L137.856 22.6012L137.858 22.5221L137.859 22.4229L137.86 22.3238L137.861 22.2246L137.863 22.1254L137.844 22.0252C137.827 21.9054 137.808 21.7674 137.771 21.6466C137.66 21.149 137.489 20.6902 137.239 20.269C136.99 19.8478 136.678 19.4667 136.326 19.143C135.974 18.8194 135.582 18.5751 135.171 18.3697C134.758 18.1839 134.323 18.0383 133.888 17.99C133.671 17.967 133.452 17.9435 133.234 17.9383L133.155 17.9363L133.136 17.9353C133.136 17.9353 133.096 17.9352 133.116 17.9343L133.076 17.9342L132.997 17.9321L132.918 17.9301C132.798 17.9476 132.699 17.9464 132.581 17.9643C132.143 18.0367 131.745 18.1887 131.365 18.3992C131.005 18.6108 130.683 18.8635 130.421 19.1773C130.157 19.4709 129.954 19.8035 129.809 20.1587C129.663 20.5139 129.578 20.8683 129.553 21.2242L129.55 21.482L129.549 21.5414L129.547 21.6204L129.545 21.7393C129.561 21.9185 129.598 22.0968 129.635 22.2555C129.729 22.5935 129.862 22.8937 130.055 23.1356C130.23 23.3966 130.464 23.5988 130.698 23.7813C130.933 23.9442 131.189 24.0665 131.444 24.1508C131.699 24.2352 131.938 24.2578 132.176 24.2621L132.255 24.2642L132.295 24.2643L132.335 24.2644L132.414 24.2664L132.433 24.2674L132.453 24.2684L132.493 24.2685C132.533 24.2686 132.552 24.2696 132.573 24.2509C132.592 24.2519 132.633 24.2323 132.653 24.2333C132.713 24.2148 132.753 24.2149 132.812 24.1958C132.911 24.1572 133.012 24.121 133.111 24.0824C133.21 24.0438 133.29 23.9865 133.371 23.9273C133.391 23.9086 133.411 23.8876 133.43 23.8886C133.51 23.8312 133.533 23.7115 133.453 23.6318C133.396 23.5517 133.296 23.5304 133.216 23.5877C133.195 23.6064 133.175 23.6073 133.156 23.6264C133.097 23.6651 133.017 23.6827 132.936 23.7021C132.856 23.7197 132.778 23.7396 132.698 23.7572C132.658 23.7571 132.618 23.7748 132.578 23.7747L132.518 23.7736L132.459 23.7725L132.4 23.7714L132.32 23.7694L132.301 23.7684L132.261 23.7683L132.202 23.7672C132.024 23.7443 131.827 23.6826 131.649 23.5998C131.473 23.5175 131.295 23.3949 131.14 23.2542C130.984 23.1135 130.847 22.9316 130.751 22.7522C130.656 22.5532 130.579 22.3528 130.544 22.115C130.526 21.9952 130.528 21.896 130.53 21.7772L130.531 21.678L130.532 21.6584L130.533 21.6388L130.533 21.599C130.534 21.5396 130.555 21.4812 130.556 21.4217C130.644 20.9467 130.908 20.4762 131.291 20.1253C131.392 20.0273 131.493 19.9495 131.593 19.8931C131.694 19.8152 131.814 19.758 131.934 19.7007C132.054 19.6435 132.173 19.6059 132.313 19.5678C132.432 19.5302 132.572 19.5119 132.711 19.515L132.909 19.5192L132.948 19.5193L133.008 19.5204L133.048 19.5205L133.067 19.5215L133.127 19.5226C133.264 19.5454 133.424 19.5677 133.561 19.5887C133.838 19.6525 134.114 19.7561 134.369 19.92C134.88 20.2061 135.308 20.6703 135.577 21.2099C135.711 21.4905 135Line truncated
|
<path fill="#FAC20C" fill-opacity=".5" d="M139 19.7a5.8 5.8 0 0 0-.5-2.3 6.7 6.7 0 0 0-1.4-1.9c.3-1-.2-1.9-.2-1.9-1 0-1.7.3-1.9.4h-.1l-.5-.2c-.2 0-.4 0-.6-.2h-.5l-.1-.1c-.4-1.4-1.7-2-1.7-2-1.3.9-1.6 2.1-1.6 2.1l-.3.1a2 2 0 0 1-.3.1l-.3.1-.7.3-.5.4c-2-.8-3.7 0-3.7 0-.2 2 .7 3.4 1 3.6l-.2.4-.3 1.4v.3a4.5 4.5 0 0 0-2.4 2.5c1.4 1.7 3.1 1.9 3.1 1.9a8.3 8.3 0 0 0 1.2 1.5 4 4 0 0 0 0 2.8c1.6.1 2.7-.6 3-.8l.4.2 1.5.2h.6a3.2 3.2 0 0 0 2.2 1.3c1-1 1-2 1-2.2v-.1a6.5 6.5 0 0 0 1.6-1.6l.1-.1c1.1 0 1.9-.7 1.9-.7a2.9 2.9 0 0 0-1-1.8V21.6a4.7 4.7 0 0 0-4-3.6h-.6s-.1 0 0 0H132.5a3.7 3.7 0 0 0-2.2 1.2 3.4 3.4 0 0 0-.8 2v1.1l.5.8c.1.3.4.5.6.7l.7.4h1.4l.3-.1.3-.2v-.3h-.2l-.3.1h-.7a2 2 0 0 1-1.7-1.6v-.7a2.4 2.4 0 0 1 1-1.5l.4-.2a2.2 2.2 0 0 1 .8-.2h.9l.8.4a3 3 0 0 1 1.4 2.2v1.4a4.1 4.1 0 0 1-.7 1.3 4 4 0 0 1-2.5 1.5H131.5c-.3 0-.7 0-1-.2a5.2 5.2 0 0 1-3.5-3.6l-.2-1V20.9l.1-.5.1-.5.1-.5.4-1a5.2 5.2 0 0 1 1.5-1.9l.4-.2.4-.3h.2v-.1h.2l.4-.2H131l.2-.1h.5v-.1H133a6 6 0 0 1 3.7 1.5l.1.1.2.1v.2h.2l.4.6c.3.3.5.7.6 1v.1l.1.2h.1v.2l.2.4.2.6s0 .2.1.1l.2-.1c.1-.3.1-.5 0-.8Z"/>
|
||||||
<path d="M127.975 119.854C122.213 125.093 115.652 127.03 111.984 122.548C107.932 117.595 111.575 111.857 116.888 107.007" fill="#F99F10"/>
|
<path fill="#F99F10" d="M128 119.9c-5.8 5.2-12.3 7.1-16 2.6-4-5-.4-10.6 4.9-15.5"/>
|
||||||
<path d="M127.975 119.854C122.213 125.093 115.652 127.03 111.984 122.548C107.932 117.595 111.575 111.857 116.888 107.007" stroke="#3A1103" stroke-width="2.06554" stroke-miterlimit="10" stroke-linecap="round"/>
|
<path stroke="#3A1103" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2.1" d="M128 119.9c-5.8 5.2-12.3 7.1-16 2.6-4-5-.4-10.6 4.9-15.5"/>
|
||||||
<path d="M107.857 31.6853C96.5872 26.381 85.5944 23.5678 82.682 28.1946C79.5341 33.1973 90.2666 43.8224 87.8706 49.6886C85.6316 55.1746 72.9864 50.4652 72.1643 56.6081C71.5075 61.5241 81.3477 65.3908 81.0833 68.9848C80.8189 72.5788 73.1186 71.1123 72.5567 75.768C72.1808 78.8952 79.2201 80.0313 78.9516 83.7575C78.6872 87.4837 73.9654 86.798 73.8952 90.4127C73.8291 93.7878 82.5209 93.7423 82.7646 99.8604" stroke="#3A1103" stroke-width="2.06554" stroke-miterlimit="10"/>
|
<path stroke="#3A1103" stroke-miterlimit="10" stroke-width="2.1" d="M107.9 31.7c-11.3-5.3-22.3-8.1-25.2-3.5-3.2 5 7.6 15.6 5.2 21.5-2.3 5.5-15 .8-15.7 7-.7 4.8 9.1 8.7 8.9 12.3-.3 3.6-8 2.1-8.5 6.8-.4 3.1 6.6 4.2 6.4 8-.3 3.7-5 3-5.1 6.6 0 3.4 8.6 3.3 8.9 9.5M151.6 39.3c3.4 2.2 8-.4 5.4-7-8.8-22.1-31-33.4-37.9-29.6-7.2 4 1.8 23.3-2.7 27.7-2.5 2.5-5.8 2.4-8.9 1.1"/>
|
||||||
<path d="M151.639 39.2779C154.965 41.4756 159.678 38.8648 157.03 32.2674C148.157 10.1745 125.94 -1.10338 119.099 2.74265C111.919 6.77871 120.875 25.9758 116.372 30.425C113.856 32.9119 110.552 32.8045 107.523 31.5321" stroke="#3A1103" stroke-width="2.06554" stroke-miterlimit="10"/>
|
<path stroke="#3A1103" stroke-miterlimit="10" stroke-width="2.1" d="M151.8 39.4c-12-7.1-32.8-7.5-51.6 6.5"/>
|
||||||
<path d="M151.772 39.3768C139.812 32.2879 118.992 31.8665 100.232 45.8956" stroke="#3A1103" stroke-width="2.06554" stroke-miterlimit="10"/>
|
<path fill="#5545EF" stroke="#231735" stroke-miterlimit="10" stroke-width="2.1" d="m133.3 88.6 61 5a13.3 13.3 0 1 0 2.2-26.6l-61-5a13.3 13.3 0 1 0-2.2 26.6Z"/>
|
||||||
<path d="M133.284 88.646L194.34 93.5863C201.676 94.1799 208.104 88.7139 208.698 81.3777L208.698 81.3736C209.292 74.0374 203.826 67.6089 196.49 67.0153L135.434 62.0751C128.097 61.4814 121.669 66.9474 121.075 74.2837L121.075 74.2878C120.481 81.624 125.947 88.0524 133.284 88.646Z" fill="#5545EF" stroke="#231735" stroke-width="2.06554" stroke-miterlimit="10"/>
|
<path fill="#19052D" d="m147.7 85.3 46.4 3.8a8.8 8.8 0 0 0 1.4-17.7L149 67.7a8.8 8.8 0 1 0-1.4 17.6Z"/>
|
||||||
<path d="M147.72 85.3174L194.052 89.0663C198.918 89.4601 203.182 85.8342 203.576 80.9676C203.97 76.101 200.344 71.8367 195.478 71.4429L149.146 67.6941C144.28 67.3003 140.015 70.9262 139.622 75.7928C139.228 80.6593 142.854 84.9237 147.72 85.3174Z" fill="#19052D"/>
|
<path fill="#fff" d="M157 82.6c.1-.6-.5-1.2-1.3-1.3l-7.6-.6c-.8 0-1.5.4-1.6 1 0 .7.6 1.2 1.4 1.3l7.6.6c.8 0 1.5-.4 1.6-1ZM157.5 78c0-.5-.6-1.1-1.4-1.2l-7.6-.6c-.8 0-1.5.4-1.6 1 0 .7.6 1.2 1.4 1.3l7.6.6c.8 0 1.5-.4 1.6-1ZM170.2 83.6c0-.6-.6-1.1-1.4-1.2l-7.6-.6c-.8 0-1.5.4-1.6 1 0 .6.6 1.2 1.4 1.2l7.6.7c.8 0 1.5-.4 1.6-1ZM170.6 79.1c0-.6-.6-1.1-1.4-1.2l-7.6-.6c-.8 0-1.5.4-1.6 1 0 .6.6 1.2 1.4 1.2l7.6.7c.8 0 1.5-.4 1.6-1ZM171 74.6c0-.6-.6-1.1-1.5-1.2l-7.6-.6c-.8 0-1.5.4-1.5 1s.5 1.2 1.4 1.3l7.6.6c.8 0 1.5-.4 1.5-1ZM183.3 84.7c0-.6-.6-1.2-1.4-1.3l-7.6-.6c-.8 0-1.5.4-1.6 1 0 .7.6 1.2 1.4 1.3l7.6.6c.8 0 1.5-.4 1.6-1ZM196.4 85.8c0-.7-.6-1.2-1.4-1.3l-7.6-.6c-.8 0-1.5.4-1.6 1 0 .6.6 1.2 1.4 1.3l7.6.6c.8 0 1.6-.4 1.6-1ZM196.8 81.3c0-.7-.6-1.2-1.4-1.3l-7.6-.6c-.8 0-1.5.4-1.6 1 0 .6.6 1.2 1.4 1.3l7.6.6c.8 0 1.5-.4 1.6-1Z"/>
|
||||||
<path d="M157.095 82.5854C157.145 81.9596 156.519 81.395 155.704 81.329L148.111 80.7147C147.296 80.6487 146.588 81.1053 146.537 81.7312C146.486 82.3571 147.112 82.9216 147.927 82.9876L155.52 83.602C156.336 83.6679 157.044 83.2113 157.095 82.5854Z" fill="white"/>
|
<path fill="#231F20" d="m171.7 104.2-12.3-1.4c-1.9-.2-3.2-2-3-3.8a1 1 0 1 1 2 .2c-.1.8.5 1.5 1.2 1.6l12.4 1.4a1 1 0 1 1-.3 2Z"/>
|
||||||
<path d="M157.46 78.0845C157.51 77.4586 156.885 76.894 156.069 76.8281L148.477 76.2137C147.661 76.1477 146.953 76.6043 146.902 77.2302C146.852 77.8561 147.477 78.4207 148.293 78.4866L155.885 79.101C156.701 79.167 157.409 78.7104 157.46 78.0845Z" fill="white"/>
|
<path fill="#3B3B5A" fill-rule="evenodd" d="M242 64.8a27 27 0 0 0 7 2.3 56.8 56.8 0 0 0 29-4.2c4.2-1.6 8-3.6 11-5.8.3-.2.4-.6.2-.8a.6.6 0 0 0-.8-.2c-3 2.2-6.7 4.2-10.7 5.9a64.9 64.9 0 0 1-21.8 4.7 46.2 46.2 0 0 1-13.9-1.9Z" clip-rule="evenodd"/>
|
||||||
<path d="M170.198 83.645C170.249 83.0191 169.623 82.4546 168.808 82.3886L161.215 81.7742C160.399 81.7083 159.691 82.1649 159.64 82.7908C159.59 83.4166 160.216 83.9812 161.031 84.0472L168.624 84.6615C169.439 84.7275 170.147 84.2709 170.198 83.645Z" fill="white"/>
|
<path fill="#3B3B5A" fill-rule="evenodd" d="M242.8 68.6a54.6 54.6 0 0 0 29.7.7c5.2-1.4 10.4-4 15.8-5.5 3.6-.9 7.2-1.3 10.9-.5 6.9 1.6 9.8 5.8 9.4 9.8-.4 4.3-4.4 8-11 7.7-3-.2-4.9-2.8-5.1-5.6-.3-2.7 1-5.5 4.2-6.2 2.7-.5 4.4.7 4.8 2.3.3.9 0 1.9-.5 2.6-.6.6-1.4 1-2.6 1a.6.6 0 0 0 0 1.2c1.6 0 2.8-.6 3.5-1.4a4 4 0 0 0 .7-3.8c-.5-2-2.6-3.7-6.1-3-3.8.8-5.4 4.2-5 7.4.2 3.2 2.4 6.3 6.1 6.5 7.2.4 11.6-4 12-8.6.3-4.3-2.7-9-10.2-10.8-3.9-.8-7.6-.4-11.3.6-5.4 1.4-10.6 4-15.8 5.5a50.1 50.1 0 0 1-14.7 1.9 62.5 62.5 0 0 1-14.8-1.8ZM291.4 59.6l2.4-.5.8-.1.8-.2c3-.6 6.3-.7 9.2 0a13 13 0 0 1 7.3 4.4c.3.3.6.3.9 0 .2-.1.3-.5 0-.8-1.3-1.5-3-2.6-4.7-3.4a17 17 0 0 0-5.6-1.5 21.8 21.8 0 0 0-8.9 1l-2.2 1ZM10 9.8a27 27 0 0 0 7 2.3 56.7 56.7 0 0 0 29-4.2c4.2-1.6 8-3.6 11-5.8.3-.2.4-.6.2-.8a.6.6 0 0 0-.8-.2c-3 2.2-6.7 4.2-10.7 5.9A64.9 64.9 0 0 1 24 11.7 46.2 46.2 0 0 1 10 9.8Z" clip-rule="evenodd"/>
|
||||||
<path d="M170.561 79.145C170.612 78.5191 169.986 77.9546 169.171 77.8886L161.578 77.2742C160.763 77.2083 160.054 77.6649 160.004 78.2908C159.953 78.9166 160.579 79.4812 161.394 79.5472L168.987 80.1615C169.802 80.2275 170.511 79.7709 170.561 79.145Z" fill="white"/>
|
<path fill="#3B3B5A" fill-rule="evenodd" d="M10.8 13.6a54.6 54.6 0 0 0 29.7.7c5.2-1.4 10.4-4 15.8-5.5 3.6-.9 7.2-1.3 10.9-.5 6.9 1.6 9.8 5.8 9.4 9.8-.4 4.3-4.4 8-11 7.7-3-.2-4.9-2.8-5.1-5.6-.3-2.7 1-5.5 4.2-6.2 2.7-.5 4.4.7 4.8 2.3.3.9 0 1.9-.5 2.6-.6.6-1.4 1-2.6 1a.6.6 0 0 0 0 1.2c1.6 0 2.8-.6 3.5-1.4a4 4 0 0 0 .7-3.8c-.5-2-2.6-3.7-6.1-3-3.8.8-5.4 4.2-5 7.4.2 3.2 2.4 6.3 6.1 6.5 7.2.4 11.6-4 12-8.6.3-4.3-2.7-9-10.2-10.8-3.9-.8-7.6-.4-11.3.6-5.4 1.4-10.6 4-15.8 5.5a50.2 50.2 0 0 1-14.7 1.9 62.5 62.5 0 0 1-14.8-1.8ZM59.4 4.6l2.4-.5.8-.1.8-.2c3-.6 6.3-.7 9.2 0A13 13 0 0 1 80 8.2c.3.3.6.3.9 0 .2-.1.3-.5 0-.8-1.3-1.5-3-2.6-4.7-3.4a17 17 0 0 0-5.6-1.5 21.8 21.8 0 0 0-8.9 1l-2.2 1Z" clip-rule="evenodd"/>
|
||||||
<path d="M170.927 74.6489C170.977 74.023 170.351 73.4585 169.536 73.3925L161.943 72.7781C161.128 72.7122 160.42 73.1688 160.369 73.7947C160.318 74.4205 160.944 74.9851 161.759 75.0511L169.352 75.6654C170.168 75.7314 170.876 75.2748 170.927 74.6489Z" fill="white"/>
|
<g id="grot-cta-tumbleweed" fill="#9087e9" fill-opacity=".8">
|
||||||
<path d="M183.3 84.7056C183.35 84.0797 182.724 83.5151 181.909 83.4492L174.316 82.8348C173.501 82.7688 172.793 83.2254 172.742 83.8513C172.691 84.4772 173.317 85.0417 174.132 85.1077L181.725 85.7221C182.541 85.788 183.249 85.3314 183.3 84.7056Z" fill="white"/>
|
<path d="m255.8 142.6.3-2.1.5-2.5.1-.4.3-1.6.3-1.3a14.7 14.7 0 0 0-.9.6 36.5 36.5 0 0 0-1 3.4v.2a27.4 27.4 0 0 0-.1 4.3 5.7 5.7 0 0 1 .3-.3l.2-.2v-.1Zm-1.3-12.6a28.5 28.5 0 0 1 0-.5h-.1l-.1.2-.2.3-.3.3v.5c.2 0 .2-.1.3-.2a21 21 0 0 0 .3-.4v-.2Zm1.9 5.3v-.2l.4-.8-.7.6-.1.6v.1l-.1.1-.3 1.6-.1 1-.3-1.4v-.4l-.2-1.3-.1-.8a32.4 32.4 0 0 1 .9-3.3v-.4a21 21 0 0 1 1.9-3.6v-.1a40.5 40.5 0 0 1 1-1.6l.2-.4.3-.5.3-.4 1.7-3-1.3 1.6a74.4 74.4 0 0 0-1.8 2.4 139.7 139.7 0 0 0-1.5 2.5l-.1.1a19.5 19.5 0 0 0-1.4 3.7l-.4 1.9a71.3 71.3 0 0 1-.2-3.1v-.2.2l-.3.3-.3.4a31.5 31.5 0 0 0 .4 3.3v.2l.1.3a59.4 59.4 0 0 0 .5 2.5l.5 1.4 1-3.3Zm6.7-20.2v.2l-.1.2h-.2l-.1.3-.1.2.4-.4a18.5 18.5 0 0 0 1-1.2l-1 .7Zm2.6 23.2v-.2l-.8.8-.2 1a32.9 32.9 0 0 0 .8-.6l.2-1Zm4.4-3.7a18.9 18.9 0 0 0-.5.4l-.6.3-.5.4-.4.4h-.1a10.5 10.5 0 0 0-.5.5l-.2.2a8.6 8.6 0 0 0-.8 1l-.2.3-.4.5-.3.6a22.5 22.5 0 0 0 2.7-2.6l.8-.8v.2h.2l-.2-.2a29 29 0 0 0 1-1.2Zm10 8.5a18.3 18.3 0 0 1-1 .4l-.5.6-.1.1-.3.2-.3.3-.4.3-.5.5-.6.4-.5.4-.6.4-.5.4v-.3l.4-.7.2-.5v-.2l.1-.2.2-.3-.4.2-.2.4-.1.3-.1.2-.2 1-.1.2c-.6.4-1.1.8-1.7 1l-.6.5-.3.1-.4.2-1.2.6c-.2.2-.5.3-.7.3l-.6.3-1.4.6-1 .3c.7-.4 1.4-.9 2-1.5l.3-.2c1-.8 1.8-1.6 2.6-2.5l.3-.2c0-.1 0-.2.2-.3l.1-.1.2-.3a26.4 26.4 0 0 0 .4-.5 18.6 18.6 0 0 1-1.8.5l-.2.2a3.2 3.2 0 0 0 .2-.4h-.4a7.1 7.1 0 0 1 0 .7l-.5.4-.2.2-1.3 1.2-.5.4a13.5 13.5 0 0 1-3.5 2.2 7.8 7.8 0 0 0 .2-.6l.1-.2a8.3 8.3 0 0 0 .4-1.6v-.4a5.8 5.8 0 0 0 0-1V146.2a7.5 7.5 0 0 0-.2-1l-.1-.3a4.3 4.3 0 0 0-.2-.5V146a4.4 4.4 0 0 1 0 .4v.2l-.1.4v.9l-.1.3v.2a9.8 9.8 0 0 1-.1.6v.3l-.3 1v.3l-.2.6a15.8 15.8 0 0 1-1 .4 44 44 0 0 0 6-.9l.9-.2.9-.3.8-.3h.2l-1 .1-1 .3.7-.3 1.3-.7.3-.1.4-.2.6-.4a31 31 0 0 0 7.6-5.9l-.6.4Zm-11.8-6.4-.5.3-.4.4a39.2 39.2 0 0 0 1-.7h-.1Zm2.8 8.5-.4.2v.4l.4-.4v-.2Zm-1.8-9.2.1.5.2-.1-.3-.4Zm.8-1.4-.3.2-.2.2-.6.3-.5.4-.4.4h-.1l-.5.5a8.1 8.1 0 0 0-1 1.2l-.2.3-.4.5-.3.6a21 21 0 0 0 2.2-2 39.6 39.6 0 0 0 1.3-1.4v.2h.2l-.2-.2 1-1v-.2Zm-4.4 3.7v-.2l-.8.8-.2 1a35 35 0 0 0 .8-.6l.2-1ZM280 143a21.3 21.3 0 0 1-1 .4l-.5.6-.1.1-.3.2-.3.3-.4.3-.5.5-.6.4-.5.4-.6.4-.5.4v-.3l.4-.7.2-.5v-.2l.1-.2.2-.3-.4.2-.2.4-.1.3a8.4 8.4 0 0 0-.4 1.4c-.6.4-1.1.8-1.7 1l-.6.5-.3.1-.4.2-1.2.6c-.2.2-.5.3-.7.3l-.6.3-1.4.6-1 .3c.7-.4 1.4-.9 2-1.5l.3-.2c1-.8 1.8-1.6 2.6-2.5l.3-.2c0-.1 0-.2.2-.3l.1-.1h-.3a7 7 0 0 1-.3.1 22.4 22.4 0 0 0 .9-.6l.2-.2.1-.1-.3.1-.7.2-.8.2-.2.2v-.1h-.2v.4l-.5.4-.2.2-1.3 1.2-.5.4a13.5 13.5 0 0 1-3.5 2.2 7.8 7.8 0 0 0 .2-.6l.1-.2a8.3 8.3 0 0 0 .4-1.6 1 1 0 0 0 0-.2v-.2a5.3 5.3 0 0 0 0-1V146.1a5.4 5.4 0 0 0-.2-.9l-.1-.3-.2-.4v-.1V146a4.4 4.4 0 0 1 0 .4v.2l-.1.4v.9l-.1.3V148.8a4.9 4.9 0 0 1-.2.5c0 .3 0 .7-.2 1v.3l-.2.6a19.6 19.6 0 0 1-1 .4 45.3 45.3 0 0 0 6-.9l.9-.2.9-.3.8-.3h.2l-1 .1-1 .3.7-.4 1.3-.6.3-.1.4-.2.6-.4a31 31 0 0 0 7.6-5.9l-.6.4Zm-11.8-6.4-.5.3-.4.4a39.2 39.2 0 0 0 1-.7h-.1Zm-12.5 5.9.3-2.1.5-2.5.1-.4.3-1.6.3-1.3a14.7 14.7 0 0 0-.9.6 36.5 36.5 0 0 0-1 3.4v.2a28.3 28.3 0 0 0-.1 4.3 5.8 5.8 0 0 1 .3-.3l.2-.2v-.1Zm-1.3-12.6a28.6 28.6 0 0 1 0-.5h-.1l-.1.2a13 13 0 0 1-.5.6v.5a9.3 9.3 0 0 0 .6-.6v-.2Zm1.9 5.3a9.2 9.2 0 0 1 .4-1l-.7.6-.1.6v.1l-.1.1-.3 1.6-.1 1a10.3 10.3 0 0 1-.4-1.8l-.1-1.3-.1-.8a42 42 0 0 1 .9-3.3v-.4a21 21 0 0 1 1.9-3.6v-.1l.5-.8.1-.2.4-.6.2-.4.3-.5a118 118 0 0 1 2-3.4l-1.3 1.6a78.8 78.8 0 0 0-1.8 2.4 81.6 81.6 0 0 0-1.5 2.5l-.1.1a19.2 19.2 0 0 0-1.4 3.7l-.4 1.9a79 79 0 0 1-.2-3.1v-.1a1 1 0 0 1 0-.2V130.3l-.3.3-.3.4a32.6 32.6 0 0 0 .3 2.7l.1.6v.2l.1.3a59.8 59.8 0 0 0 .5 2.5l.5 1.4 1-3.3Zm6.7-20.2v.2l-.1.2h-.2l-.1.3-.1.2.4-.4a16.2 16.2 0 0 0 1-1.2l-1 .7Zm-8.6 14.2a13.3 13.3 0 0 1 .2-2.5 16.3 16.3 0 0 1 .5-2.5 24.5 24.5 0 0 1-.5.4l-.2.1-1 .7v.2l-.2.5-.2.7-.3 1.5v.4l-.1.2v.2-.1l.5-.5c-.3.3-.4.6-.6 1v.4l-.2.8v.8l-.1.8c0-.2.2-.3.3-.4v-.2a27.4 27.4 0 0 1 1.4-5 15.9 15.9 0 0 0-.2 3.4 21.5 21.5 0 0 0 .5-.5v-.1l.1-.1h.1v-.2Zm25.6 13.8a21.3 21.3 0 0 1-1 .4l-.5.6-.1.1-.3.2-.3.3-.4.3-.5.5-.6.4-.5.4-.6.4-.5.4v-.3l.4-.7.2-.5v-.2l.1-.2.2-.3-.4.2-.2.4-.1.3-.1.2-.2 1-.1.2c-.6.4-1.1.8-1.7 1l-.6.5-.3.1-.4.2-1.2.6c-.2.2-.5.3-.7.3l-.6.3-1.4.6-1 .3a14.9 14.9 0 0 0 2.3-1.7 40.3 40.3 0 0 0 2.9-2.7c0-.1 0-.2.2-.3l.1-.1h-.3l-.3.1a15.3 15.3 0 0 0 .9-.6l.2-.2.1-.1-.3.1-.7.2-.8.2-.2.2v-.1h-.2v.4l-.5.4-.2.2-1.3 1.2-.5.4a13.6 13.6 0 0 1-3.5 2.2 7 7 0 0 0 .2-.6l.1-.2a8.3 8.3 0 0 0 .4-1.5v-.5a5.3 5.3 0 0 0 0-1 7.6 7.6 0 0 0-.2-1.9l-.1-.3a4.5 4.5 0 0 0-.2-.5V145.3a8.2 8.2 0 0 0 0 .7 4.4 4.4 0 0 1 0 .4v.2l-.1.4v.9l-.1.3V148.8l-.1.2a11.4 11.4 0 0 1-.3 1.3v.3l-.2.6a20.6 20.6 0 0 1-1 .4 45.4 45.4 0 0 0 6-.9l.9-.2.9-.3.8-.3h.2l-1 .1-1 .3.7-.4 1.3-.6.3-.1.4-.2.6-.4a31 31 0 0 0 7.6-5.9l-.6.4Zm-24.3-.5.3-2.1.5-2.5.1-.4.3-1.6.3-1.3a14.7 14.7 0 0 0-.9.6 36.5 36.5 0 0 0-1 3.4v.2a28.3 28.3 0 0 0-.1 4.3 5.8 5.8 0 0 1 .3-.3l.2-.2v-.1Zm-1.3-12.6a28.6 28.6 0 0 1 0-.5h-.1l-.1.2a13 13 0 0 1-.5.6v.5a9.3 9.3 0 0 0 .6-.6v-.2Zm1.9 5.3a9.2 9.2 0 0 1 .4-1l-.7.6-.1.6v.1l-.1.1-.3 1.6-.1 1a10.3 10.3 0 0 1-.4-1.8l-.1-1.3-.1-.8a42 42 0 0 1 .9-3.3v-.4a21 21 0 0 1 1.9-3.6v-.1l.5-.8.1-.2.4-.6.2-.4.3-.5a118 118 0 0 1 2-3.4l-1.3 1.6a78.8 78.8 0 0 0-1.8 2.4 81.6 81.6 0 0 0-1.5 2.5l-.1.1a19.2 19.2 0 0 0-1.4 3.7l-.4 1.9aLine truncated
|
||||||
<path d="M196.401 85.7651C196.452 85.1393 195.826 84.5747 195.011 84.5087L187.418 83.8944C186.603 83.8284 185.894 84.285 185.844 84.9109C185.793 85.5368 186.419 86.1013 187.234 86.1673L194.827 86.7816C195.642 86.8476 196.351 86.391 196.401 85.7651Z" fill="white"/>
|
<path d="M264.6 148v-.3a3.6 3.6 0 0 1-.4-1c-.1-.6-.2-1.2-.1-1.9l.2-1.9.2-1.9.1-.8v-.2a31 31 0 0 1 1.3-5.5v-.2a35.2 35.2 0 0 1 .3-.6h-.3v-.1.2l-.1.2a19 19 0 0 0-.6 2.3v.6l-.1.4-.1.5-.2 1.2v.1a24.8 24.8 0 0 0-.2 1l-.2 1.1-.2 2-.2 1.8.1 2a3.7 3.7 0 0 0 .4 1v.1h.1v-.1Zm1.8-16.1v.3l-.1.2.1-.5Zm-6.1 8.8h-.4l-.1.1h-.4l-.1.1a6 6 0 0 0-.3.1h-.2l-.4.2h-.2l-.1.1-1.7 1h-.1l-.2.2-.3.2-.2.2-.3.3v.9l.5-.3v-.1h.1l.2-.2.3-.2v-.1l.2-.1 1-.7h.1v-.1l.2-.1.4-.3h.2a14 14 0 0 1 .7-.5l.4-.2c.2 0 .3-.2.5-.3l.4-.2h-.2Zm2.6-9.1a5.7 5.7 0 0 0-.7.1h-.2l-.1.2v-.1h-.3l-.1.5a9.6 9.6 0 0 0-.4.5l.5-.2h.2a7.8 7.8 0 0 1 .4-.2l.2-.2.1-.2a37.5 37.5 0 0 1 .4-.4Zm-7.6 12.6-.2.1a9.1 9.1 0 0 1 .2-.1Zm29-3.2h.2-.1Zm-3.2 2a18.3 18.3 0 0 1-1.5.8l1.1-1a28.2 28.2 0 0 1-1.5.7l-.3.2a25.6 25.6 0 0 1-1.3 1.1h.3v-.1l.3-.1a28.6 28.6 0 0 0 1.4-.6h.1l.1-.1.7-.3.3-.2.3-.1a15.3 15.3 0 0 0 1.1-.7l-1 .5Zm-5.8 2v.1l-.4.1-1.8.8a17.4 17.4 0 0 1-.7.2h-.2l-.2.1a24 24 0 0 0 .5-.6h.2l.1-.2-.3.1-.7.2-.8.2-.2.2v-.1h-.2v.4l-.5.4-.2.2-1.3 1.2-.5.4.5-.2.2-.2a24.2 24.2 0 0 0 2-1.3l.2-.1.2-.2h.1a4.7 4.7 0 0 0 .6 0h.1l.3-.1a14.2 14.2 0 0 0 1.9-.6 79.9 79.9 0 0 0 1.2-.4v-.2a5.5 5.5 0 0 1 .3-.5l-.4.2Zm16.6-17v-.2.1c0 .3-.2.5-.3.7l.3-.5Zm-.4.3-.1.3a32.6 32.6 0 0 1-1.7 4.1l.1-.1a25.6 25.6 0 0 0 1.4-2.8l.3-1.5Zm-3 5.9.1-.4.1-.2.2-.8.1-.3a23.3 23.3 0 0 0 .7-3.3 63.4 63.4 0 0 0 .3-3.4v.4c-.2.2-.2.5-.3.7l-.2.7-.2.6-.2.9-.6 2.2a40 40 0 0 1-.6 2.1v.2l-.1.3a27.8 27.8 0 0 1-.4 1.2l-.3.6v.2l-.2.3v.1l-.1.2a19.2 19.2 0 0 1-1.4 2.5 18.1 18.1 0 0 1-1.6 1.5l2-.3.3-.3a49.6 49.6 0 0 0 .8-2.5l.3-.9.1-.5v-.2l.3-.1.4-.5-.2.8.1-.2a5.7 5.7 0 0 0 .2-.6l.2-.3.2-.7Zm-6.2 7.4-.5.3-.5.4-.3.1-.3.2-.3.1a19.2 19.2 0 0 1-.7.4l-.2.1-.3.2h-.2l-1 .6-.6.2-.5.2a15.9 15.9 0 0 0 1.4-1.1h.1v-.1l.2-.1a6.9 6.9 0 0 0 .7-.7v-.1l.2-.2h.1l.4-.5.2-.3.1-.1.2-.2a22.1 22.1 0 0 0 2.1-3.5l1-2 .4-.9.3-.7v-.1a75.1 75.1 0 0 0 .8-1.7l.2-.6.1-.2-.2.3v.1a22.3 22.3 0 0 0-.5.6l-.2.4-.3.5-1.1 2-1.1 2a73 73 0 0 1-1.2 1.8l-.1.3-.2.3-.6.8a18.8 18.8 0 0 1-.5.8h-.1c0 .2-.1.2-.2.3l-.9 1v.1l-.4.4a8.8 8.8 0 0 1-.3.3 27 27 0 0 1-1.1 1l-.2.2-.4.4h-.1l-.2.3v.2l-.1.2a78.8 78.8 0 0 0 2.1-.8h.1a27.1 27.1 0 0 0 1.6-1.3 10 10 0 0 0 .9-.4l.6-.4-1 1.1.2-.1a28.7 28.7 0 0 0 1.2-.6l1.2-1.5Zm2-.6h.2-.1Zm-3.2 2a14.3 14.3 0 0 1-1.5.8l1.1-1a28.2 28.2 0 0 1-1.5.7l-.3.2a25.6 25.6 0 0 1-1.3 1.1h.3v-.1l.3-.1a24.4 24.4 0 0 0 1.1-.5l.3-.1h.1l.1-.1.7-.3.3-.2.3-.1.3-.2.2-.2.6-.3-1 .5Zm-5.8 2v.1l-.4.1-1.8.8-.4.1-.3.1h-.2l-.2.1-.4.1a18.6 18.6 0 0 0 .9-.6l.2-.2.1-.1-.3.1-.7.2-.8.2-.2.2v-.1h-.2v.4l-.5.4-.2.2-1.3 1.2-.5.4.5-.2.2-.2.2-.1.5-.3a12.6 12.6 0 0 0 1.3-.9l.2-.1.2-.2h.1a3.8 3.8 0 0 0 .6 0h.1a9 9 0 0 0 1.2-.4l1-.3.8-.2.4-.2v-.2l.1-.2.2-.3-.4.2Zm-10.7 3v-.3a3.6 3.6 0 0 1-.4-1c-.1-.6-.2-1.2-.1-1.9l.2-1.9.2-1.9.1-.8v-.2a31.4 31.4 0 0 1 1.3-5.5v-.2a41.9 41.9 0 0 1 .3-.6h-.3v-.1.2a10.1 10.1 0 0 0-.2.7 20.4 20.4 0 0 0-.6 2.4v.4l-.1.5-.2 1.2v.1a24.9 24.9 0 0 0-.2 1l-.2 1.1-.2 2-.2 1.8.1 2a3.7 3.7 0 0 0 .4 1v.1h.1v-.1Zm1.8-16.1v.3l-.1.2.1-.5Zm-6.1 8.8h-.4l-.1.1a4 4 0 0 0-.4 0l-.1.1-.3.1h-.2a9.5 9.5 0 0 0-2.4 1.2l-.1.2h-.2v.1l-.3.2-.2.2a3.5 3.5 0 0 0-.3.3v.9l.5-.3v-.1h.1l.2-.2.3-.2v-.1l.2-.1 1-.7h.1v-.1l.2-.1a7.2 7.2 0 0 1 .5-.3 21.3 21.3 0 0 1 .8-.5l.4-.2c.2 0 .3-.2.5-.3l.4-.2h-.2Zm2.6-9.1a5.7 5.7 0 0 0-.9.2h-.4l-.1.5a9.6 9.6 0 0 0-.4.5l.5-.2h.2l.4-.1.2-.3.1-.2a37.4 37.4 0 0 1 .4-.4Zm-7.6 12.6-.2.1a6.5 6.5 0 0 1 .2-.1Zm36.6-16.1V127.8v.1a50.7 50.7 0 0 1 0 .2Zm-.4.2-.1.3a33 33 0 0 1-1.7 4.1l.1-.1a26.7 26.7 0 0 0 1.4-2.8l.3-1.5Zm-3 5.9.1-.4a44.5 44.5 0 0 0 .3-1l.1-.3a22.5 22.5 0 0 0 .7-3.3 63.2 63.2 0 0 0 .3-3.4v.4c-.2.2-.2.5-.3.7l-.2.7-.2.6-.2.9-.6 2.2-.6 2.1v.2l-.1.3a21 21 0 0 1-.4 1.2l-.3.6v.2l-.2.3v.1l-.1.2a13.1 13.1 0 0 1-.5 1 23.5 23.5 0 0 1-.9 1.5 21.4 21.4 0 0 1-1.5 1.4l2-.2.2-.3.3-.7.1-.5a81.2 81.2 0 0 0 .8-2.7v-.2l.3-.1.4-.5-.2.8.1-.2.1-.3v-.2a25.8 25.8 0 0 0 .3-.4l.2-.7Zm-6.2 7.4-.5.3-.5.4-.3.1-.3.2-.3.1a19.2 19.2 0 0 1-.7.4 1.6 1.6 0 0 1-.2.1l-.3.2h-.2l-1 .6-.6.2-.5.2a15.9 15.9 0 0 0 1.5-1.2l.2-.1a6.2 6.2 0 0 0 .7-.8l.2-.2h.1l.4-.5.2-.3.1-.1.2-.2a22 22 0 0 0 2.1-3.5l1-2 .4-.9.3-.7v-.1l.4-.8.4-.9.2-.6.1-.2-.2.3v.1l-.4.5v.1l-.3.4a31 31 0 0 0-1.4 2.5l-1.1 2a67 67 0 0 1-1.2 1.8l-.1.3-.2.3-.6.8a12.8 12.8 0 0 1-.5.8h-.1l-.2.3-.9 1v.1a47.9 47.9 0 0 1-1.4 1.4l-.4.3-.2.2-.4.4h-.1l-.2.3v.2l-.1.2a78.8 78.8 0 0 0 2.1-.8h.1a26.2 26.2 0 0 0 1.3-1.1l.3-.2h.2a19.1 19.1 0 0 0 1.3-.8 33 33 0 0 1-.8 1 28.7 28.7 0 0 0 1.2-.6l1.2-1.5Zm2-.6h.2-.1Zm-3.2 2a18.3 18.3 0 0 1-1.2.7l-.3.1 1.1-1a30.3 30.3 0 0 1-1.5.7l-.3.2a25.6 25.6 0 0 1-1.3 1.1h.3v-.1l.3-.1a24.4 24.4 0 0 0 1.4-.6h.1l.1-.1.7-.3.3-.2.3-.1.3-.2.2-.2.6-.3-1 .5Zm-5.8 2v.1l-.4.1-1.8.8-.4.1-.3.1h-.2l-.2.1-.4.1a30.7 30.7 0 0 0 .9-.6l.2-.2.1-.1-.3.1-.7.2-.8.2-.2.2v-.1h-.2v.4l-.5.4-.2.2-1.3 1.2-.5.4.5-.2.2-.2a13 13 0 0 0 1-.6l1-.7.2-.1.2-.2h.1a4.7 4.7 0 0 0 .6 0h.1a9 9 0 0 0 1.2-.4l1-.3.8-.2.4-.2v-.2l.1-.2.2-.3-.4.2Zm-10.7 3v-.3a3.5 3.5 0 0 1-.4-1c-.1-.6-.2-1.2-.1-1.9l.2-1.9.2-1.9.1-.8v-.2a30.6 30.6 0 0 1 1.3-5.5v-.2l.2-.5v-.1h-.2v-.1.2a6.7 6.7 0 0 0-.2.7l-.2.6a20.6 20.6 0 0 0-.4 1.8v.4l-.1.5-.2 1.2v.1a19.3 19.3 0 0 0-.2 1l-.2 1.1-.2 2Line truncated
|
||||||
<path d="M196.766 81.2651C196.817 80.6393 196.191 80.0747 195.376 80.0087L187.783 79.3944C186.968 79.3284 186.259 79.785 186.209 80.4109C186.158 81.0368 186.784 81.6013 187.599 81.6673L195.192 82.2817C196.007 82.3476 196.716 81.891 196.766 81.2651Z" fill="white"/>
|
|
||||||
<path d="M171.748 104.198L159.416 102.806C157.532 102.593 156.172 100.887 156.385 99.0029C156.447 98.4491 156.947 98.0507 157.501 98.1132C158.055 98.1757 158.453 98.6755 158.391 99.2293C158.303 100.009 158.866 100.712 159.643 100.8L171.975 102.192C172.529 102.254 172.927 102.754 172.864 103.308C172.802 103.862 172.302 104.26 171.748 104.198Z" fill="#231F20"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M242 64.8081C243.527 65.5394 245.147 66.1493 246.865 66.5965C247.578 66.782 248.306 66.9366 249.047 67.0611C251.266 67.4329 253.59 67.5604 255.96 67.5349C259.346 67.4986 262.831 67.0989 266.275 66.4191C270.358 65.6132 274.377 64.3926 278.112 62.903C282.213 61.2684 285.971 59.3022 289.067 57.1158C289.342 56.9179 289.405 56.5333 289.208 56.2569C289.011 55.981 288.628 55.9172 288.353 56.1151C285.362 58.3081 281.727 60.3172 277.735 61.9653C274.072 63.4773 270.11 64.6817 266.093 65.5046C262.707 66.198 259.279 66.6069 255.946 66.6827C253.621 66.7356 251.345 66.6027 249.154 66.3282C248.422 66.2366 247.701 66.1342 246.988 66.0163C245.253 65.7295 243.585 65.3542 242 64.8085V64.8081Z" fill="#3B3B5A"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M242.827 68.5993C245.17 69.3267 247.614 69.9091 250.115 70.3215C252.571 70.7262 255.077 70.979 257.588 71.0501C259.6 71.1073 261.614 71.0451 263.603 70.875C266.656 70.6137 269.65 70.0823 272.499 69.2957C277.676 67.8599 282.939 65.2459 288.327 63.8297C291.878 62.8963 295.484 62.4866 299.158 63.3226C306.092 64.8984 308.96 69.1466 308.614 73.111C308.243 77.3738 304.17 81.1864 297.694 80.7859C294.532 80.5857 292.718 77.9559 292.465 75.226C292.213 72.5057 293.519 69.6521 296.677 69.0124C299.42 68.4574 301.072 69.7051 301.506 71.2612C301.762 72.1768 301.593 73.1806 300.971 73.8968C300.437 74.5109 299.573 74.8951 298.39 74.8723C298.052 74.8669 297.773 75.1386 297.768 75.4784C297.763 75.8181 298.033 76.0979 298.371 76.1034C299.993 76.1219 301.152 75.5329 301.877 74.6853C302.753 73.6606 303.006 72.2375 302.633 70.9396C302.056 68.9336 299.99 67.1676 296.452 67.9128C292.687 68.7044 291.096 72.0821 291.418 75.328C291.735 78.5334 293.918 81.5767 297.634 81.7913C304.772 82.2137 309.173 77.8941 309.571 73.1949C309.936 68.8702 306.926 64.12 299.36 62.4205C295.537 61.5632 291.788 61.9857 288.1 62.9686C282.711 64.4041 277.453 67.0412 272.277 68.4976C269.478 69.2892 266.533 69.8117 263.532 70.1051C261.57 70.2968 259.584 70.3845 257.596 70.3857C255.106 70.3869 252.615 70.25 250.166 69.9575C247.657 69.6575 245.194 69.2096 242.826 68.6004L242.827 68.5993Z" fill="#3B3B5A"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M291.436 59.5939C292.226 59.4088 293.019 59.2773 293.833 59.1382C294.098 59.093 294.361 59.047 294.625 58.9967C294.887 58.9469 295.148 58.8912 295.411 58.8402C298.474 58.2438 301.661 58.1151 304.617 58.8193C305.752 59.0899 306.856 59.4718 307.895 60.0048C309.392 60.772 310.752 61.8438 311.93 63.2368C312.154 63.4911 312.542 63.5154 312.795 63.2905C313.049 63.0655 313.073 62.6763 312.849 62.4216C311.457 60.9011 309.857 59.7871 308.131 58.994C306.375 58.1862 304.49 57.7042 302.546 57.5249C300.958 57.3784 299.335 57.4182 297.726 57.6281C296.667 57.7665 295.608 57.9532 294.584 58.2492C294.253 58.3451 293.929 58.4545 293.609 58.5789C292.852 58.8731 292.144 59.2267 291.436 59.5939H291.436Z" fill="#3B3B5A"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M10 9.80809C11.5269 10.5394 13.147 11.1493 14.8652 11.5965C15.5783 11.782 16.3059 11.9366 17.0475 12.0611C19.2659 12.4329 21.5902 12.5604 23.9599 12.5349C27.3459 12.4986 30.8311 12.0989 34.2748 11.4191C38.3577 10.6132 42.3771 9.39259 46.1125 7.90298C50.2127 6.26842 53.9708 4.30224 57.067 2.11575C57.3417 1.91786 57.4052 1.53328 57.2082 1.25693C57.0112 0.980957 56.6283 0.917183 56.3532 1.11508C53.362 3.30814 49.7274 5.31722 45.7354 6.9653C42.0723 8.47733 38.1103 9.6817 34.0928 10.5046C30.7072 11.198 27.2789 11.6069 23.946 11.6827C21.6206 11.7356 19.3448 11.6027 17.1541 11.3282C16.4222 11.2366 15.7006 11.1342 14.9876 11.0163C13.2532 10.7295 11.5847 10.3542 10 9.80848L10 9.80809Z" fill="#3B3B5A"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.8269 13.5993C13.1701 14.3267 15.614 14.9091 18.1153 15.3215C20.5708 15.7262 23.0771 15.979 25.5876 16.0501C27.5998 16.1073 29.6139 16.0451 31.603 15.875C34.6558 15.6137 37.6496 15.0823 40.4992 14.2957C45.6757 12.8599 50.9388 10.2459 56.3266 8.82971C59.878 7.89629 63.4841 7.48659 67.1579 8.32261C74.0915 9.89841 76.9595 14.1466 76.614 18.111C76.2426 22.3738 72.1701 26.1864 65.6945 25.7859C62.5325 25.5857 60.7177 22.9559 60.4649 20.226C60.2128 17.5057 61.5189 14.6521 64.6767 14.0124C67.4204 13.4574 69.072 14.7051 69.5065 16.2612C69.762 17.1768 69.5934 18.1806 68.9712 18.8968C68.4371 19.5109 67.5731 19.8951 66.3898 19.8723C66.0516 19.8669 65.773 20.1386 65.7676 20.4784C65.7626 20.8181 66.0327 21.0979 66.371 21.1034C67.993 21.1219 69.152 20.5329 69.877 19.6853C70.7533 18.6606 71.0065 17.2375 70.6332 15.9396C70.056 13.9336 67.9903 12.1676 64.4515 12.9128C60.6869 13.7044 59.0961 17.0821 59.4178 20.328C59.7353 23.5334 61.9179 26.5767 65.6341 26.7913C72.7716 27.2137 77.1735 22.8941 77.5706 18.1949C77.9362 13.8702 74.9262 9.11998 67.3596 7.42049C63.5372 6.56321 59.7884 6.98567 56.0995 7.96857C50.7114 9.40407 45.4533 12.0412 40.2771 13.4976C37.4776 14.2892 34.5326 14.8117 31.5322 15.1051C29.5701 15.2968 27.5841 15.3845 25.5961 15.3857C23.1064 15.3869 20.6155 15.25 18.1657 14.9575C15.6567 14.6575 13.1943 14.2096 10.8262 13.6004L10.8269 13.5993Z" fill="#3B3B5A"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M59.4359 4.59389C60.2263 4.40875 61.0187 4.27734 61.8333 4.1382C62.0981 4.09297 62.3605 4.04698 62.6253 3.99673C62.8873 3.94687 63.1482 3.89122 63.4107 3.8402C66.4738 3.24381 69.6612 3.1151 72.617 3.81933C73.7522 4.08988 74.8558 4.47176 75.8948 5.00475C77.3917 5.77198 78.7524 6.84377 79.9304 8.23676C80.1543 8.49108 80.5418 8.51543 80.7954 8.29048C81.049 8.06553 81.0729 7.67632 80.8489 7.42161C79.4574 5.90107 77.8566 4.78715 76.1315 3.99403C74.3748 3.18622 72.4896 2.70424 70.5459 2.5249C68.9582 2.37841 67.3346 2.41822 65.7257 2.6281C64.6667 2.76647 63.6081 2.95315 62.5841 3.24922C62.2532 3.34508 61.9288 3.45446 61.609 3.57892C60.852 3.87305 60.1444 4.22671 59.4355 4.59389H59.4359Z" fill="#3B3B5A"/>
|
|
||||||
<g id="grot-cta-tumbleweed" fill-opacity="0.8" fill="#9087e9">
|
|
||||||
<path d="M255.834 142.553C255.855 141.865 255.927 141.184 256.06 140.504C256.238 139.668 256.382 138.823 256.622 138.003C256.66 137.862 256.697 137.72 256.734 137.576C256.738 137.552 256.74 137.53 256.744 137.506C256.811 136.99 256.912 136.479 257.005 135.969C257.1 135.536 257.189 135.104 257.3 134.675C257.295 134.677 257.292 134.68 257.287 134.683C257.279 134.688 257.271 134.692 257.263 134.697C257.076 134.816 256.892 134.94 256.711 135.067C256.607 135.136 256.506 135.208 256.406 135.281L256.404 135.284C256.013 136.389 255.675 137.515 255.392 138.653C255.399 138.67 255.407 138.688 255.416 138.705C255.408 138.785 255.397 138.863 255.389 138.942C255.339 139.481 255.292 140.021 255.274 140.562C255.235 141.391 255.233 142.222 255.265 143.053C255.267 143.096 255.269 143.138 255.273 143.182C255.354 143.105 255.437 143.03 255.521 142.959C255.561 142.922 255.603 142.886 255.647 142.85C255.689 142.814 255.731 142.778 255.775 142.743C255.793 142.728 255.811 142.713 255.83 142.699C255.832 142.651 255.832 142.603 255.835 142.553L255.834 142.553ZM254.489 129.99C254.494 129.981 254.498 129.974 254.505 129.966C254.503 129.949 254.503 129.932 254.504 129.915C254.5 129.745 254.499 129.579 254.498 129.41C254.48 129.437 254.46 129.464 254.44 129.491C254.421 129.518 254.403 129.545 254.383 129.57C254.344 129.624 254.307 129.676 254.268 129.728C254.211 129.808 254.152 129.886 254.093 129.965C254.012 130.076 253.932 130.185 253.85 130.293L253.85 130.295C253.857 130.451 253.868 130.607 253.881 130.763C253.881 130.799 253.885 130.836 253.888 130.871C253.967 130.776 254.045 130.679 254.121 130.581C254.137 130.561 254.152 130.541 254.167 130.523C254.25 130.417 254.332 130.309 254.414 130.2C254.418 130.193 254.423 130.186 254.429 130.18C254.434 130.171 254.439 130.165 254.446 130.156C254.45 130.151 254.453 130.148 254.455 130.143L254.455 130.141C254.464 130.091 254.476 130.04 254.489 129.99ZM256.404 135.284L256.405 135.28C256.428 135.216 256.45 135.15 256.475 135.085C256.568 134.824 256.666 134.565 256.767 134.306C256.534 134.495 256.31 134.693 256.095 134.9L256.094 134.902C256.048 135.089 256.005 135.276 255.961 135.463C255.947 135.521 255.935 135.58 255.921 135.639C255.912 135.671 255.904 135.705 255.897 135.738C255.793 136.269 255.681 136.798 255.603 137.333C255.55 137.637 255.509 137.945 255.472 138.252C255.347 137.817 255.259 137.372 255.192 136.921C255.171 136.781 255.15 136.642 255.131 136.502C255.13 136.493 255.13 136.487 255.128 136.48L255.129 136.478C255.072 136.063 255.025 135.648 254.971 135.232C254.938 134.955 254.902 134.677 254.868 134.4C254.907 134.188 254.95 133.975 254.993 133.765C255.033 133.583 255.074 133.399 255.119 133.219C255.255 132.644 255.414 132.078 255.597 131.52C255.648 131.367 255.7 131.217 255.756 131.066L255.759 131.058C255.801 130.936 255.844 130.818 255.892 130.698C256.253 129.749 256.686 128.836 257.182 127.944C257.343 127.644 257.511 127.348 257.685 127.053L257.686 127.051C257.699 127.026 257.713 127.003 257.728 126.979C257.873 126.73 258.022 126.483 258.173 126.236C258.224 126.148 258.275 126.063 258.328 125.976C258.44 125.789 258.555 125.602 258.67 125.416C258.757 125.276 258.844 125.133 258.933 124.993C259.023 124.841 259.116 124.69 259.206 124.539C259.301 124.382 259.396 124.223 259.49 124.066C260.08 123.081 260.651 122.084 261.177 121.06C260.738 121.586 260.316 122.124 259.902 122.667C259.901 122.669 259.899 122.671 259.898 122.672C259.87 122.711 259.839 122.751 259.811 122.79C259.45 123.267 259.097 123.749 258.748 124.234C258.535 124.525 258.328 124.819 258.124 125.118C258.122 125.121 258.119 125.124 258.117 125.13L258.116 125.132C257.946 125.38 257.777 125.63 257.608 125.88C257.387 126.221 257.173 126.565 256.963 126.916C256.828 127.143 256.695 127.373 256.566 127.606C256.541 127.652 256.517 127.699 256.49 127.744C256.2 128.295 255.929 128.858 255.692 129.437C255.445 130.067 255.227 130.712 255.071 131.37C254.915 132 254.804 132.642 254.741 133.286C254.692 132.824 254.646 132.364 254.606 131.901C254.556 131.322 254.52 130.74 254.509 130.16C254.508 130.13 254.508 130.102 254.507 130.073L254.508 130.071C254.505 130.036 254.505 130 254.506 129.967C254.499 129.975 254.495 129.982 254.489 129.991C254.476 130.041 254.465 130.092 254.456 130.141L254.455 130.143C254.453 130.149 254.45 130.152 254.446 130.157C254.439 130.165 254.435 130.172 254.43 130.181C254.423 130.187 254.419 130.194 254.414 130.201C254.332 130.309 254.251 130.418 254.167 130.524C254.153 130.542 254.137 130.562 254.122 130.582C254.046 130.68 253.968 130.777 253.889 130.871L253.888 130.873C253.932 131.421 253.989 131.966 254.061 132.507C254.107 132.877 254.163 133.245 254.223 133.612C254.256 133.82 254.291 134.03 254.329 134.236C254.334 134.282 254.343 134.33 254.35 134.375C254.367 134.471 254.383 134.567 254.402 134.662L254.402 134.664C254.537 135.44 254.687 136.21 254.854 136.986C254.874 137.073 254.895 137.158 254.918 137.244C254.918 137.244 254.918 137.246 254.919 137.246C254.919 137.255 254.921 137.26 254.923 137.267C25Line truncated
|
|
||||||
<path d="M264.626 147.981C264.627 147.966 264.63 147.95 264.632 147.934C264.589 147.869 264.552 147.799 264.515 147.729C264.411 147.524 264.328 147.31 264.266 147.093C264.233 146.987 264.209 146.881 264.186 146.775C264.05 146.119 264.043 145.457 264.077 144.814C264.116 144.166 264.197 143.545 264.261 142.917C264.329 142.289 264.41 141.662 264.489 141.037C264.527 140.747 264.567 140.455 264.609 140.164C264.614 140.111 264.623 140.057 264.631 140.003C264.636 139.999 264.642 139.995 264.649 139.988C264.66 139.98 264.671 139.971 264.684 139.961C264.738 139.596 264.799 139.232 264.866 138.869C265.074 137.703 265.325 136.543 265.633 135.395C265.713 135.102 265.799 134.812 265.887 134.522C265.914 134.439 265.939 134.353 265.966 134.27C266.011 134.127 266.056 133.987 266.102 133.847C266.122 133.783 266.142 133.72 266.164 133.656C266.071 133.664 265.979 133.672 265.888 133.682C265.897 133.65 265.907 133.615 265.914 133.582C265.913 133.579 265.911 133.579 265.908 133.58C265.899 133.614 265.889 133.649 265.881 133.684C265.872 133.71 265.865 133.735 265.858 133.762L265.855 133.772C265.847 133.805 265.837 133.84 265.828 133.872C265.813 133.928 265.798 133.982 265.785 134.039C265.742 134.199 265.701 134.361 265.662 134.523C265.617 134.699 265.573 134.875 265.533 135.053C265.504 135.172 265.476 135.29 265.449 135.409C265.416 135.546 265.386 135.682 265.357 135.82C265.317 135.996 265.279 136.172 265.243 136.349C265.202 136.541 265.163 136.734 265.125 136.927C265.101 137.045 265.079 137.162 265.056 137.278C265.023 137.452 264.99 137.626 264.96 137.799C264.889 138.185 264.822 138.572 264.76 138.959C264.751 139.013 264.742 139.065 264.736 139.12C264.708 139.285 264.682 139.451 264.657 139.619C264.635 139.757 264.614 139.895 264.596 140.034C264.588 140.088 264.58 140.14 264.572 140.194C264.522 140.539 264.474 140.883 264.43 141.228C264.351 141.853 264.27 142.48 264.202 143.107C264.138 143.736 264.057 144.357 264.018 145.005C263.984 145.648 263.991 146.309 264.127 146.966C264.136 147.007 264.145 147.05 264.156 147.091C264.222 147.375 264.322 147.657 264.456 147.92C264.475 147.956 264.494 147.992 264.515 148.029C264.534 148.061 264.551 148.094 264.573 148.125C264.579 148.137 264.587 148.149 264.594 148.16C264.597 148.165 264.601 148.171 264.603 148.176L264.604 148.174C264.614 148.11 264.621 148.047 264.627 147.981L264.626 147.981ZM266.436 131.859C266.398 131.969 266.364 132.079 266.328 132.188C266.308 132.253 266.286 132.315 266.269 132.379C266.322 132.205 266.378 132.033 266.436 131.859ZM260.261 140.725C260.219 140.73 260.178 140.734 260.137 140.741C260.063 140.749 259.991 140.762 259.917 140.775C259.863 140.785 259.809 140.796 259.754 140.807C259.672 140.82 259.589 140.84 259.509 140.858C259.468 140.867 259.428 140.877 259.389 140.888C259.359 140.895 259.33 140.904 259.301 140.911C259.284 140.916 259.268 140.92 259.251 140.925C259.152 140.952 259.051 140.98 258.954 141.012C258.905 141.026 258.857 141.043 258.809 141.059L258.807 141.06C258.678 141.102 258.553 141.147 258.429 141.196C258.414 141.202 258.4 141.207 258.385 141.213C258.325 141.236 258.264 141.259 258.204 141.285C258.168 141.299 258.133 141.315 258.098 141.33C258.08 141.339 258.061 141.347 258.043 141.355L258.041 141.355C257.482 141.599 256.948 141.896 256.446 142.242L256.446 142.244C256.394 142.279 256.341 142.315 256.29 142.352L256.137 142.464C256.115 142.479 256.095 142.496 256.072 142.513C255.992 142.574 255.913 142.637 255.832 142.699C255.813 142.714 255.795 142.728 255.777 142.743C255.733 142.779 255.691 142.815 255.649 142.851C255.605 142.886 255.563 142.922 255.523 142.959C255.439 143.031 255.356 143.106 255.275 143.182L255.274 143.184C255.286 143.454 255.303 143.723 255.321 143.99C255.324 144.035 255.329 144.077 255.333 144.121C255.48 143.995 255.628 143.871 255.779 143.751C255.8 143.733 255.823 143.715 255.844 143.697C255.87 143.677 255.894 143.656 255.92 143.635C255.996 143.575 256.071 143.515 256.147 143.455C256.236 143.387 256.325 143.319 256.413 143.253C256.434 143.235 256.457 143.219 256.479 143.202C256.523 143.168 256.566 143.135 256.611 143.102C256.928 142.867 257.252 142.64 257.578 142.42L257.579 142.418C257.583 142.418 257.586 142.416 257.589 142.413C257.625 142.39 257.663 142.365 257.698 142.342C257.723 142.325 257.748 142.308 257.776 142.293C257.779 142.29 257.78 142.288 257.783 142.287C257.832 142.253 257.884 142.22 257.937 142.188C257.956 142.176 257.975 142.164 257.994 142.151C258.104 142.078 258.217 142.007 258.333 141.938C258.35 141.925 258.369 141.915 258.387 141.904C258.42 141.882 258.454 141.862 258.487 141.842C258.616 141.762 258.746 141.683 258.878 141.607C258.992 141.539 259.105 141.473 259.224 141.409C259.24 141.4 259.258 141.389 259.274 141.38L259.275 141.378C259.387 141.316 259.494 141.256 259.604 141.193C259.761 141.106 259.917 141.02 260.076 140.932C260.214 140.855 260.355 140.778 260.495 140.7C260.417 140.707 260.338 140.715 260.259 140.726L260.261 140.725ZM262.864 131.592C262.767 131.604 262.668 131.621 262.572 131.638C262Line truncated
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 785 KiB After Width: | Height: | Size: 93 KiB |
@@ -1,7 +1,8 @@
|
|||||||
import { ArgTypes, Preview } from '@storybook/blocks';
|
import { ArgTypes } from '@storybook/blocks';
|
||||||
import { AutoSizeInput } from './AutoSizeInput';
|
import { AutoSizeInput } from './AutoSizeInput';
|
||||||
import { Field } from '../Forms/Field';
|
import { Field } from '../Forms/Field';
|
||||||
import { Icon } from '../Icon/Icon';
|
import { Icon } from '../Icon/Icon';
|
||||||
|
import { ExampleFrame } from '../../utils/storybook/ExampleFrame';
|
||||||
|
|
||||||
# AutoSizeInput
|
# AutoSizeInput
|
||||||
|
|
||||||
@@ -15,9 +16,9 @@ To add more context to the input, you can add either text or an icon before or a
|
|||||||
<AutoSizeInput prefix={<Icon name="search" />} />
|
<AutoSizeInput prefix={<Icon name="search" />} />
|
||||||
```
|
```
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<AutoSizeInput prefix={<Icon name="search" />} />
|
<AutoSizeInput prefix={<Icon name="search" />} />
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
## Usage in forms with Field
|
## Usage in forms with Field
|
||||||
|
|
||||||
@@ -29,9 +30,12 @@ Use `AutoSizeInput`with the`Field`component to get labels and descriptions. Also
|
|||||||
</Field>
|
</Field>
|
||||||
```
|
```
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<Field label="Important information!" description="Please enter the relevant information.">
|
<Field label="Important information!" description="Please enter the relevant information.">
|
||||||
<AutoSizeInput name="importantInput" required />
|
<AutoSizeInput name="importantInput" required />
|
||||||
</Field>
|
</Field>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
|
## Props
|
||||||
|
|
||||||
<ArgTypes of={AutoSizeInput} />
|
<ArgTypes of={AutoSizeInput} />
|
||||||
@@ -1,12 +1,16 @@
|
|||||||
import { ArgTypes, Preview } from '@storybook/blocks';
|
import { ArgTypes, Canvas } from '@storybook/blocks';
|
||||||
import { Input } from './Input';
|
import { Input } from './Input';
|
||||||
import { Field } from '../Forms/Field';
|
import { Field } from '../Forms/Field';
|
||||||
import { Icon } from '../Icon/Icon';
|
import { Icon } from '../Icon/Icon';
|
||||||
|
import * as InputStories from './Input.story';
|
||||||
|
import { ExampleFrame } from '../../utils/storybook/ExampleFrame';
|
||||||
|
|
||||||
# Input
|
# Input
|
||||||
|
|
||||||
Used for regular text input. For an array of data or tree-structured data, consider using `Select` or `Cascader` respectively.
|
Used for regular text input. For an array of data or tree-structured data, consider using `Select` or `Cascader` respectively.
|
||||||
|
|
||||||
|
<Canvas of={InputStories.Simple} />
|
||||||
|
|
||||||
## Prefix and suffix
|
## Prefix and suffix
|
||||||
|
|
||||||
To add more context to the input you can add either text or an icon before or after the input. You can use the `prefix` and `suffix` props for this. Try some examples in the Preview!
|
To add more context to the input you can add either text or an icon before or after the input. You can use the `prefix` and `suffix` props for this. Try some examples in the Preview!
|
||||||
@@ -15,9 +19,9 @@ To add more context to the input you can add either text or an icon before or af
|
|||||||
<Input prefix={<Icon name="search" />} />
|
<Input prefix={<Icon name="search" />} />
|
||||||
```
|
```
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<Input prefix={<Icon name="search" />} />
|
<Input prefix={<Icon name="search" />} />
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
## Usage in forms with Field
|
## Usage in forms with Field
|
||||||
|
|
||||||
@@ -29,12 +33,15 @@ To add more context to the input you can add either text or an icon before or af
|
|||||||
</Field>
|
</Field>
|
||||||
```
|
```
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<Field
|
<Field
|
||||||
label="Important information"
|
label="Important information"
|
||||||
description="This information is very important, so you really need to fill it in"
|
description="This information is very important, so you really need to fill it in"
|
||||||
>
|
>
|
||||||
<Input name="importantInput" required />
|
<Input name="importantInput" required />
|
||||||
</Field>
|
</Field>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
|
## Props
|
||||||
|
|
||||||
<ArgTypes of={Input} />
|
<ArgTypes of={Input} />
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
import { Preview, ArgTypes } from '@storybook/blocks';
|
import { Canvas, ArgTypes } from '@storybook/blocks';
|
||||||
import { Layout, HorizontalGroup, VerticalGroup } from './Layout';
|
import { Layout, HorizontalGroup, VerticalGroup } from './Layout';
|
||||||
import { Button } from '../Button';
|
import { Button } from '../Button';
|
||||||
import { Select } from '../index';
|
import { Select } from '../index';
|
||||||
|
import { ExampleFrame } from '../../utils/storybook/ExampleFrame';
|
||||||
|
import * as LayoutStories from './Layout.story';
|
||||||
|
|
||||||
# Layout
|
# Layout
|
||||||
|
|
||||||
@@ -19,78 +21,10 @@ Expects multiple elements as `children` prop. This is the base for more speciali
|
|||||||
|
|
||||||
Used for horizontally aligning several elements (e.g. Button, Select) with a predefined spacing between them.
|
Used for horizontally aligning several elements (e.g. Button, Select) with a predefined spacing between them.
|
||||||
|
|
||||||
<Preview>
|
<Canvas of={LayoutStories.Horizontal} />
|
||||||
<HorizontalGroup>
|
|
||||||
<Button>Button 1</Button>
|
|
||||||
<Button>Button 2</Button>
|
|
||||||
<Button>Button 3</Button>
|
|
||||||
</HorizontalGroup>
|
|
||||||
</Preview>
|
|
||||||
<Preview>
|
|
||||||
<HorizontalGroup>
|
|
||||||
<Select
|
|
||||||
width={25}
|
|
||||||
onChange={() => {}}
|
|
||||||
options={[
|
|
||||||
{ value: 1, label: 'Option 1' },
|
|
||||||
{ value: 2, label: 'Option 2' },
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
<Select
|
|
||||||
width={25}
|
|
||||||
onChange={() => {}}
|
|
||||||
options={[
|
|
||||||
{ value: 1, label: 'Option 1' },
|
|
||||||
{ value: 2, label: 'Option 2' },
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
<Select
|
|
||||||
width={25}
|
|
||||||
onChange={() => {}}
|
|
||||||
options={[
|
|
||||||
{ value: 1, label: 'Option 1' },
|
|
||||||
{ value: 2, label: 'Option 2' },
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</HorizontalGroup>
|
|
||||||
</Preview>
|
|
||||||
|
|
||||||
## Vertical
|
## Vertical
|
||||||
|
|
||||||
Used for vertically aligning several elements (e.g. Button, Select) with a predefined spacing between them.
|
Used for vertically aligning several elements (e.g. Button, Select) with a predefined spacing between them.
|
||||||
|
|
||||||
<Preview>
|
<Canvas of={LayoutStories.Vertical} />
|
||||||
<VerticalGroup>
|
|
||||||
<Button>Button 1</Button>
|
|
||||||
<Button>Button 2</Button>
|
|
||||||
<Button>Button 3</Button>
|
|
||||||
</VerticalGroup>
|
|
||||||
</Preview>
|
|
||||||
<Preview>
|
|
||||||
<VerticalGroup justify="center">
|
|
||||||
<Select
|
|
||||||
width={25}
|
|
||||||
onChange={() => {}}
|
|
||||||
options={[
|
|
||||||
{ value: 1, label: 'Option 1' },
|
|
||||||
{ value: 2, label: 'Option 2' },
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
<Select
|
|
||||||
width={25}
|
|
||||||
onChange={() => {}}
|
|
||||||
options={[
|
|
||||||
{ value: 1, label: 'Option 1' },
|
|
||||||
{ value: 2, label: 'Option 2' },
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
<Select
|
|
||||||
width={25}
|
|
||||||
onChange={() => {}}
|
|
||||||
options={[
|
|
||||||
{ value: 1, label: 'Option 1' },
|
|
||||||
{ value: 2, label: 'Option 2' },
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</VerticalGroup>
|
|
||||||
</Preview>
|
|
||||||
@@ -62,8 +62,9 @@ export default meta;
|
|||||||
export const Horizontal: StoryFn<LayoutProps> = (args) => {
|
export const Horizontal: StoryFn<LayoutProps> = (args) => {
|
||||||
return (
|
return (
|
||||||
<HorizontalGroup {...args}>
|
<HorizontalGroup {...args}>
|
||||||
|
<Button variant="secondary">Cancel</Button>
|
||||||
|
<Button variant="destructive">Delete</Button>
|
||||||
<Button>Save</Button>
|
<Button>Save</Button>
|
||||||
<Button>Cancel</Button>
|
|
||||||
</HorizontalGroup>
|
</HorizontalGroup>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -71,8 +72,9 @@ export const Horizontal: StoryFn<LayoutProps> = (args) => {
|
|||||||
export const Vertical: StoryFn<LayoutProps> = (args) => {
|
export const Vertical: StoryFn<LayoutProps> = (args) => {
|
||||||
return (
|
return (
|
||||||
<VerticalGroup {...args}>
|
<VerticalGroup {...args}>
|
||||||
|
<Button variant="secondary">Cancel</Button>
|
||||||
|
<Button variant="destructive">Delete</Button>
|
||||||
<Button>Save</Button>
|
<Button>Save</Button>
|
||||||
<Button>Cancel</Button>
|
|
||||||
</VerticalGroup>
|
</VerticalGroup>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import { Meta, Preview, ArgTypes } from '@storybook/blocks';
|
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
||||||
import { TextLink } from './TextLink';
|
import { TextLink } from './TextLink';
|
||||||
import { Basic } from './TextLink.story.tsx';
|
import * as TextLinkStories from './TextLink.story.tsx';
|
||||||
|
import { ExampleFrame } from '../../utils/storybook/ExampleFrame';
|
||||||
|
|
||||||
<Meta title="MDX|TextLink" component={TextLink} />
|
<Meta title="MDX|TextLink" component={TextLink} />
|
||||||
|
|
||||||
@@ -81,30 +82,26 @@ The following is the default behaviour and so, it will be applied according to i
|
|||||||
|
|
||||||
### <a name="inline-behaviour"/>**Inline**:<br/>
|
### <a name="inline-behaviour"/>**Inline**:<br/>
|
||||||
|
|
||||||
<Preview>
|
- _Initial appearence_: Blue and underlined at first.
|
||||||
<TextLink href="https://google.es" external inline>
|
- _On hover_: blue and not underlined
|
||||||
{'This an inline link example'}
|
|
||||||
</TextLink>
|
<Canvas of={TextLinkStories.Inline} />
|
||||||
</Preview>
|
|
||||||
- _Initial appearence_: Blue and underlined at first. - _On hover_: blue and not underlined
|
|
||||||
|
|
||||||
### <a name="standalone-behaviour"/>**Standalone**:
|
### <a name="standalone-behaviour"/>**Standalone**:
|
||||||
|
|
||||||
<Preview>
|
- _Initial appearence_: Blue and not underlined at first.
|
||||||
<TextLink href="https://google.es" inline={false} external>
|
- _On hover_: blue and underlined.
|
||||||
{'This an standalone link example'}
|
|
||||||
</TextLink>
|
<Canvas of={TextLinkStories.Standalone} />
|
||||||
</Preview>
|
|
||||||
- _Initial appearence_: Blue and not underlined at first. - _On hover_: blue and underlined.
|
|
||||||
|
|
||||||
_Example_: We should take into account that through the color prop the user will be able to change this value,
|
_Example_: We should take into account that through the color prop the user will be able to change this value,
|
||||||
but the rest will be kept. So, in this example, if the user renders an external and standalone _text link_ setting the color value to 'primary' the result will be a text link 'white' in dark theme or 'black' in light theme, as set by the user, and not underlined at first while blue and underlined when onhover, as it inherits from the standalone default behaviour.
|
but the rest will be kept. So, in this example, if the user renders an external and standalone _text link_ setting the color value to 'primary' the result will be a text link 'white' in dark theme or 'black' in light theme, as set by the user, and not underlined at first while blue and underlined when onhover, as it inherits from the standalone default behaviour.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<TextLink href="https://google.es" color="primary" inline={false} external>
|
<TextLink href="https://google.es" color="primary" inline={false} external>
|
||||||
{'This an external standalone link example'}
|
{'This an external standalone link example'}
|
||||||
</TextLink>
|
</TextLink>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
```jsx
|
```jsx
|
||||||
<TextLink href="https://google.es" color="primary" inline={false} external>
|
<TextLink href="https://google.es" color="primary" inline={false} external>
|
||||||
@@ -116,11 +113,11 @@ but the rest will be kept. So, in this example, if the user renders an external
|
|||||||
|
|
||||||
By default, **external _text links_** will show an `external-alt-icon`. If by design reasons, the user needs to set another icon it can be done through the correspondent prop.
|
By default, **external _text links_** will show an `external-alt-icon`. If by design reasons, the user needs to set another icon it can be done through the correspondent prop.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<TextLink href="https://google.es" external>
|
<TextLink href="https://google.es" external>
|
||||||
{'This an external with the default icon'}
|
{'This an external with the default icon'}
|
||||||
</TextLink>
|
</TextLink>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
```jsx
|
```jsx
|
||||||
<TextLink href="https://google.es" external>
|
<TextLink href="https://google.es" external>
|
||||||
@@ -130,11 +127,11 @@ By default, **external _text links_** will show an `external-alt-icon`. If by de
|
|||||||
|
|
||||||
Both, **external** and **internal** links can show a specific icon using the `icon` prop.
|
Both, **external** and **internal** links can show a specific icon using the `icon` prop.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<TextLink href="https://google.es" icon="google" external>
|
<TextLink href="https://google.es" icon="google" external>
|
||||||
{'This an external with a specific icon'}
|
{'This an external with a specific icon'}
|
||||||
</TextLink>
|
</TextLink>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
```jsx
|
```jsx
|
||||||
<TextLink href="https://google.es" icon="google" external>
|
<TextLink href="https://google.es" icon="google" external>
|
||||||
This an external with a specific icon
|
This an external with a specific icon
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ const meta: Meta = {
|
|||||||
inline: { control: 'boolean' },
|
inline: { control: 'boolean' },
|
||||||
},
|
},
|
||||||
args: {
|
args: {
|
||||||
href: 'https://www.google.com',
|
href: 'https://www.grafana.com',
|
||||||
external: true,
|
external: true,
|
||||||
icon: 'external-link-alt',
|
icon: 'external-link-alt',
|
||||||
},
|
},
|
||||||
@@ -67,14 +67,33 @@ Example.parameters = {
|
|||||||
controls: { exclude: ['href', 'external', 'variant', 'weight', 'color', 'inline', 'icon'] },
|
controls: { exclude: ['href', 'external', 'variant', 'weight', 'color', 'inline', 'icon'] },
|
||||||
};
|
};
|
||||||
|
|
||||||
export const Basic: StoryFn = (args) => {
|
export const Inline: StoryFn = (args) => {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
For more information{' '}
|
||||||
<TextLink href={args.href} {...args}>
|
<TextLink href={args.href} {...args}>
|
||||||
Go to Google
|
see Grafana.com
|
||||||
</TextLink>
|
</TextLink>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Inline.args = {
|
||||||
|
inline: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Standalone: StoryFn = (args) => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<TextLink href={args.href} {...args}>
|
||||||
|
Go to Grafana.com
|
||||||
|
</TextLink>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
Standalone.args = {
|
||||||
|
inline: false,
|
||||||
|
};
|
||||||
|
|
||||||
export default meta;
|
export default meta;
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Meta, Preview, ArgTypes } from '@storybook/blocks';
|
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
||||||
import { LoadingBar } from './LoadingBar';
|
import { LoadingBar } from './LoadingBar';
|
||||||
|
import * as LoadingBarStories from './LoadingBar.story';
|
||||||
|
|
||||||
<Meta title="MDX|LoadingBar" component={LoadingBar} />
|
<Meta title="MDX|LoadingBar" component={LoadingBar} />
|
||||||
|
|
||||||
@@ -7,16 +8,6 @@ import { LoadingBar } from './LoadingBar';
|
|||||||
|
|
||||||
The LoadingBar is used as a simple loading slider animation in the top of its container.
|
The LoadingBar is used as a simple loading slider animation in the top of its container.
|
||||||
|
|
||||||
<Preview>
|
<Canvas of={LoadingBarStories.Basic} />
|
||||||
<div style={{ height: '200px', width: '400px' }}>
|
|
||||||
<LoadingBar containerWidth={400} height={2} width={128} />
|
|
||||||
</div>
|
|
||||||
</Preview>
|
|
||||||
|
|
||||||
```jsx
|
|
||||||
<div style={{ height: '200px', width: '400px' }}>
|
|
||||||
<LoadingBar containerWidth={400} height={2} width={128} />
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
<ArgTypes of={LoadingBar} />
|
<ArgTypes of={LoadingBar} />
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { css } from '@emotion/css';
|
import { css } from '@emotion/css';
|
||||||
import { Meta, Preview } from '@storybook/blocks';
|
import { Meta, Canvas } from '@storybook/blocks';
|
||||||
import { PanelChrome } from './PanelChrome';
|
import { PanelChrome } from './PanelChrome';
|
||||||
|
|
||||||
import { action } from '@storybook/addon-actions';
|
import { action } from '@storybook/addon-actions';
|
||||||
@@ -8,6 +8,8 @@ import { Button } from '../Button';
|
|||||||
import { Menu } from '../Menu/Menu';
|
import { Menu } from '../Menu/Menu';
|
||||||
import { Stack } from '../Layout/Stack/Stack';
|
import { Stack } from '../Layout/Stack/Stack';
|
||||||
import { IconButton } from '../IconButton/IconButton';
|
import { IconButton } from '../IconButton/IconButton';
|
||||||
|
import * as PanelChromeStories from './PanelChrome.story';
|
||||||
|
import { ExampleFrame } from '../../utils/storybook/ExampleFrame';
|
||||||
|
|
||||||
<Meta title="MDX|PanelChrome" component={PanelChrome} />
|
<Meta title="MDX|PanelChrome" component={PanelChrome} />
|
||||||
|
|
||||||
@@ -17,97 +19,11 @@ Component used for rendering content wrapped in the same style as grafana panels
|
|||||||
|
|
||||||
### Basic Usage: Title, Description and Content
|
### Basic Usage: Title, Description and Content
|
||||||
|
|
||||||
```tsx
|
<Canvas of={PanelChromeStories.Basic} />
|
||||||
<PanelChrome
|
|
||||||
title="My awesome panel title"
|
|
||||||
description="Here I will put a description that explains a bit more this panel"
|
|
||||||
width={400}
|
|
||||||
height={200}
|
|
||||||
>
|
|
||||||
{(innerwidth, innerheight) => {
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
width: innerwidth,
|
|
||||||
height: innerheight,
|
|
||||||
background: 'white',
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'center',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
New panel with old API
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
</PanelChrome>
|
|
||||||
```
|
|
||||||
|
|
||||||
<Preview>
|
|
||||||
<PanelChrome
|
|
||||||
title="My awesome panel title"
|
|
||||||
description="Here I will put a description that explains a bit more this panel"
|
|
||||||
width={400}
|
|
||||||
height={200}
|
|
||||||
>
|
|
||||||
{(innerwidth, innerheight) => {
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
width: innerwidth,
|
|
||||||
height: innerheight,
|
|
||||||
background: 'rgba(230,0,0,0.05)',
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'center',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Content
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
</PanelChrome>
|
|
||||||
</Preview>
|
|
||||||
|
|
||||||
### Menu: Standard & Hover
|
### Menu: Standard & Hover
|
||||||
|
|
||||||
```tsx
|
<ExampleFrame>
|
||||||
<PanelChrome
|
|
||||||
title="My awesome panel title"
|
|
||||||
hoverHeader={<true || false>}
|
|
||||||
menu={() => (
|
|
||||||
<Menu>
|
|
||||||
<Menu.Item label="View" icon="eye" />
|
|
||||||
<Menu.Item label="Edit" icon="edit" />
|
|
||||||
<Menu.Item label="Share" icon="share-alt" />
|
|
||||||
<Menu.Divider />
|
|
||||||
<Menu.Item label="Remove" icon="trash-alt" />
|
|
||||||
</Menu>
|
|
||||||
)}
|
|
||||||
description="Here I will put a description that explains a bit more this panel"
|
|
||||||
width={400}
|
|
||||||
height={200}
|
|
||||||
>
|
|
||||||
{(innerwidth, innerheight) => {
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
width: innerwidth,
|
|
||||||
height: innerheight,
|
|
||||||
background: 'white',
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'center',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
New panel with old API
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
</PanelChrome>
|
|
||||||
```
|
|
||||||
|
|
||||||
<Preview>
|
|
||||||
|
|
||||||
<Stack gap={2} alignItems="flex-start" wrap="wrap">
|
<Stack gap={2} alignItems="flex-start" wrap="wrap">
|
||||||
<PanelChrome
|
<PanelChrome
|
||||||
@@ -183,7 +99,7 @@ Component used for rendering content wrapped in the same style as grafana panels
|
|||||||
|
|
||||||
</PanelChrome>
|
</PanelChrome>
|
||||||
</Stack>
|
</Stack>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
### States: Loading , Streaming, Error
|
### States: Loading , Streaming, Error
|
||||||
|
|
||||||
@@ -215,7 +131,7 @@ Component used for rendering content wrapped in the same style as grafana panels
|
|||||||
</PanelChrome>
|
</PanelChrome>
|
||||||
```
|
```
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
|
|
||||||
<Stack gap={2} alignItems="flex-start" wrap="wrap">
|
<Stack gap={2} alignItems="flex-start" wrap="wrap">
|
||||||
<PanelChrome
|
<PanelChrome
|
||||||
@@ -298,7 +214,7 @@ Component used for rendering content wrapped in the same style as grafana panels
|
|||||||
|
|
||||||
</PanelChrome>
|
</PanelChrome>
|
||||||
</Stack>
|
</Stack>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
### Extra options? Title items and actions
|
### Extra options? Title items and actions
|
||||||
|
|
||||||
@@ -345,7 +261,7 @@ Component used for rendering content wrapped in the same style as grafana panels
|
|||||||
</PanelChrome>
|
</PanelChrome>
|
||||||
```
|
```
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<PanelChrome
|
<PanelChrome
|
||||||
title="My awesome panel title"
|
title="My awesome panel title"
|
||||||
titleItems={
|
titleItems={
|
||||||
@@ -386,7 +302,7 @@ Component used for rendering content wrapped in the same style as grafana panels
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
</PanelChrome>
|
</PanelChrome>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
### Migration from old PanelChrome (before v9.4.0)
|
### Migration from old PanelChrome (before v9.4.0)
|
||||||
|
|
||||||
@@ -418,7 +334,7 @@ Component used for rendering content wrapped in the same style as grafana panels
|
|||||||
</PanelChrome>
|
</PanelChrome>
|
||||||
```
|
```
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<PanelChrome
|
<PanelChrome
|
||||||
title="My awesome panel title"
|
title="My awesome panel title"
|
||||||
leftItems={[
|
leftItems={[
|
||||||
@@ -448,7 +364,7 @@ Component used for rendering content wrapped in the same style as grafana panels
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
</PanelChrome>
|
</PanelChrome>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
#### After
|
#### After
|
||||||
|
|
||||||
```tsx
|
```tsx
|
||||||
@@ -478,7 +394,7 @@ Component used for rendering content wrapped in the same style as grafana panels
|
|||||||
</PanelChrome>
|
</PanelChrome>
|
||||||
```
|
```
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<PanelChrome
|
<PanelChrome
|
||||||
title="My awesome panel title"
|
title="My awesome panel title"
|
||||||
loadingState={LoadingState.Loading}
|
loadingState={LoadingState.Loading}
|
||||||
@@ -503,7 +419,7 @@ Component used for rendering content wrapped in the same style as grafana panels
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
</PanelChrome>
|
</PanelChrome>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
### Collapsible
|
### Collapsible
|
||||||
|
|
||||||
@@ -545,7 +461,7 @@ function Container() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<PanelChrome title="My awesome panel title" width={400} height={200} collapsible={true}>
|
<PanelChrome title="My awesome panel title" width={400} height={200} collapsible={true}>
|
||||||
{(innerwidth, innerheight) => {
|
{(innerwidth, innerheight) => {
|
||||||
return (
|
return (
|
||||||
@@ -564,4 +480,4 @@ function Container() {
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
</PanelChrome>
|
</PanelChrome>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
@@ -9,6 +9,7 @@ import { selectors } from '@grafana/e2e-selectors';
|
|||||||
import { useStyles2, useTheme2 } from '../../themes';
|
import { useStyles2, useTheme2 } from '../../themes';
|
||||||
import { getFocusStyles } from '../../themes/mixins';
|
import { getFocusStyles } from '../../themes/mixins';
|
||||||
import { DelayRender } from '../../utils/DelayRender';
|
import { DelayRender } from '../../utils/DelayRender';
|
||||||
|
import { useElementSelection } from '../ElementSelectionContext/ElementSelectionContext';
|
||||||
import { Icon } from '../Icon/Icon';
|
import { Icon } from '../Icon/Icon';
|
||||||
import { LoadingBar } from '../LoadingBar/LoadingBar';
|
import { LoadingBar } from '../LoadingBar/LoadingBar';
|
||||||
import { Text } from '../Text/Text';
|
import { Text } from '../Text/Text';
|
||||||
@@ -33,6 +34,7 @@ interface BaseProps {
|
|||||||
menu?: ReactElement | (() => ReactElement);
|
menu?: ReactElement | (() => ReactElement);
|
||||||
dragClass?: string;
|
dragClass?: string;
|
||||||
dragClassCancel?: string;
|
dragClassCancel?: string;
|
||||||
|
selectionId?: string;
|
||||||
/**
|
/**
|
||||||
* Use only to indicate loading or streaming data in the panel.
|
* Use only to indicate loading or streaming data in the panel.
|
||||||
* Any other values of loadingState are ignored.
|
* Any other values of loadingState are ignored.
|
||||||
@@ -131,6 +133,7 @@ export function PanelChrome({
|
|||||||
statusMessageOnClick,
|
statusMessageOnClick,
|
||||||
leftItems,
|
leftItems,
|
||||||
actions,
|
actions,
|
||||||
|
selectionId,
|
||||||
onCancelQuery,
|
onCancelQuery,
|
||||||
onOpenMenu,
|
onOpenMenu,
|
||||||
collapsible = false,
|
collapsible = false,
|
||||||
@@ -145,6 +148,7 @@ export function PanelChrome({
|
|||||||
const styles = useStyles2(getStyles);
|
const styles = useStyles2(getStyles);
|
||||||
const panelContentId = useId();
|
const panelContentId = useId();
|
||||||
const panelTitleId = useId().replace(/:/g, '_');
|
const panelTitleId = useId().replace(/:/g, '_');
|
||||||
|
const { isSelected, onSelect } = useElementSelection(selectionId);
|
||||||
|
|
||||||
const hasHeader = !hoverHeader;
|
const hasHeader = !hoverHeader;
|
||||||
|
|
||||||
@@ -263,7 +267,11 @@ export function PanelChrome({
|
|||||||
return (
|
return (
|
||||||
// tabIndex={0} is needed for keyboard accessibility in the plot area
|
// tabIndex={0} is needed for keyboard accessibility in the plot area
|
||||||
<section
|
<section
|
||||||
className={cx(styles.container, { [styles.transparentContainer]: isPanelTransparent })}
|
className={cx(
|
||||||
|
styles.container,
|
||||||
|
isPanelTransparent && styles.transparentContainer,
|
||||||
|
isSelected && 'dashboard-selected-element'
|
||||||
|
)}
|
||||||
style={containerStyles}
|
style={containerStyles}
|
||||||
aria-labelledby={!!title ? panelTitleId : undefined}
|
aria-labelledby={!!title ? panelTitleId : undefined}
|
||||||
data-testid={testid}
|
data-testid={testid}
|
||||||
@@ -300,7 +308,12 @@ export function PanelChrome({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{hasHeader && (
|
{hasHeader && (
|
||||||
<div className={cx(styles.headerContainer, dragClass)} style={headerStyles} data-testid="header-container">
|
<div
|
||||||
|
className={cx(styles.headerContainer, dragClass)}
|
||||||
|
style={headerStyles}
|
||||||
|
data-testid="header-container"
|
||||||
|
onPointerUp={onSelect}
|
||||||
|
>
|
||||||
{statusMessage && (
|
{statusMessage && (
|
||||||
<div className={dragClassCancel}>
|
<div className={dragClassCancel}>
|
||||||
<PanelStatus message={statusMessage} onClick={statusMessageOnClick} ariaLabel="Panel status" />
|
<PanelStatus message={statusMessage} onClick={statusMessageOnClick} ariaLabel="Panel status" />
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Meta, Preview, ArgTypes } from '@storybook/blocks';
|
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
||||||
import { PluginSignatureBadge } from './PluginSignatureBadge';
|
import { PluginSignatureBadge } from './PluginSignatureBadge';
|
||||||
|
import { ExampleFrame } from '../../utils/storybook/ExampleFrame';
|
||||||
|
|
||||||
<Meta title="MDX|PluginSignatureBadge" component={PluginSignatureBadge} />
|
<Meta title="MDX|PluginSignatureBadge" component={PluginSignatureBadge} />
|
||||||
|
|
||||||
@@ -12,32 +13,32 @@ This is a security measure to make sure plugins haven't been tampered with. Upon
|
|||||||
|
|
||||||
1.- Core: this badge indicates that the plugin has been built into Grafana.
|
1.- Core: this badge indicates that the plugin has been built into Grafana.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<PluginSignatureBadge status="internal" />
|
<PluginSignatureBadge status="internal" />
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
2.- Signed: the plugin's signature was successfully verified.
|
2.- Signed: the plugin's signature was successfully verified.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<PluginSignatureBadge status="valid" />
|
<PluginSignatureBadge status="valid" />
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
3.- Invalid signature: this plugin has a invalid signature.
|
3.- Invalid signature: this plugin has a invalid signature.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<PluginSignatureBadge status="invalid" />
|
<PluginSignatureBadge status="invalid" />
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
4.- Modified signature: this plugin has changed since it was signed. This may indicate malicious intent.
|
4.- Modified signature: this plugin has changed since it was signed. This may indicate malicious intent.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<PluginSignatureBadge status="modified" />
|
<PluginSignatureBadge status="modified" />
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
5.- Unsigned: the plugin is not signed. In this case, as upon loading Grafana checks the plugins signature, Grafana will not load or start it. Furthermore, it will write an error message to the server log.
|
5.- Unsigned: the plugin is not signed. In this case, as upon loading Grafana checks the plugins signature, Grafana will not load or start it. Furthermore, it will write an error message to the server log.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<PluginSignatureBadge status="unsigned" />
|
<PluginSignatureBadge status="unsigned" />
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
<ArgTypes of={PluginSignatureBadge} />
|
<ArgTypes of={PluginSignatureBadge} />
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Meta, Preview, ArgTypes } from '@storybook/blocks';
|
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
||||||
import { RefreshPicker } from './RefreshPicker';
|
import { RefreshPicker } from './RefreshPicker';
|
||||||
|
import * as RefreshPickerStories from './RefreshPicker.story';
|
||||||
|
|
||||||
<Meta title="MDX|RefreshPicker" component={RefreshPicker} />
|
<Meta title="MDX|RefreshPicker" component={RefreshPicker} />
|
||||||
|
|
||||||
@@ -11,10 +12,6 @@ This component is used on dashboards to refresh visualizations. Grafana does not
|
|||||||
|
|
||||||
**The down arrow:** will display a list of refresh intervals. If one of them is selected the dashboard will regularly refresh according to that schedule.
|
**The down arrow:** will display a list of refresh intervals. If one of them is selected the dashboard will regularly refresh according to that schedule.
|
||||||
|
|
||||||
<Preview>
|
<Canvas of={RefreshPickerStories.Examples} />
|
||||||
<RefreshPicker tooltip="Run query" />
|
|
||||||
<RefreshPicker text="Run query" tooltip="Run query" />
|
|
||||||
<RefreshPicker text="Run query" isLoading={true} tooltip="Run query" value="1h" />
|
|
||||||
</Preview>
|
|
||||||
|
|
||||||
<ArgTypes of={RefreshPicker} />
|
<ArgTypes of={RefreshPicker} />
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
import { ArgTypes } from '@storybook/blocks';
|
import { Meta, ArgTypes } from '@storybook/blocks';
|
||||||
import { RenderUserContentAsHTML } from './RenderUserContentAsHTML';
|
import { RenderUserContentAsHTML } from './RenderUserContentAsHTML';
|
||||||
|
|
||||||
<Meta title="MDX|RenderUserContentAsHTML" component={RenderUserContentAsHTML} />
|
<Meta title="MDX|RenderUserContentAsHTML" component={RenderUserContentAsHTML} />
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Meta, Preview, ArgTypes } from '@storybook/blocks';
|
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
||||||
import { Spinner } from './Spinner';
|
import { Spinner } from './Spinner';
|
||||||
|
import * as SpinnerStories from './Spinner.story';
|
||||||
|
|
||||||
<Meta title="MDX|Spinner" component={Spinner} />
|
<Meta title="MDX|Spinner" component={Spinner} />
|
||||||
|
|
||||||
@@ -7,11 +8,6 @@ import { Spinner } from './Spinner';
|
|||||||
|
|
||||||
Spinner is `fa-spinner` icon animated. It is used to alert a user to wait for an activity to complete.
|
Spinner is `fa-spinner` icon animated. It is used to alert a user to wait for an activity to complete.
|
||||||
|
|
||||||
<Preview>
|
<Canvas of={SpinnerStories.Basic} />
|
||||||
<div>
|
|
||||||
<Spinner />
|
|
||||||
<Spinner className="my-spin-div" iconClassName="my-spinner-classname" size={24} />
|
|
||||||
</div>
|
|
||||||
</Preview>
|
|
||||||
|
|
||||||
<ArgTypes of={Spinner} />
|
<ArgTypes of={Spinner} />
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Meta, Preview, ArgTypes } from '@storybook/blocks';
|
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
||||||
import { Tag } from './Tag';
|
import { Tag } from './Tag';
|
||||||
|
import * as TagStories from './Tag.story';
|
||||||
|
|
||||||
<Meta title="MDX|Tag" component={Tag} />
|
<Meta title="MDX|Tag" component={Tag} />
|
||||||
|
|
||||||
@@ -7,19 +8,7 @@ import { Tag } from './Tag';
|
|||||||
|
|
||||||
Used for displaying metadata, for example to add more details to search results. Background and border colors are generated from the tag name.
|
Used for displaying metadata, for example to add more details to search results. Background and border colors are generated from the tag name.
|
||||||
|
|
||||||
<Preview>
|
<Canvas of={TagStories.Single} />
|
||||||
<div>
|
|
||||||
<Tag name="Tag" onClick={(name) => console.log(name)} />
|
|
||||||
</div>
|
|
||||||
</Preview>
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
```jsx
|
|
||||||
import { Tag } from '@grafana/ui';
|
|
||||||
|
|
||||||
<Tag name="Tag" onClick={(name) => console.log(name)} />;
|
|
||||||
```
|
|
||||||
|
|
||||||
### Props
|
### Props
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,12 @@
|
|||||||
import { Preview, ArgTypes } from '@storybook/blocks';
|
import { Canvas, ArgTypes } from '@storybook/blocks';
|
||||||
import { TagList } from './TagList';
|
import { TagList } from './TagList';
|
||||||
|
import * as TagListStories from './TagList.story';
|
||||||
|
|
||||||
# TagList
|
# TagList
|
||||||
|
|
||||||
List of tags with predefined margins and positioning.
|
List of tags with predefined margins and positioning.
|
||||||
|
|
||||||
<Preview>
|
<Canvas of={TagListStories.List} />
|
||||||
<TagList tags={['datasource-test', 'gdev', 'mysql', 'mssql']} />
|
|
||||||
</Preview>
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
```jsx
|
|
||||||
import { TagList } from '@grafana/ui';
|
|
||||||
const tags = ['datasource-test', 'gdev', 'mysql', 'mssql'];
|
|
||||||
|
|
||||||
<TagList tags={tags} onClick={(tag) => console.log(tag)} />;
|
|
||||||
```
|
|
||||||
|
|
||||||
### Props
|
### Props
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import { Meta, Preview, ArgTypes } from '@storybook/blocks';
|
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
||||||
import { Text } from './Text';
|
import { Text } from './Text';
|
||||||
import { TextLink } from '../Link/TextLink.tsx';
|
import { TextLink } from '../Link/TextLink.tsx';
|
||||||
import { Basic } from './Text.story.tsx';
|
import { Basic } from './Text.story.tsx';
|
||||||
import { Tooltip } from '../Tooltip';
|
import { Tooltip } from '../Tooltip';
|
||||||
|
import { ExampleFrame } from '../../utils/storybook/ExampleFrame';
|
||||||
|
|
||||||
<Meta title="MDX|Text" component={Text} />
|
<Meta title="MDX|Text" component={Text} />
|
||||||
|
|
||||||
@@ -65,14 +66,14 @@ The following is the default behaviour and so, it will be applied according to i
|
|||||||
|
|
||||||
The Text component is mainly comprised by itself. In occasions, the Text component can have another Text or TextLink component as a child.
|
The Text component is mainly comprised by itself. In occasions, the Text component can have another Text or TextLink component as a child.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<Text color="primary" element="p">
|
<Text color="primary" element="p">
|
||||||
{'If you need more help of how to write in Grafana you can go to our '}
|
{'If you need more help of how to write in Grafana you can go to our '}
|
||||||
<TextLink href="https://grafana.com/docs/writers-toolkit/" external>
|
<TextLink href="https://grafana.com/docs/writers-toolkit/" external>
|
||||||
{'Writer’s Toolkit'}
|
{'Writer’s Toolkit'}
|
||||||
</TextLink>
|
</TextLink>
|
||||||
</Text>
|
</Text>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
```jsx
|
```jsx
|
||||||
<Text color="primary" element="p">
|
<Text color="primary" element="p">
|
||||||
@@ -83,12 +84,12 @@ The Text component is mainly comprised by itself. In occasions, the Text compone
|
|||||||
</Text>
|
</Text>
|
||||||
```
|
```
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<Text color="primary" element="p">
|
<Text color="primary" element="p">
|
||||||
{'And Forrest Gump said: '}
|
{'And Forrest Gump said: '}
|
||||||
<Text italic>{"Life is like a box of chocolates. You never know what you're gonna get."}</Text>
|
<Text italic>{"Life is like a box of chocolates. You never know what you're gonna get."}</Text>
|
||||||
</Text>
|
</Text>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
```jsx
|
```jsx
|
||||||
<Text color="primary" element="p">
|
<Text color="primary" element="p">
|
||||||
@@ -104,23 +105,23 @@ The Text component can be truncated. However, the Text component element rendere
|
|||||||
1. The parent element is a Text component: the user just has to set the element prop to another value and the truncate prop to true.
|
1. The parent element is a Text component: the user just has to set the element prop to another value and the truncate prop to true.
|
||||||
As a result, the Text will be truncated but when the user hovers over it the full text will be seen on a tooltip.
|
As a result, the Text will be truncated but when the user hovers over it the full text will be seen on a tooltip.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<Text color="primary" element="p" truncate>
|
<Text color="primary" element="p" truncate>
|
||||||
{'And Forrest Gump said: '}
|
{'And Forrest Gump said: '}
|
||||||
<Text italic>{'Life is like a box of chocolates. You never know what you are gonna get.'}</Text>
|
<Text italic>{'Life is like a box of chocolates. You never know what you are gonna get.'}</Text>
|
||||||
</Text>
|
</Text>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
```jsx
|
```jsx
|
||||||
<Text color="primary" element="p" truncate>
|
<Text color="primary" element="p" truncate>
|
||||||
And Forrest Gump said:
|
And Forrest Gump said:
|
||||||
<Text italic>{'Life is like a box of chocolates. You never know what you are gonna get.'}</Text>
|
<Text italic>Life is like a box of chocolates. You never know what you are gonna get.</Text>
|
||||||
</Text>
|
</Text>
|
||||||
```
|
```
|
||||||
|
|
||||||
2. The parent element is not a Text component: the user has to add `overflow: hidden`, `text-overflow: ellipsis` and `whiteSpace: 'nowrap'` to it. In this case, the user should wrap up this container with a Tooltip, so when the text is truncated its content can still be seen hovering on the text.
|
2. The parent element is not a Text component: the user has to add `overflow: hidden`, `text-overflow: ellipsis` and `whiteSpace: 'nowrap'` to it. In this case, the user should wrap up this container with a Tooltip, so when the text is truncated its content can still be seen hovering on the text.
|
||||||
|
|
||||||
<Preview>
|
<ExampleFrame>
|
||||||
<Tooltip content="This is a example of a span element truncated by its parent container">
|
<Tooltip content="This is a example of a span element truncated by its parent container">
|
||||||
<div style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
<div style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
||||||
<Text color="primary" variant="body">
|
<Text color="primary" variant="body">
|
||||||
@@ -128,7 +129,7 @@ The Text component can be truncated. However, the Text component element rendere
|
|||||||
</Text>
|
</Text>
|
||||||
</div>
|
</div>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
```jsx
|
```jsx
|
||||||
<Tooltip content="This is a example of a span element truncated by its parent container">
|
<Tooltip content="This is a example of a span element truncated by its parent container">
|
||||||
<div style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
<div style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import { ArgTypes, Preview } from '@storybook/blocks';
|
import { ArgTypes, Canvas } from '@storybook/blocks';
|
||||||
import { Field } from '../Forms/Field';
|
import { Field } from '../Forms/Field';
|
||||||
import { TextArea } from './TextArea';
|
import { TextArea } from './TextArea';
|
||||||
|
import * as TextAreaStories from './TextArea.story';
|
||||||
|
import { ExampleFrame } from '../../utils/storybook/ExampleFrame';
|
||||||
|
|
||||||
# TextArea
|
# TextArea
|
||||||
|
|
||||||
@@ -8,27 +10,19 @@ Use for multi line inputs like descriptions.
|
|||||||
|
|
||||||
### Usage
|
### Usage
|
||||||
|
|
||||||
```jsx
|
<Canvas of={TextAreaStories.Basic} />
|
||||||
<TextArea invalid={invalid} placeholder={placeholder} cols={cols} disabled={disabled} />
|
|
||||||
```
|
|
||||||
|
|
||||||
### Usage in forms with Field
|
### Usage in forms with Field
|
||||||
|
|
||||||
`TextArea` should be used with the `Field` component to get labels and descriptions. It can also be used for validation by using the `required` attribute. See the `Field` component for more information.
|
`TextArea` should be used with the `Field` component to get labels and descriptions. It can also be used for validation by using the `required` attribute. See the `Field` component for more information.
|
||||||
|
|
||||||
```jsx
|
<ExampleFrame>
|
||||||
<Field label="Important information" description="This information is very important, so you really need to fill it in">
|
|
||||||
<TextArea name="importantTextarea" required />
|
|
||||||
</Field>
|
|
||||||
```
|
|
||||||
|
|
||||||
<Preview>
|
|
||||||
<Field
|
<Field
|
||||||
label="Important information"
|
label="Important information"
|
||||||
description="This information is very important, so you really need to fill it in"
|
description="This information is very important, so you really need to fill it in"
|
||||||
>
|
>
|
||||||
<TextArea name="importantTextarea" required />
|
<TextArea name="importantTextarea" required />
|
||||||
</Field>
|
</Field>
|
||||||
</Preview>
|
</ExampleFrame>
|
||||||
|
|
||||||
<ArgTypes of={TextArea} />
|
<ArgTypes of={TextArea} />
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
/** @jsxRuntime classic */
|
/** @jsxRuntime classic */
|
||||||
import { css, cx } from '@emotion/css';
|
import { css, cx } from '@emotion/css';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
import { Profiler, ProfilerOnRenderCallback, useState, FC } from 'react';
|
import React, { Profiler, ProfilerOnRenderCallback, useState, FC } from 'react';
|
||||||
|
|
||||||
import { GrafanaTheme2 } from '@grafana/data';
|
import { GrafanaTheme2 } from '@grafana/data';
|
||||||
|
|
||||||
|
|||||||
@@ -159,6 +159,10 @@ const getStyles = (theme: GrafanaTheme2) => {
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
|
|
||||||
|
[theme.breakpoints.down('md')]: {
|
||||||
|
width: 'auto !important',
|
||||||
|
},
|
||||||
|
|
||||||
'&:focus, &:focus-visible': {
|
'&:focus, &:focus-visible': {
|
||||||
...getFocusStyles(theme),
|
...getFocusStyles(theme),
|
||||||
zIndex: 1,
|
zIndex: 1,
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
import { ArgTypes } from '@storybook/blocks';
|
|
||||||
import { UnitPicker } from './UnitPicker';
|
|
||||||
|
|
||||||
# UnitPicker
|
|
||||||
|
|
||||||
<ArgTypes of={UnitPicker} />{' '}
|
|
||||||
@@ -2,7 +2,6 @@ import { action } from '@storybook/addon-actions';
|
|||||||
import { Meta, StoryFn } from '@storybook/react';
|
import { Meta, StoryFn } from '@storybook/react';
|
||||||
|
|
||||||
import { UnitPicker, UnitPickerProps } from './UnitPicker';
|
import { UnitPicker, UnitPickerProps } from './UnitPicker';
|
||||||
import mdx from './UnitPicker.mdx';
|
|
||||||
|
|
||||||
const meta: Meta<typeof UnitPicker> = {
|
const meta: Meta<typeof UnitPicker> = {
|
||||||
title: 'Pickers and Editors/UnitPicker',
|
title: 'Pickers and Editors/UnitPicker',
|
||||||
@@ -11,7 +10,6 @@ const meta: Meta<typeof UnitPicker> = {
|
|||||||
controls: {
|
controls: {
|
||||||
exclude: ['onChange', 'value'],
|
exclude: ['onChange', 'value'],
|
||||||
},
|
},
|
||||||
docs: mdx,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -322,3 +322,9 @@ export { type GraphNGLegendEvent } from '../graveyard/GraphNG/types';
|
|||||||
|
|
||||||
export { ZoomPlugin } from '../graveyard/uPlot/plugins/ZoomPlugin';
|
export { ZoomPlugin } from '../graveyard/uPlot/plugins/ZoomPlugin';
|
||||||
export { TooltipPlugin } from '../graveyard/uPlot/plugins/TooltipPlugin';
|
export { TooltipPlugin } from '../graveyard/uPlot/plugins/TooltipPlugin';
|
||||||
|
|
||||||
|
export {
|
||||||
|
ElementSelectionContext,
|
||||||
|
useElementSelection,
|
||||||
|
type ElementSelectionContextState,
|
||||||
|
} from './ElementSelectionContext/ElementSelectionContext';
|
||||||
@@ -67,5 +67,11 @@ export function getDashboardGridStyles(theme: GrafanaTheme2) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'.dashboard-selected-element': {
|
||||||
|
outline: `2px dashed ${theme.colors.primary.border}`,
|
||||||
|
outlineOffset: '0px',
|
||||||
|
borderRadius: '2px',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
import { css } from '@emotion/css';
|
||||||
|
import { Unstyled } from '@storybook/blocks';
|
||||||
|
import { ReactNode } from 'react';
|
||||||
|
|
||||||
|
import { GrafanaTheme2 } from '@grafana/data';
|
||||||
|
|
||||||
|
import { useStyles2 } from '../../themes';
|
||||||
|
|
||||||
|
interface ExampleFrameProps {
|
||||||
|
children: ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps children with a border for nicer presentation in Storybook docs.
|
||||||
|
*
|
||||||
|
* This is intended to be used temporarily to move away from our <Preview> patch until
|
||||||
|
* we have something more long term.
|
||||||
|
*/
|
||||||
|
export function ExampleFrame(props: ExampleFrameProps) {
|
||||||
|
const { children } = props;
|
||||||
|
const styles = useStyles2(getStyles);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Unstyled>
|
||||||
|
<div className={styles.container}>{children}</div>
|
||||||
|
</Unstyled>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getStyles = (theme: GrafanaTheme2) => {
|
||||||
|
return {
|
||||||
|
container: css({
|
||||||
|
border: `1px solid ${theme.colors.border.medium}`,
|
||||||
|
borderRadius: theme.shape.radius.default,
|
||||||
|
padding: theme.spacing(2),
|
||||||
|
marginBottom: theme.spacing(4),
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -4,6 +4,7 @@ import * as React from 'react';
|
|||||||
import { useDarkMode } from 'storybook-dark-mode';
|
import { useDarkMode } from 'storybook-dark-mode';
|
||||||
|
|
||||||
import { GrafanaLight, GrafanaDark } from '../../../.storybook/storybookTheme';
|
import { GrafanaLight, GrafanaDark } from '../../../.storybook/storybookTheme';
|
||||||
|
import { GlobalStyles } from '../../themes';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
context: DocsContextProps;
|
context: DocsContextProps;
|
||||||
@@ -15,6 +16,7 @@ export const ThemedDocsContainer = ({ children, context }: Props) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<DocsContainer theme={dark ? GrafanaDark : GrafanaLight} context={context}>
|
<DocsContainer theme={dark ? GrafanaDark : GrafanaLight} context={context}>
|
||||||
|
<GlobalStyles />
|
||||||
{children}
|
{children}
|
||||||
</DocsContainer>
|
</DocsContainer>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -134,17 +134,17 @@ require (
|
|||||||
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
go.uber.org/zap v1.27.0 // indirect
|
go.uber.org/zap v1.27.0 // indirect
|
||||||
golang.org/x/crypto v0.28.0 // indirect
|
golang.org/x/crypto v0.29.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect
|
||||||
golang.org/x/mod v0.21.0 // indirect
|
golang.org/x/mod v0.22.0 // indirect
|
||||||
golang.org/x/net v0.30.0 // indirect
|
golang.org/x/net v0.31.0 // indirect
|
||||||
golang.org/x/oauth2 v0.23.0 // indirect
|
golang.org/x/oauth2 v0.23.0 // indirect
|
||||||
golang.org/x/sync v0.9.0 // indirect
|
golang.org/x/sync v0.9.0 // indirect
|
||||||
golang.org/x/sys v0.27.0 // indirect
|
golang.org/x/sys v0.27.0 // indirect
|
||||||
golang.org/x/term v0.25.0 // indirect
|
golang.org/x/term v0.26.0 // indirect
|
||||||
golang.org/x/text v0.20.0 // indirect
|
golang.org/x/text v0.20.0 // indirect
|
||||||
golang.org/x/time v0.6.0 // indirect
|
golang.org/x/time v0.6.0 // indirect
|
||||||
golang.org/x/tools v0.26.0 // indirect
|
golang.org/x/tools v0.27.0 // indirect
|
||||||
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect
|
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect
|
||||||
gonum.org/v1/gonum v0.15.1 // indirect
|
gonum.org/v1/gonum v0.15.1 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20240820151423-278611b39280 // indirect
|
google.golang.org/genproto v0.0.0-20240820151423-278611b39280 // indirect
|
||||||
|
|||||||
+10
-10
@@ -381,8 +381,8 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
|
|||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
|
golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
|
||||||
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
|
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
||||||
@@ -392,8 +392,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
|
|||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
|
||||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@@ -403,8 +403,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
|
|||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
||||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
||||||
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
@@ -433,8 +433,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
||||||
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
|
golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
|
||||||
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
|
golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
||||||
@@ -452,8 +452,8 @@ golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtn
|
|||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
|
golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o=
|
||||||
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
|
golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import (
|
|||||||
glog "github.com/grafana/grafana/pkg/infra/log"
|
glog "github.com/grafana/grafana/pkg/infra/log"
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||||
"github.com/grafana/grafana/pkg/plugins"
|
"github.com/grafana/grafana/pkg/plugins"
|
||||||
|
"github.com/grafana/grafana/pkg/services/contexthandler"
|
||||||
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
||||||
"github.com/grafana/grafana/pkg/services/datasources"
|
"github.com/grafana/grafana/pkg/services/datasources"
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||||
@@ -57,7 +58,8 @@ type httpClient interface {
|
|||||||
func NewDataSourceProxy(ds *datasources.DataSource, pluginRoutes []*plugins.Route, ctx *contextmodel.ReqContext,
|
func NewDataSourceProxy(ds *datasources.DataSource, pluginRoutes []*plugins.Route, ctx *contextmodel.ReqContext,
|
||||||
proxyPath string, cfg *setting.Cfg, clientProvider httpclient.Provider,
|
proxyPath string, cfg *setting.Cfg, clientProvider httpclient.Provider,
|
||||||
oAuthTokenService oauthtoken.OAuthTokenService, dsService datasources.DataSourceService,
|
oAuthTokenService oauthtoken.OAuthTokenService, dsService datasources.DataSourceService,
|
||||||
tracer tracing.Tracer, features featuremgmt.FeatureToggles) (*DataSourceProxy, error) {
|
tracer tracing.Tracer, features featuremgmt.FeatureToggles,
|
||||||
|
) (*DataSourceProxy, error) {
|
||||||
targetURL, err := datasource.ValidateURL(ds.Type, ds.URL)
|
targetURL, err := datasource.ValidateURL(ds.Type, ds.URL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -261,7 +263,8 @@ func (proxy *DataSourceProxy) director(req *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if proxy.oAuthTokenService.IsOAuthPassThruEnabled(proxy.ds) {
|
if proxy.oAuthTokenService.IsOAuthPassThruEnabled(proxy.ds) {
|
||||||
if token := proxy.oAuthTokenService.GetCurrentOAuthToken(req.Context(), proxy.ctx.SignedInUser); token != nil {
|
reqCtx := contexthandler.FromContext(req.Context())
|
||||||
|
if token := proxy.oAuthTokenService.GetCurrentOAuthToken(req.Context(), proxy.ctx.SignedInUser, reqCtx.UserToken); token != nil {
|
||||||
req.Header.Set("Authorization", fmt.Sprintf("%s %s", token.Type(), token.AccessToken))
|
req.Header.Set("Authorization", fmt.Sprintf("%s %s", token.Type(), token.AccessToken))
|
||||||
|
|
||||||
idToken, ok := token.Extra("id_token").(string)
|
idToken, ok := token.Extra("id_token").(string)
|
||||||
|
|||||||
@@ -32,7 +32,9 @@ import (
|
|||||||
pluginfakes "github.com/grafana/grafana/pkg/plugins/manager/fakes"
|
pluginfakes "github.com/grafana/grafana/pkg/plugins/manager/fakes"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol/acimpl"
|
"github.com/grafana/grafana/pkg/services/accesscontrol/acimpl"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol/actest"
|
"github.com/grafana/grafana/pkg/services/accesscontrol/actest"
|
||||||
|
"github.com/grafana/grafana/pkg/services/auth"
|
||||||
"github.com/grafana/grafana/pkg/services/authz/zanzana"
|
"github.com/grafana/grafana/pkg/services/authz/zanzana"
|
||||||
|
"github.com/grafana/grafana/pkg/services/contexthandler/ctxkey"
|
||||||
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
||||||
"github.com/grafana/grafana/pkg/services/datasources"
|
"github.com/grafana/grafana/pkg/services/datasources"
|
||||||
datasourceservice "github.com/grafana/grafana/pkg/services/datasources/service"
|
datasourceservice "github.com/grafana/grafana/pkg/services/datasources/service"
|
||||||
@@ -557,7 +559,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
|
|||||||
var routes []*plugins.Route
|
var routes []*plugins.Route
|
||||||
proxy, err := setupDSProxyTest(t, ctx, ds, routes, "/path/to/folder/", func(proxy *DataSourceProxy) {
|
proxy, err := setupDSProxyTest(t, ctx, ds, routes, "/path/to/folder/", func(proxy *DataSourceProxy) {
|
||||||
proxy.oAuthTokenService = &oauthtokentest.MockOauthTokenService{
|
proxy.oAuthTokenService = &oauthtokentest.MockOauthTokenService{
|
||||||
GetCurrentOauthTokenFunc: func(_ context.Context, _ identity.Requester) *oauth2.Token {
|
GetCurrentOauthTokenFunc: func(_ context.Context, _ identity.Requester, _ *auth.UserToken) *oauth2.Token {
|
||||||
return (&oauth2.Token{
|
return (&oauth2.Token{
|
||||||
AccessToken: "testtoken",
|
AccessToken: "testtoken",
|
||||||
RefreshToken: "testrefreshtoken",
|
RefreshToken: "testrefreshtoken",
|
||||||
@@ -573,6 +575,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
req, err = http.NewRequest(http.MethodGet, "http://grafana.com/sub", nil)
|
req, err = http.NewRequest(http.MethodGet, "http://grafana.com/sub", nil)
|
||||||
|
req = req.WithContext(context.WithValue(req.Context(), ctxkey.Key{}, &contextmodel.ReqContext{UserToken: nil}))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
proxy.director(req)
|
proxy.director(req)
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ require (
|
|||||||
github.com/x448/float16 v0.8.4 // indirect
|
github.com/x448/float16 v0.8.4 // indirect
|
||||||
go.opentelemetry.io/otel v1.32.0 // indirect
|
go.opentelemetry.io/otel v1.32.0 // indirect
|
||||||
go.opentelemetry.io/otel/trace v1.32.0 // indirect
|
go.opentelemetry.io/otel/trace v1.32.0 // indirect
|
||||||
golang.org/x/crypto v0.28.0 // indirect
|
golang.org/x/crypto v0.29.0 // indirect
|
||||||
golang.org/x/net v0.30.0 // indirect
|
golang.org/x/net v0.31.0 // indirect
|
||||||
golang.org/x/sync v0.9.0 // indirect
|
golang.org/x/sync v0.9.0 // indirect
|
||||||
golang.org/x/sys v0.27.0 // indirect
|
golang.org/x/sys v0.27.0 // indirect
|
||||||
golang.org/x/text v0.20.0 // indirect
|
golang.org/x/text v0.20.0 // indirect
|
||||||
|
|||||||
@@ -77,8 +77,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
|
|||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
||||||
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
|
golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
|
||||||
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
|
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
@@ -91,8 +91,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
|
|||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
||||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
|||||||
@@ -78,13 +78,13 @@ require (
|
|||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
go.uber.org/zap v1.27.0 // indirect
|
go.uber.org/zap v1.27.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect
|
||||||
golang.org/x/net v0.30.0 // indirect
|
golang.org/x/net v0.31.0 // indirect
|
||||||
golang.org/x/oauth2 v0.23.0 // indirect
|
golang.org/x/oauth2 v0.23.0 // indirect
|
||||||
golang.org/x/sys v0.27.0 // indirect
|
golang.org/x/sys v0.27.0 // indirect
|
||||||
golang.org/x/term v0.25.0 // indirect
|
golang.org/x/term v0.26.0 // indirect
|
||||||
golang.org/x/text v0.20.0 // indirect
|
golang.org/x/text v0.20.0 // indirect
|
||||||
golang.org/x/time v0.6.0 // indirect
|
golang.org/x/time v0.6.0 // indirect
|
||||||
golang.org/x/tools v0.26.0 // indirect
|
golang.org/x/tools v0.27.0 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20240820151423-278611b39280 // indirect
|
google.golang.org/genproto v0.0.0-20240820151423-278611b39280 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect
|
||||||
|
|||||||
@@ -221,8 +221,8 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
|
|||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
|
golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
|
||||||
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
|
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
||||||
@@ -241,8 +241,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
|
|||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
||||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
||||||
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
@@ -259,8 +259,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
||||||
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
|
golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
|
||||||
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
|
golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
||||||
@@ -277,8 +277,8 @@ golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtn
|
|||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
|
golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o=
|
||||||
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
|
golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|||||||
+3
-3
@@ -35,9 +35,9 @@ require (
|
|||||||
go.opentelemetry.io/otel v1.32.0 // indirect; @grafana/grafana-backend-group
|
go.opentelemetry.io/otel v1.32.0 // indirect; @grafana/grafana-backend-group
|
||||||
go.opentelemetry.io/otel/sdk v1.32.0 // indirect; @grafana/grafana-backend-group
|
go.opentelemetry.io/otel/sdk v1.32.0 // indirect; @grafana/grafana-backend-group
|
||||||
go.opentelemetry.io/otel/trace v1.32.0 // indirect; @grafana/grafana-backend-group
|
go.opentelemetry.io/otel/trace v1.32.0 // indirect; @grafana/grafana-backend-group
|
||||||
golang.org/x/crypto v0.28.0 // indirect; @grafana/grafana-backend-group
|
golang.org/x/crypto v0.29.0 // indirect; @grafana/grafana-backend-group
|
||||||
golang.org/x/mod v0.21.0 // @grafana/grafana-backend-group
|
golang.org/x/mod v0.22.0 // @grafana/grafana-backend-group
|
||||||
golang.org/x/net v0.30.0 // indirect; @grafana/oss-big-tent @grafana/partner-datasources
|
golang.org/x/net v0.31.0 // indirect; @grafana/oss-big-tent @grafana/partner-datasources
|
||||||
golang.org/x/oauth2 v0.23.0 // @grafana/identity-access-team
|
golang.org/x/oauth2 v0.23.0 // @grafana/identity-access-team
|
||||||
golang.org/x/sync v0.9.0 // indirect; @grafana/alerting-backend
|
golang.org/x/sync v0.9.0 // indirect; @grafana/alerting-backend
|
||||||
golang.org/x/text v0.20.0 // indirect; @grafana/grafana-backend-group
|
golang.org/x/text v0.20.0 // indirect; @grafana/grafana-backend-group
|
||||||
|
|||||||
+6
-6
@@ -262,8 +262,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
|
|||||||
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
|
golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
|
||||||
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
|
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
||||||
@@ -272,8 +272,8 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx
|
|||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
|
||||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@@ -283,8 +283,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
|
|||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
||||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
||||||
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ require (
|
|||||||
github.com/google/go-cmp v0.6.0
|
github.com/google/go-cmp v0.6.0
|
||||||
github.com/google/subcommands v1.2.0
|
github.com/google/subcommands v1.2.0
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
|
||||||
golang.org/x/tools v0.26.0
|
golang.org/x/tools v0.27.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
golang.org/x/mod v0.21.0 // indirect
|
golang.org/x/mod v0.22.0 // indirect
|
||||||
golang.org/x/sync v0.9.0 // indirect
|
golang.org/x/sync v0.9.0 // indirect
|
||||||
)
|
)
|
||||||
@@ -4,9 +4,9 @@ github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN
|
|||||||
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
|
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
|
||||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||||
golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
|
golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
|
||||||
golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
|
golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o=
|
||||||
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
|
golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q=
|
||||||
+3
-3
@@ -111,12 +111,12 @@ require (
|
|||||||
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
||||||
go.uber.org/atomic v1.11.0 // indirect
|
go.uber.org/atomic v1.11.0 // indirect
|
||||||
go.uber.org/goleak v1.3.0 // indirect
|
go.uber.org/goleak v1.3.0 // indirect
|
||||||
golang.org/x/mod v0.21.0 // indirect
|
golang.org/x/mod v0.22.0 // indirect
|
||||||
golang.org/x/net v0.30.0 // indirect
|
golang.org/x/net v0.31.0 // indirect
|
||||||
golang.org/x/sync v0.9.0 // indirect
|
golang.org/x/sync v0.9.0 // indirect
|
||||||
golang.org/x/sys v0.27.0 // indirect
|
golang.org/x/sys v0.27.0 // indirect
|
||||||
golang.org/x/text v0.20.0 // indirect
|
golang.org/x/text v0.20.0 // indirect
|
||||||
golang.org/x/tools v0.26.0 // indirect
|
golang.org/x/tools v0.27.0 // indirect
|
||||||
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect
|
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect
|
||||||
gonum.org/v1/gonum v0.15.1 // indirect
|
gonum.org/v1/gonum v0.15.1 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect
|
||||||
|
|||||||
+6
-6
@@ -297,15 +297,15 @@ golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j
|
|||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
|
||||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
||||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
||||||
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
||||||
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -337,8 +337,8 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3
|
|||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
|
golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o=
|
||||||
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
|
golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import (
|
|||||||
|
|
||||||
query "github.com/grafana/grafana/pkg/apis/query/v0alpha1"
|
query "github.com/grafana/grafana/pkg/apis/query/v0alpha1"
|
||||||
"github.com/grafana/grafana/pkg/expr"
|
"github.com/grafana/grafana/pkg/expr"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||||
"github.com/grafana/grafana/pkg/services/datasources/service"
|
"github.com/grafana/grafana/pkg/services/datasources/service"
|
||||||
)
|
)
|
||||||
@@ -48,13 +49,15 @@ type queryParser struct {
|
|||||||
legacy service.LegacyDataSourceLookup
|
legacy service.LegacyDataSourceLookup
|
||||||
reader *expr.ExpressionQueryReader
|
reader *expr.ExpressionQueryReader
|
||||||
tracer tracing.Tracer
|
tracer tracing.Tracer
|
||||||
|
logger log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func newQueryParser(reader *expr.ExpressionQueryReader, legacy service.LegacyDataSourceLookup, tracer tracing.Tracer) *queryParser {
|
func newQueryParser(reader *expr.ExpressionQueryReader, legacy service.LegacyDataSourceLookup, tracer tracing.Tracer, logger log.Logger) *queryParser {
|
||||||
return &queryParser{
|
return &queryParser{
|
||||||
reader: reader,
|
reader: reader,
|
||||||
legacy: legacy,
|
legacy: legacy,
|
||||||
tracer: tracer,
|
tracer: tracer,
|
||||||
|
logger: logger,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,6 +85,7 @@ func (p *queryParser) parseRequest(ctx context.Context, input *query.QueryDataRe
|
|||||||
|
|
||||||
ds, err := p.getValidDataSourceRef(ctx, q.Datasource, q.DatasourceID)
|
ds, err := p.getValidDataSourceRef(ctx, q.Datasource, q.DatasourceID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.logger.Error("Failed to get valid datasource ref", "error", err)
|
||||||
return rsp, err
|
return rsp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,14 +97,17 @@ func (p *queryParser) parseRequest(ctx context.Context, input *query.QueryDataRe
|
|||||||
// but this approach lets us focus on well typed behavior first
|
// but this approach lets us focus on well typed behavior first
|
||||||
raw, err := json.Marshal(q)
|
raw, err := json.Marshal(q)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.logger.Error("Failed to marshal query for expression", "error", err)
|
||||||
return rsp, err
|
return rsp, err
|
||||||
}
|
}
|
||||||
iter, err := jsoniter.ParseBytes(jsoniter.ConfigDefault, raw)
|
iter, err := jsoniter.ParseBytes(jsoniter.ConfigDefault, raw)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.logger.Error("Failed to parse bytes for expression", "error", err)
|
||||||
return rsp, err
|
return rsp, err
|
||||||
}
|
}
|
||||||
exp, err := p.reader.ReadQuery(q, iter)
|
exp, err := p.reader.ReadQuery(q, iter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.logger.Error("Failed to read query for expression", "error", err)
|
||||||
return rsp, NewErrorWithRefID(q.RefID, err)
|
return rsp, NewErrorWithRefID(q.RefID, err)
|
||||||
}
|
}
|
||||||
exp.GraphID = int64(len(expressions) + 1)
|
exp.GraphID = int64(len(expressions) + 1)
|
||||||
@@ -170,6 +177,7 @@ func (p *queryParser) parseRequest(ctx context.Context, input *query.QueryDataRe
|
|||||||
// Add the sorted expressions
|
// Add the sorted expressions
|
||||||
sortedNodes, err := topo.SortStabilized(dg, nil)
|
sortedNodes, err := topo.SortStabilized(dg, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.logger.Error("Error when sorting nodes", "error", err)
|
||||||
return rsp, makeCyclicError("")
|
return rsp, makeCyclicError("")
|
||||||
}
|
}
|
||||||
for _, v := range sortedNodes {
|
for _, v := range sortedNodes {
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import (
|
|||||||
|
|
||||||
query "github.com/grafana/grafana/pkg/apis/query/v0alpha1"
|
query "github.com/grafana/grafana/pkg/apis/query/v0alpha1"
|
||||||
"github.com/grafana/grafana/pkg/expr"
|
"github.com/grafana/grafana/pkg/expr"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||||
)
|
)
|
||||||
@@ -29,7 +30,7 @@ type parserTestObject struct {
|
|||||||
func TestQuerySplitting(t *testing.T) {
|
func TestQuerySplitting(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
parser := newQueryParser(expr.NewExpressionQueryReader(featuremgmt.WithFeatures()),
|
parser := newQueryParser(expr.NewExpressionQueryReader(featuremgmt.WithFeatures()),
|
||||||
&legacyDataSourceRetriever{}, tracing.InitializeTracerForTest())
|
&legacyDataSourceRetriever{}, tracing.InitializeTracerForTest(), log.NewNopLogger())
|
||||||
|
|
||||||
t.Run("missing datasource flavors", func(t *testing.T) {
|
t.Run("missing datasource flavors", func(t *testing.T) {
|
||||||
split, err := parser.parseRequest(ctx, &query.QueryDataRequest{
|
split, err := parser.parseRequest(ctx, &query.QueryDataRequest{
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ func TestQueryRestConnectHandler(t *testing.T) {
|
|||||||
},
|
},
|
||||||
tracer: tracing.InitializeTracerForTest(),
|
tracer: tracing.InitializeTracerForTest(),
|
||||||
parser: newQueryParser(expr.NewExpressionQueryReader(featuremgmt.WithFeatures()),
|
parser: newQueryParser(expr.NewExpressionQueryReader(featuremgmt.WithFeatures()),
|
||||||
&legacyDataSourceRetriever{}, tracing.InitializeTracerForTest()),
|
&legacyDataSourceRetriever{}, tracing.InitializeTracerForTest(), nil),
|
||||||
log: log.New("test"),
|
log: log.New("test"),
|
||||||
}
|
}
|
||||||
qr := newQueryREST(b)
|
qr := newQueryREST(b)
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ func NewQueryAPIBuilder(features featuremgmt.FeatureToggles,
|
|||||||
log: log.New("query_apiserver"),
|
log: log.New("query_apiserver"),
|
||||||
client: client,
|
client: client,
|
||||||
registry: registry,
|
registry: registry,
|
||||||
parser: newQueryParser(reader, legacy, tracer),
|
parser: newQueryParser(reader, legacy, tracer, log.New("query_parser")),
|
||||||
metrics: newQueryMetrics(registerer),
|
metrics: newQueryMetrics(registerer),
|
||||||
tracer: tracer,
|
tracer: tracer,
|
||||||
features: features,
|
features: features,
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ func NewScopeAPIBuilder() *ScopeAPIBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func RegisterAPIService(features featuremgmt.FeatureToggles, apiregistration builder.APIRegistrar, reg prometheus.Registerer) *ScopeAPIBuilder {
|
func RegisterAPIService(features featuremgmt.FeatureToggles, apiregistration builder.APIRegistrar, reg prometheus.Registerer) *ScopeAPIBuilder {
|
||||||
if !features.IsEnabledGlobally(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs) {
|
if !(features.IsEnabledGlobally(featuremgmt.FlagScopeApi) ||
|
||||||
|
features.IsEnabledGlobally(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs)) {
|
||||||
return nil // skip registration unless opting into experimental apis
|
return nil // skip registration unless opting into experimental apis
|
||||||
}
|
}
|
||||||
builder := NewScopeAPIBuilder()
|
builder := NewScopeAPIBuilder()
|
||||||
|
|||||||
@@ -42,6 +42,9 @@ func GetAccessPolicies(ctx context.Context, orgID int64, sql *session.SessionDB,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
defer func() {
|
||||||
|
_ = rows.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
created := time.Now()
|
created := time.Now()
|
||||||
updated := time.Now()
|
updated := time.Now()
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ func folderTreeCollector(store db.DB) legacyTupleCollector {
|
|||||||
func managedPermissionsCollector(store db.DB, kind string) legacyTupleCollector {
|
func managedPermissionsCollector(store db.DB, kind string) legacyTupleCollector {
|
||||||
return func(ctx context.Context, orgID int64) (map[string]map[string]*openfgav1.TupleKey, error) {
|
return func(ctx context.Context, orgID int64) (map[string]map[string]*openfgav1.TupleKey, error) {
|
||||||
query := `
|
query := `
|
||||||
SELECT u.uid as user_uid, t.uid as team_uid, p.action, p.kind, p.identifier, r.org_id, br.role as basic_role_name
|
SELECT u.uid as user_uid, u.is_service_account as is_service_account, t.uid as team_uid, p.action, p.kind, p.identifier, r.org_id, br.role as basic_role_name
|
||||||
FROM permission p
|
FROM permission p
|
||||||
INNER JOIN role r ON p.role_id = r.id
|
INNER JOIN role r ON p.role_id = r.id
|
||||||
LEFT JOIN user_role ur ON r.id = ur.role_id
|
LEFT JOIN user_role ur ON r.id = ur.role_id
|
||||||
@@ -128,12 +128,13 @@ func managedPermissionsCollector(store db.DB, kind string) legacyTupleCollector
|
|||||||
AND p.kind = ?
|
AND p.kind = ?
|
||||||
`
|
`
|
||||||
type Permission struct {
|
type Permission struct {
|
||||||
Action string `xorm:"action"`
|
Action string `xorm:"action"`
|
||||||
Kind string
|
Kind string
|
||||||
Identifier string
|
Identifier string
|
||||||
UserUID string `xorm:"user_uid"`
|
UserUID string `xorm:"user_uid"`
|
||||||
TeamUID string `xorm:"team_uid"`
|
IsServiceAccount bool `xorm:"is_service_account"`
|
||||||
BasicRoleName string `xorm:"basic_role_name"`
|
TeamUID string `xorm:"team_uid"`
|
||||||
|
BasicRoleName string `xorm:"basic_role_name"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var permissions []Permission
|
var permissions []Permission
|
||||||
@@ -149,7 +150,9 @@ func managedPermissionsCollector(store db.DB, kind string) legacyTupleCollector
|
|||||||
|
|
||||||
for _, p := range permissions {
|
for _, p := range permissions {
|
||||||
var subject string
|
var subject string
|
||||||
if len(p.UserUID) > 0 {
|
if len(p.UserUID) > 0 && p.IsServiceAccount {
|
||||||
|
subject = zanzana.NewTupleEntry(zanzana.TypeServiceAccount, p.UserUID, "")
|
||||||
|
} else if len(p.UserUID) > 0 {
|
||||||
subject = zanzana.NewTupleEntry(zanzana.TypeUser, p.UserUID, "")
|
subject = zanzana.NewTupleEntry(zanzana.TypeUser, p.UserUID, "")
|
||||||
} else if len(p.TeamUID) > 0 {
|
} else if len(p.TeamUID) > 0 {
|
||||||
subject = zanzana.NewTupleEntry(zanzana.TypeTeam, p.TeamUID, zanzana.RelationTeamMember)
|
subject = zanzana.NewTupleEntry(zanzana.TypeTeam, p.TeamUID, zanzana.RelationTeamMember)
|
||||||
@@ -198,16 +201,19 @@ func tupleStringWithoutCondition(tuple *openfgav1.TupleKey) string {
|
|||||||
func basicRoleBindingsCollector(store db.DB) legacyTupleCollector {
|
func basicRoleBindingsCollector(store db.DB) legacyTupleCollector {
|
||||||
return func(ctx context.Context, orgID int64) (map[string]map[string]*openfgav1.TupleKey, error) {
|
return func(ctx context.Context, orgID int64) (map[string]map[string]*openfgav1.TupleKey, error) {
|
||||||
query := `
|
query := `
|
||||||
SELECT ou.org_id, u.uid as user_uid, ou.role as org_role
|
SELECT
|
||||||
|
ou.org_id, u.uid as user_uid,
|
||||||
|
u.is_service_account as is_service_account,
|
||||||
|
ou.role as org_role
|
||||||
FROM org_user ou
|
FROM org_user ou
|
||||||
LEFT JOIN ` + store.GetDialect().Quote("user") + ` u ON u.id = ou.user_id
|
LEFT JOIN ` + store.GetDialect().Quote("user") + ` u ON u.id = ou.user_id
|
||||||
WHERE ou.org_id = ?
|
WHERE ou.org_id = ?
|
||||||
AND NOT u.is_service_account
|
|
||||||
`
|
`
|
||||||
// FIXME: handle service admin role
|
// FIXME: handle service admin role
|
||||||
type Binding struct {
|
type Binding struct {
|
||||||
UserUID string `xorm:"user_uid"`
|
UserUID string `xorm:"user_uid"`
|
||||||
OrgRole string `xorm:"org_role"`
|
IsServiceAccount bool `xorm:"is_service_account"`
|
||||||
|
OrgRole string `xorm:"org_role"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var bindings []Binding
|
var bindings []Binding
|
||||||
@@ -222,8 +228,13 @@ func basicRoleBindingsCollector(store db.DB) legacyTupleCollector {
|
|||||||
tuples := make(map[string]map[string]*openfgav1.TupleKey)
|
tuples := make(map[string]map[string]*openfgav1.TupleKey)
|
||||||
|
|
||||||
for _, b := range bindings {
|
for _, b := range bindings {
|
||||||
|
userType := zanzana.TypeUser
|
||||||
|
if b.IsServiceAccount {
|
||||||
|
userType = zanzana.TypeServiceAccount
|
||||||
|
}
|
||||||
|
|
||||||
tuple := &openfgav1.TupleKey{
|
tuple := &openfgav1.TupleKey{
|
||||||
User: zanzana.NewTupleEntry(zanzana.TypeUser, b.UserUID, ""),
|
User: zanzana.NewTupleEntry(userType, b.UserUID, ""),
|
||||||
Relation: zanzana.RelationAssignee,
|
Relation: zanzana.RelationAssignee,
|
||||||
Object: zanzana.NewTupleEntry(zanzana.TypeRole, zanzana.TranslateBasicRole(b.OrgRole), ""),
|
Object: zanzana.NewTupleEntry(zanzana.TypeRole, zanzana.TranslateBasicRole(b.OrgRole), ""),
|
||||||
}
|
}
|
||||||
@@ -286,7 +297,7 @@ func teamRoleBindingsCollector(store db.DB) legacyTupleCollector {
|
|||||||
func userRoleBindingsCollector(store db.DB) legacyTupleCollector {
|
func userRoleBindingsCollector(store db.DB) legacyTupleCollector {
|
||||||
return func(ctx context.Context, orgID int64) (map[string]map[string]*openfgav1.TupleKey, error) {
|
return func(ctx context.Context, orgID int64) (map[string]map[string]*openfgav1.TupleKey, error) {
|
||||||
query := `
|
query := `
|
||||||
SELECT u.uid AS user_uid, r.uid AS role_uid
|
SELECT u.uid AS user_uid, u.is_service_account as is_service_account, r.uid AS role_uid
|
||||||
FROM user_role ur
|
FROM user_role ur
|
||||||
INNER JOIN ` + store.GetDialect().Quote("user") + ` u ON ur.user_id = u.id
|
INNER JOIN ` + store.GetDialect().Quote("user") + ` u ON ur.user_id = u.id
|
||||||
INNER JOIN role r ON ur.role_id = r.id
|
INNER JOIN role r ON ur.role_id = r.id
|
||||||
@@ -294,8 +305,9 @@ func userRoleBindingsCollector(store db.DB) legacyTupleCollector {
|
|||||||
AND r.name NOT LIKE 'managed:%'
|
AND r.name NOT LIKE 'managed:%'
|
||||||
`
|
`
|
||||||
type Binding struct {
|
type Binding struct {
|
||||||
UserUID string `xorm:"user_uid"`
|
UserUID string `xorm:"user_uid"`
|
||||||
RoleUID string `xorm:"role_uid"`
|
IsServiceAccount bool `xorm:"is_service_account"`
|
||||||
|
RoleUID string `xorm:"role_uid"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var bindings []Binding
|
var bindings []Binding
|
||||||
@@ -310,8 +322,13 @@ func userRoleBindingsCollector(store db.DB) legacyTupleCollector {
|
|||||||
tuples := make(map[string]map[string]*openfgav1.TupleKey)
|
tuples := make(map[string]map[string]*openfgav1.TupleKey)
|
||||||
|
|
||||||
for _, b := range bindings {
|
for _, b := range bindings {
|
||||||
|
userType := zanzana.TypeUser
|
||||||
|
if b.IsServiceAccount {
|
||||||
|
userType = zanzana.TypeServiceAccount
|
||||||
|
}
|
||||||
|
|
||||||
tuple := &openfgav1.TupleKey{
|
tuple := &openfgav1.TupleKey{
|
||||||
User: zanzana.NewTupleEntry(zanzana.TypeUser, b.UserUID, ""),
|
User: zanzana.NewTupleEntry(userType, b.UserUID, ""),
|
||||||
Relation: zanzana.RelationAssignee,
|
Relation: zanzana.RelationAssignee,
|
||||||
Object: zanzana.NewTupleEntry(zanzana.TypeRole, b.RoleUID, ""),
|
Object: zanzana.NewTupleEntry(zanzana.TypeRole, b.RoleUID, ""),
|
||||||
}
|
}
|
||||||
@@ -397,7 +414,8 @@ func zanzanaCollector(relations []string) zanzanaTupleCollector {
|
|||||||
|
|
||||||
for c != "" {
|
for c != "" {
|
||||||
res, err := client.Read(ctx, &authzextv1.ReadRequest{
|
res, err := client.Read(ctx, &authzextv1.ReadRequest{
|
||||||
Namespace: namespace,
|
ContinuationToken: c,
|
||||||
|
Namespace: namespace,
|
||||||
TupleKey: &authzextv1.ReadRequestTupleKey{
|
TupleKey: &authzextv1.ReadRequestTupleKey{
|
||||||
Object: object,
|
Object: object,
|
||||||
Relation: relation,
|
Relation: relation,
|
||||||
|
|||||||
@@ -74,12 +74,15 @@ type CreateTokenCommand struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UserTokenService are used for generating and validating user tokens
|
// UserTokenService are used for generating and validating user tokens
|
||||||
|
//
|
||||||
|
//go:generate mockery --name UserTokenService --structname MockUserAuthTokenService --outpkg authtest --filename auth_token_service_mock.go --output ./authtest/
|
||||||
type UserTokenService interface {
|
type UserTokenService interface {
|
||||||
CreateToken(ctx context.Context, cmd *CreateTokenCommand) (*UserToken, error)
|
CreateToken(ctx context.Context, cmd *CreateTokenCommand) (*UserToken, error)
|
||||||
LookupToken(ctx context.Context, unhashedToken string) (*UserToken, error)
|
LookupToken(ctx context.Context, unhashedToken string) (*UserToken, error)
|
||||||
GetTokenByExternalSessionID(ctx context.Context, externalSessionID int64) (*UserToken, error)
|
GetTokenByExternalSessionID(ctx context.Context, externalSessionID int64) (*UserToken, error)
|
||||||
GetExternalSession(ctx context.Context, extSessionID int64) (*ExternalSession, error)
|
GetExternalSession(ctx context.Context, externalSessionID int64) (*ExternalSession, error)
|
||||||
FindExternalSessions(ctx context.Context, query *ListExternalSessionQuery) ([]*ExternalSession, error)
|
FindExternalSessions(ctx context.Context, query *ListExternalSessionQuery) ([]*ExternalSession, error)
|
||||||
|
UpdateExternalSession(ctx context.Context, externalSessionID int64, cmd *UpdateExternalSessionCommand) error
|
||||||
|
|
||||||
// RotateToken will always rotate a valid token
|
// RotateToken will always rotate a valid token
|
||||||
RotateToken(ctx context.Context, cmd RotateCommand) (*UserToken, error)
|
RotateToken(ctx context.Context, cmd RotateCommand) (*UserToken, error)
|
||||||
|
|||||||
@@ -248,14 +248,18 @@ func (s *UserAuthTokenService) GetTokenByExternalSessionID(ctx context.Context,
|
|||||||
return &userToken, err
|
return &userToken, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *UserAuthTokenService) GetExternalSession(ctx context.Context, extSessionID int64) (*auth.ExternalSession, error) {
|
func (s *UserAuthTokenService) GetExternalSession(ctx context.Context, externalSessionID int64) (*auth.ExternalSession, error) {
|
||||||
return s.externalSessionStore.Get(ctx, extSessionID)
|
return s.externalSessionStore.Get(ctx, externalSessionID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *UserAuthTokenService) FindExternalSessions(ctx context.Context, query *auth.ListExternalSessionQuery) ([]*auth.ExternalSession, error) {
|
func (s *UserAuthTokenService) FindExternalSessions(ctx context.Context, query *auth.ListExternalSessionQuery) ([]*auth.ExternalSession, error) {
|
||||||
return s.externalSessionStore.List(ctx, query)
|
return s.externalSessionStore.List(ctx, query)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *UserAuthTokenService) UpdateExternalSession(ctx context.Context, externalSessionID int64, cmd *auth.UpdateExternalSessionCommand) error {
|
||||||
|
return s.externalSessionStore.Update(ctx, externalSessionID, cmd)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *UserAuthTokenService) RotateToken(ctx context.Context, cmd auth.RotateCommand) (*auth.UserToken, error) {
|
func (s *UserAuthTokenService) RotateToken(ctx context.Context, cmd auth.RotateCommand) (*auth.UserToken, error) {
|
||||||
if cmd.UnHashedToken == "" {
|
if cmd.UnHashedToken == "" {
|
||||||
return nil, auth.ErrInvalidSessionToken
|
return nil, auth.ErrInvalidSessionToken
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ func provideExternalSessionStore(sqlStore db.DB, secretService secrets.Service,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *store) Get(ctx context.Context, extSessionID int64) (*auth.ExternalSession, error) {
|
func (s *store) Get(ctx context.Context, ID int64) (*auth.ExternalSession, error) {
|
||||||
ctx, span := s.tracer.Start(ctx, "externalsession.Get")
|
ctx, span := s.tracer.Start(ctx, "externalsession.Get")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
externalSession := &auth.ExternalSession{ID: extSessionID}
|
externalSession := &auth.ExternalSession{ID: ID}
|
||||||
|
|
||||||
err := s.sqlStore.WithDbSession(ctx, func(sess *db.Session) error {
|
err := s.sqlStore.WithDbSession(ctx, func(sess *db.Session) error {
|
||||||
found, err := sess.Get(externalSession)
|
found, err := sess.Get(externalSession)
|
||||||
@@ -150,6 +150,45 @@ func (s *store) Create(ctx context.Context, extSession *auth.ExternalSession) er
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *store) Update(ctx context.Context, ID int64, cmd *auth.UpdateExternalSessionCommand) error {
|
||||||
|
ctx, span := s.tracer.Start(ctx, "externalsession.Update")
|
||||||
|
defer span.End()
|
||||||
|
|
||||||
|
var err error
|
||||||
|
externalSession := &auth.ExternalSession{}
|
||||||
|
|
||||||
|
externalSession.AccessToken, err = s.encryptAndEncode(cmd.Token.AccessToken)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
externalSession.RefreshToken, err = s.encryptAndEncode(cmd.Token.RefreshToken)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var secretIdToken string
|
||||||
|
if idToken, ok := cmd.Token.Extra("id_token").(string); ok && idToken != "" {
|
||||||
|
secretIdToken, err = s.encryptAndEncode(idToken)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
externalSession.IDToken = secretIdToken
|
||||||
|
}
|
||||||
|
|
||||||
|
externalSession.ExpiresAt = cmd.Token.Expiry
|
||||||
|
|
||||||
|
err = s.sqlStore.WithDbSession(ctx, func(sess *db.Session) error {
|
||||||
|
_, err := sess.ID(ID).Cols("access_token", "refresh_token", "id_token", "expires_at").Update(externalSession)
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *store) Delete(ctx context.Context, ID int64) error {
|
func (s *store) Delete(ctx context.Context, ID int64) error {
|
||||||
ctx, span := s.tracer.Start(ctx, "externalsession.Delete")
|
ctx, span := s.tracer.Start(ctx, "externalsession.Delete")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|||||||
@@ -0,0 +1,384 @@
|
|||||||
|
// Code generated by mockery v2.42.1. DO NOT EDIT.
|
||||||
|
|
||||||
|
package authtest
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
|
||||||
|
auth "github.com/grafana/grafana/pkg/services/auth"
|
||||||
|
|
||||||
|
mock "github.com/stretchr/testify/mock"
|
||||||
|
|
||||||
|
usertoken "github.com/grafana/grafana/pkg/models/usertoken"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MockUserAuthTokenService is an autogenerated mock type for the UserTokenService type
|
||||||
|
type MockUserAuthTokenService struct {
|
||||||
|
mock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// ActiveTokenCount provides a mock function with given fields: ctx, userID
|
||||||
|
func (_m *MockUserAuthTokenService) ActiveTokenCount(ctx context.Context, userID *int64) (int64, error) {
|
||||||
|
ret := _m.Called(ctx, userID)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for ActiveTokenCount")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 int64
|
||||||
|
var r1 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, *int64) (int64, error)); ok {
|
||||||
|
return rf(ctx, userID)
|
||||||
|
}
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, *int64) int64); ok {
|
||||||
|
r0 = rf(ctx, userID)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Get(0).(int64)
|
||||||
|
}
|
||||||
|
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, *int64) error); ok {
|
||||||
|
r1 = rf(ctx, userID)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateToken provides a mock function with given fields: ctx, cmd
|
||||||
|
func (_m *MockUserAuthTokenService) CreateToken(ctx context.Context, cmd *auth.CreateTokenCommand) (*usertoken.UserToken, error) {
|
||||||
|
ret := _m.Called(ctx, cmd)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for CreateToken")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 *usertoken.UserToken
|
||||||
|
var r1 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, *auth.CreateTokenCommand) (*usertoken.UserToken, error)); ok {
|
||||||
|
return rf(ctx, cmd)
|
||||||
|
}
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, *auth.CreateTokenCommand) *usertoken.UserToken); ok {
|
||||||
|
r0 = rf(ctx, cmd)
|
||||||
|
} else {
|
||||||
|
if ret.Get(0) != nil {
|
||||||
|
r0 = ret.Get(0).(*usertoken.UserToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, *auth.CreateTokenCommand) error); ok {
|
||||||
|
r1 = rf(ctx, cmd)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindExternalSessions provides a mock function with given fields: ctx, query
|
||||||
|
func (_m *MockUserAuthTokenService) FindExternalSessions(ctx context.Context, query *auth.ListExternalSessionQuery) ([]*auth.ExternalSession, error) {
|
||||||
|
ret := _m.Called(ctx, query)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for FindExternalSessions")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 []*auth.ExternalSession
|
||||||
|
var r1 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, *auth.ListExternalSessionQuery) ([]*auth.ExternalSession, error)); ok {
|
||||||
|
return rf(ctx, query)
|
||||||
|
}
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, *auth.ListExternalSessionQuery) []*auth.ExternalSession); ok {
|
||||||
|
r0 = rf(ctx, query)
|
||||||
|
} else {
|
||||||
|
if ret.Get(0) != nil {
|
||||||
|
r0 = ret.Get(0).([]*auth.ExternalSession)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, *auth.ListExternalSessionQuery) error); ok {
|
||||||
|
r1 = rf(ctx, query)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetExternalSession provides a mock function with given fields: ctx, externalSessionID
|
||||||
|
func (_m *MockUserAuthTokenService) GetExternalSession(ctx context.Context, externalSessionID int64) (*auth.ExternalSession, error) {
|
||||||
|
ret := _m.Called(ctx, externalSessionID)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for GetExternalSession")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 *auth.ExternalSession
|
||||||
|
var r1 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64) (*auth.ExternalSession, error)); ok {
|
||||||
|
return rf(ctx, externalSessionID)
|
||||||
|
}
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64) *auth.ExternalSession); ok {
|
||||||
|
r0 = rf(ctx, externalSessionID)
|
||||||
|
} else {
|
||||||
|
if ret.Get(0) != nil {
|
||||||
|
r0 = ret.Get(0).(*auth.ExternalSession)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, int64) error); ok {
|
||||||
|
r1 = rf(ctx, externalSessionID)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTokenByExternalSessionID provides a mock function with given fields: ctx, externalSessionID
|
||||||
|
func (_m *MockUserAuthTokenService) GetTokenByExternalSessionID(ctx context.Context, externalSessionID int64) (*usertoken.UserToken, error) {
|
||||||
|
ret := _m.Called(ctx, externalSessionID)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for GetTokenByExternalSessionID")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 *usertoken.UserToken
|
||||||
|
var r1 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64) (*usertoken.UserToken, error)); ok {
|
||||||
|
return rf(ctx, externalSessionID)
|
||||||
|
}
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64) *usertoken.UserToken); ok {
|
||||||
|
r0 = rf(ctx, externalSessionID)
|
||||||
|
} else {
|
||||||
|
if ret.Get(0) != nil {
|
||||||
|
r0 = ret.Get(0).(*usertoken.UserToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, int64) error); ok {
|
||||||
|
r1 = rf(ctx, externalSessionID)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserRevokedTokens provides a mock function with given fields: ctx, userID
|
||||||
|
func (_m *MockUserAuthTokenService) GetUserRevokedTokens(ctx context.Context, userID int64) ([]*usertoken.UserToken, error) {
|
||||||
|
ret := _m.Called(ctx, userID)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for GetUserRevokedTokens")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 []*usertoken.UserToken
|
||||||
|
var r1 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64) ([]*usertoken.UserToken, error)); ok {
|
||||||
|
return rf(ctx, userID)
|
||||||
|
}
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64) []*usertoken.UserToken); ok {
|
||||||
|
r0 = rf(ctx, userID)
|
||||||
|
} else {
|
||||||
|
if ret.Get(0) != nil {
|
||||||
|
r0 = ret.Get(0).([]*usertoken.UserToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, int64) error); ok {
|
||||||
|
r1 = rf(ctx, userID)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserToken provides a mock function with given fields: ctx, userID, userTokenID
|
||||||
|
func (_m *MockUserAuthTokenService) GetUserToken(ctx context.Context, userID int64, userTokenID int64) (*usertoken.UserToken, error) {
|
||||||
|
ret := _m.Called(ctx, userID, userTokenID)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for GetUserToken")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 *usertoken.UserToken
|
||||||
|
var r1 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64, int64) (*usertoken.UserToken, error)); ok {
|
||||||
|
return rf(ctx, userID, userTokenID)
|
||||||
|
}
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64, int64) *usertoken.UserToken); ok {
|
||||||
|
r0 = rf(ctx, userID, userTokenID)
|
||||||
|
} else {
|
||||||
|
if ret.Get(0) != nil {
|
||||||
|
r0 = ret.Get(0).(*usertoken.UserToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, int64, int64) error); ok {
|
||||||
|
r1 = rf(ctx, userID, userTokenID)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserTokens provides a mock function with given fields: ctx, userID
|
||||||
|
func (_m *MockUserAuthTokenService) GetUserTokens(ctx context.Context, userID int64) ([]*usertoken.UserToken, error) {
|
||||||
|
ret := _m.Called(ctx, userID)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for GetUserTokens")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 []*usertoken.UserToken
|
||||||
|
var r1 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64) ([]*usertoken.UserToken, error)); ok {
|
||||||
|
return rf(ctx, userID)
|
||||||
|
}
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64) []*usertoken.UserToken); ok {
|
||||||
|
r0 = rf(ctx, userID)
|
||||||
|
} else {
|
||||||
|
if ret.Get(0) != nil {
|
||||||
|
r0 = ret.Get(0).([]*usertoken.UserToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, int64) error); ok {
|
||||||
|
r1 = rf(ctx, userID)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// LookupToken provides a mock function with given fields: ctx, unhashedToken
|
||||||
|
func (_m *MockUserAuthTokenService) LookupToken(ctx context.Context, unhashedToken string) (*usertoken.UserToken, error) {
|
||||||
|
ret := _m.Called(ctx, unhashedToken)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for LookupToken")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 *usertoken.UserToken
|
||||||
|
var r1 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, string) (*usertoken.UserToken, error)); ok {
|
||||||
|
return rf(ctx, unhashedToken)
|
||||||
|
}
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, string) *usertoken.UserToken); ok {
|
||||||
|
r0 = rf(ctx, unhashedToken)
|
||||||
|
} else {
|
||||||
|
if ret.Get(0) != nil {
|
||||||
|
r0 = ret.Get(0).(*usertoken.UserToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, string) error); ok {
|
||||||
|
r1 = rf(ctx, unhashedToken)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// RevokeAllUserTokens provides a mock function with given fields: ctx, userID
|
||||||
|
func (_m *MockUserAuthTokenService) RevokeAllUserTokens(ctx context.Context, userID int64) error {
|
||||||
|
ret := _m.Called(ctx, userID)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for RevokeAllUserTokens")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64) error); ok {
|
||||||
|
r0 = rf(ctx, userID)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Error(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0
|
||||||
|
}
|
||||||
|
|
||||||
|
// RevokeToken provides a mock function with given fields: ctx, token, soft
|
||||||
|
func (_m *MockUserAuthTokenService) RevokeToken(ctx context.Context, token *usertoken.UserToken, soft bool) error {
|
||||||
|
ret := _m.Called(ctx, token, soft)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for RevokeToken")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, *usertoken.UserToken, bool) error); ok {
|
||||||
|
r0 = rf(ctx, token, soft)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Error(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0
|
||||||
|
}
|
||||||
|
|
||||||
|
// RotateToken provides a mock function with given fields: ctx, cmd
|
||||||
|
func (_m *MockUserAuthTokenService) RotateToken(ctx context.Context, cmd auth.RotateCommand) (*usertoken.UserToken, error) {
|
||||||
|
ret := _m.Called(ctx, cmd)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for RotateToken")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 *usertoken.UserToken
|
||||||
|
var r1 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, auth.RotateCommand) (*usertoken.UserToken, error)); ok {
|
||||||
|
return rf(ctx, cmd)
|
||||||
|
}
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, auth.RotateCommand) *usertoken.UserToken); ok {
|
||||||
|
r0 = rf(ctx, cmd)
|
||||||
|
} else {
|
||||||
|
if ret.Get(0) != nil {
|
||||||
|
r0 = ret.Get(0).(*usertoken.UserToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, auth.RotateCommand) error); ok {
|
||||||
|
r1 = rf(ctx, cmd)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateExternalSession provides a mock function with given fields: ctx, externalSessionID, cmd
|
||||||
|
func (_m *MockUserAuthTokenService) UpdateExternalSession(ctx context.Context, externalSessionID int64, cmd *auth.UpdateExternalSessionCommand) error {
|
||||||
|
ret := _m.Called(ctx, externalSessionID, cmd)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for UpdateExternalSession")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64, *auth.UpdateExternalSessionCommand) error); ok {
|
||||||
|
r0 = rf(ctx, externalSessionID, cmd)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Error(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMockUserAuthTokenService creates a new instance of MockUserAuthTokenService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockUserAuthTokenService(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockUserAuthTokenService {
|
||||||
|
mock := &MockUserAuthTokenService{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
@@ -147,6 +147,24 @@ func (_m *MockExternalSessionStore) List(ctx context.Context, query *auth.ListEx
|
|||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update provides a mock function with given fields: ctx, ID, cmd
|
||||||
|
func (_m *MockExternalSessionStore) Update(ctx context.Context, ID int64, cmd *auth.UpdateExternalSessionCommand) error {
|
||||||
|
ret := _m.Called(ctx, ID, cmd)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for Update")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 error
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, int64, *auth.UpdateExternalSessionCommand) error); ok {
|
||||||
|
r0 = rf(ctx, ID, cmd)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Error(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0
|
||||||
|
}
|
||||||
|
|
||||||
// NewMockExternalSessionStore creates a new instance of MockExternalSessionStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
// NewMockExternalSessionStore creates a new instance of MockExternalSessionStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
// The first argument is typically a *testing.T value.
|
// The first argument is typically a *testing.T value.
|
||||||
func NewMockExternalSessionStore(t interface {
|
func NewMockExternalSessionStore(t interface {
|
||||||
|
|||||||
@@ -14,12 +14,15 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/services/login"
|
"github.com/grafana/grafana/pkg/services/login"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var _ auth.UserTokenService = (*FakeUserAuthTokenService)(nil)
|
||||||
|
|
||||||
type FakeUserAuthTokenService struct {
|
type FakeUserAuthTokenService struct {
|
||||||
CreateTokenProvider func(ctx context.Context, cmd *auth.CreateTokenCommand) (*auth.UserToken, error)
|
CreateTokenProvider func(ctx context.Context, cmd *auth.CreateTokenCommand) (*auth.UserToken, error)
|
||||||
RotateTokenProvider func(ctx context.Context, cmd auth.RotateCommand) (*auth.UserToken, error)
|
RotateTokenProvider func(ctx context.Context, cmd auth.RotateCommand) (*auth.UserToken, error)
|
||||||
GetTokenByExternalSessionIDProvider func(ctx context.Context, externalSessionID int64) (*auth.UserToken, error)
|
GetTokenByExternalSessionIDProvider func(ctx context.Context, externalSessionID int64) (*auth.UserToken, error)
|
||||||
GetExternalSessionProvider func(ctx context.Context, externalSessionID int64) (*auth.ExternalSession, error)
|
GetExternalSessionProvider func(ctx context.Context, externalSessionID int64) (*auth.ExternalSession, error)
|
||||||
FindExternalSessionsProvider func(ctx context.Context, query *auth.ListExternalSessionQuery) ([]*auth.ExternalSession, error)
|
FindExternalSessionsProvider func(ctx context.Context, query *auth.ListExternalSessionQuery) ([]*auth.ExternalSession, error)
|
||||||
|
UpdateExternalSessionProvider func(ctx context.Context, externalSessionID int64, cmd *auth.UpdateExternalSessionCommand) error
|
||||||
TryRotateTokenProvider func(ctx context.Context, token *auth.UserToken, clientIP net.IP, userAgent string) (bool, *auth.UserToken, error)
|
TryRotateTokenProvider func(ctx context.Context, token *auth.UserToken, clientIP net.IP, userAgent string) (bool, *auth.UserToken, error)
|
||||||
LookupTokenProvider func(ctx context.Context, unhashedToken string) (*auth.UserToken, error)
|
LookupTokenProvider func(ctx context.Context, unhashedToken string) (*auth.UserToken, error)
|
||||||
RevokeTokenProvider func(ctx context.Context, token *auth.UserToken, soft bool) error
|
RevokeTokenProvider func(ctx context.Context, token *auth.UserToken, soft bool) error
|
||||||
@@ -98,6 +101,10 @@ func (s *FakeUserAuthTokenService) FindExternalSessions(ctx context.Context, que
|
|||||||
return s.FindExternalSessionsProvider(context.Background(), query)
|
return s.FindExternalSessionsProvider(context.Background(), query)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *FakeUserAuthTokenService) UpdateExternalSession(ctx context.Context, externalSessionID int64, cmd *auth.UpdateExternalSessionCommand) error {
|
||||||
|
return s.UpdateExternalSessionProvider(context.Background(), externalSessionID, cmd)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *FakeUserAuthTokenService) LookupToken(ctx context.Context, unhashedToken string) (*auth.UserToken, error) {
|
func (s *FakeUserAuthTokenService) LookupToken(ctx context.Context, unhashedToken string) (*auth.UserToken, error) {
|
||||||
return s.LookupTokenProvider(context.Background(), unhashedToken)
|
return s.LookupTokenProvider(context.Background(), unhashedToken)
|
||||||
}
|
}
|
||||||
@@ -149,16 +156,6 @@ func (ts *FakeOAuthTokenService) IsOAuthPassThruEnabled(*datasources.DataSource)
|
|||||||
return ts.passThruEnabled
|
return ts.passThruEnabled
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ts *FakeOAuthTokenService) HasOAuthEntry(context.Context, identity.Requester) (*login.UserAuth, bool, error) {
|
|
||||||
if ts.ExpectedAuthUser != nil {
|
|
||||||
return ts.ExpectedAuthUser, true, nil
|
|
||||||
}
|
|
||||||
if error, ok := ts.ExpectedErrors["HasOAuthEntry"]; ok {
|
|
||||||
return nil, false, error
|
|
||||||
}
|
|
||||||
return nil, false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ts *FakeOAuthTokenService) InvalidateOAuthTokens(ctx context.Context, usr *login.UserAuth) error {
|
func (ts *FakeOAuthTokenService) InvalidateOAuthTokens(ctx context.Context, usr *login.UserAuth) error {
|
||||||
ts.ExpectedAuthUser.OAuthAccessToken = ""
|
ts.ExpectedAuthUser.OAuthAccessToken = ""
|
||||||
ts.ExpectedAuthUser.OAuthRefreshToken = ""
|
ts.ExpectedAuthUser.OAuthRefreshToken = ""
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package auth
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/oauth2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ExternalSession struct {
|
type ExternalSession struct {
|
||||||
@@ -43,6 +45,10 @@ func (e *ExternalSession) Clone() *ExternalSession {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type UpdateExternalSessionCommand struct {
|
||||||
|
Token *oauth2.Token
|
||||||
|
}
|
||||||
|
|
||||||
type ListExternalSessionQuery struct {
|
type ListExternalSessionQuery struct {
|
||||||
ID int64
|
ID int64
|
||||||
NameID string
|
NameID string
|
||||||
@@ -57,6 +63,8 @@ type ExternalSessionStore interface {
|
|||||||
List(ctx context.Context, query *ListExternalSessionQuery) ([]*ExternalSession, error)
|
List(ctx context.Context, query *ListExternalSessionQuery) ([]*ExternalSession, error)
|
||||||
// Create creates a new external session for a user
|
// Create creates a new external session for a user
|
||||||
Create(ctx context.Context, extSesion *ExternalSession) error
|
Create(ctx context.Context, extSesion *ExternalSession) error
|
||||||
|
// Update updates an external session
|
||||||
|
Update(ctx context.Context, ID int64, cmd *UpdateExternalSessionCommand) error
|
||||||
// Delete deletes an external session
|
// Delete deletes an external session
|
||||||
Delete(ctx context.Context, ID int64) error
|
Delete(ctx context.Context, ID int64) error
|
||||||
// DeleteExternalSessionsByUserID deletes an external session
|
// DeleteExternalSessionsByUserID deletes an external session
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ type RedirectClient interface {
|
|||||||
// that should happen during logout and supports client specific redirect URL.
|
// that should happen during logout and supports client specific redirect URL.
|
||||||
type LogoutClient interface {
|
type LogoutClient interface {
|
||||||
Client
|
Client
|
||||||
Logout(ctx context.Context, user identity.Requester) (*Redirect, bool)
|
Logout(ctx context.Context, user identity.Requester, sessionToken *usertoken.UserToken) (*Redirect, bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
type SSOSettingsAwareClient interface {
|
type SSOSettingsAwareClient interface {
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ func ProvideRegistration(
|
|||||||
jwtService auth.JWTVerifierService, userProtectionService login.UserProtectionService,
|
jwtService auth.JWTVerifierService, userProtectionService login.UserProtectionService,
|
||||||
loginAttempts loginattempt.Service, quotaService quota.Service,
|
loginAttempts loginattempt.Service, quotaService quota.Service,
|
||||||
authInfoService login.AuthInfoService, renderService rendering.Service,
|
authInfoService login.AuthInfoService, renderService rendering.Service,
|
||||||
features *featuremgmt.FeatureManager, oauthTokenService oauthtoken.OAuthTokenService,
|
features featuremgmt.FeatureToggles, oauthTokenService oauthtoken.OAuthTokenService,
|
||||||
socialService social.Service, cache *remotecache.RemoteCache,
|
socialService social.Service, cache *remotecache.RemoteCache,
|
||||||
ldapService service.LDAP, settingsProviderService setting.Provider,
|
ldapService service.LDAP, settingsProviderService setting.Provider,
|
||||||
tracer tracing.Tracer, tempUserService tempuser.Service, notificationService notifications.Service,
|
tracer tracing.Tracer, tempUserService tempuser.Service, notificationService notifications.Service,
|
||||||
@@ -108,13 +108,13 @@ func ProvideRegistration(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FIXME (jguer): move to User package
|
// FIXME (jguer): move to User package
|
||||||
userSync := sync.ProvideUserSync(userService, userProtectionService, authInfoService, quotaService, tracer)
|
userSync := sync.ProvideUserSync(userService, userProtectionService, authInfoService, quotaService, tracer, features)
|
||||||
orgSync := sync.ProvideOrgSync(userService, orgService, accessControlService, cfg, tracer)
|
orgSync := sync.ProvideOrgSync(userService, orgService, accessControlService, cfg, tracer)
|
||||||
authnSvc.RegisterPostAuthHook(userSync.SyncUserHook, 10)
|
authnSvc.RegisterPostAuthHook(userSync.SyncUserHook, 10)
|
||||||
authnSvc.RegisterPostAuthHook(userSync.EnableUserHook, 20)
|
authnSvc.RegisterPostAuthHook(userSync.EnableUserHook, 20)
|
||||||
authnSvc.RegisterPostAuthHook(orgSync.SyncOrgRolesHook, 30)
|
authnSvc.RegisterPostAuthHook(orgSync.SyncOrgRolesHook, 30)
|
||||||
authnSvc.RegisterPostAuthHook(userSync.SyncLastSeenHook, 130)
|
authnSvc.RegisterPostAuthHook(userSync.SyncLastSeenHook, 130)
|
||||||
authnSvc.RegisterPostAuthHook(sync.ProvideOAuthTokenSync(oauthTokenService, sessionService, socialService, tracer).SyncOauthTokenHook, 60)
|
authnSvc.RegisterPostAuthHook(sync.ProvideOAuthTokenSync(oauthTokenService, sessionService, socialService, tracer, features).SyncOauthTokenHook, 60)
|
||||||
authnSvc.RegisterPostAuthHook(userSync.FetchSyncedUserHook, 100)
|
authnSvc.RegisterPostAuthHook(userSync.FetchSyncedUserHook, 100)
|
||||||
|
|
||||||
rbacSync := sync.ProvideRBACSync(accessControlService, tracer, permRegistry)
|
rbacSync := sync.ProvideRBACSync(accessControlService, tracer, permRegistry)
|
||||||
|
|||||||
@@ -322,7 +322,7 @@ func (s *Service) Logout(ctx context.Context, user identity.Requester, sessionTo
|
|||||||
goto Default
|
goto Default
|
||||||
}
|
}
|
||||||
|
|
||||||
clientRedirect, ok := logoutClient.Logout(ctx, user)
|
clientRedirect, ok := logoutClient.Logout(ctx, user, sessionToken)
|
||||||
if !ok {
|
if !ok {
|
||||||
goto Default
|
goto Default
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -507,7 +507,7 @@ func TestService_Logout(t *testing.T) {
|
|||||||
expectedRedirect: &authn.Redirect{URL: "http://idp.com/logout"},
|
expectedRedirect: &authn.Redirect{URL: "http://idp.com/logout"},
|
||||||
client: &authntest.MockClient{
|
client: &authntest.MockClient{
|
||||||
NameFunc: func() string { return "auth.client.azuread" },
|
NameFunc: func() string { return "auth.client.azuread" },
|
||||||
LogoutFunc: func(ctx context.Context, _ identity.Requester) (*authn.Redirect, bool) {
|
LogoutFunc: func(ctx context.Context, _ identity.Requester, sessionToken *usertoken.UserToken) (*authn.Redirect, bool) {
|
||||||
return &authn.Redirect{URL: "http://idp.com/logout"}, true
|
return &authn.Redirect{URL: "http://idp.com/logout"}, true
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Loaded 100 of 222 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user