Compare commits

...

8 Commits

Author SHA1 Message Date
Maxime Beauchemin
bc01eba075 feat: add Claudette theme to examples 2025-08-03 20:38:52 -07:00
dependabot[bot]
96a1aa60e8 chore(deps): update gh-pages requirement from ^6.2.0 to ^6.3.0 in /superset-frontend/packages/superset-ui-demo (#34444)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-03 00:38:12 -07:00
dependabot[bot]
2ea0368c2d chore(deps-dev): bump @types/classnames from 2.3.0 to 2.3.4 in /superset-frontend (#34478)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-03 00:36:27 -07:00
dependabot[bot]
9e407e4e80 chore(deps): bump dom-to-image-more from 3.5.0 to 3.6.0 in /superset-frontend (#34482)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-03 00:11:29 -07:00
dependabot[bot]
360e58c181 chore(deps): bump @deck.gl/core from 9.1.13 to 9.1.14 in /superset-frontend (#34480)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-03 00:11:13 -07:00
dependabot[bot]
22d5eb7835 chore(deps-dev): bump tsx from 4.19.4 to 4.20.3 in /superset-frontend (#34484)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-03 00:10:12 -07:00
dependabot[bot]
7c4a77a909 chore(deps-dev): bump @babel/compat-data from 7.27.2 to 7.28.0 in /superset-frontend (#34485)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-03 00:09:55 -07:00
Evan Rusackas
4e209e51d0 fix(sqllab): prevent strings with angle brackets from being hidden (#34512)
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-02 22:53:17 -07:00
7 changed files with 328 additions and 33 deletions

View File

@@ -61,7 +61,7 @@
"d3-color": "^3.1.0",
"d3-scale": "^2.1.2",
"dayjs": "^1.11.13",
"dom-to-image-more": "^3.2.0",
"dom-to-image-more": "^3.6.0",
"dom-to-pdf": "^0.3.2",
"echarts": "^5.6.0",
"emotion-rgba": "0.0.12",
@@ -140,7 +140,7 @@
"devDependencies": {
"@applitools/eyes-storybook": "^3.55.6",
"@babel/cli": "^7.27.2",
"@babel/compat-data": "^7.26.8",
"@babel/compat-data": "^7.28.0",
"@babel/core": "^7.26.0",
"@babel/eslint-parser": "^7.25.9",
"@babel/node": "^7.22.6",
@@ -175,7 +175,7 @@
"@testing-library/react": "^12.1.5",
"@testing-library/react-hooks": "^8.0.1",
"@testing-library/user-event": "^12.8.3",
"@types/classnames": "^2.2.10",
"@types/classnames": "^2.3.4",
"@types/dom-to-image": "^2.6.7",
"@types/jest": "^29.5.14",
"@types/js-levenshtein": "^1.1.3",
@@ -263,7 +263,7 @@
"ts-jest": "^29.4.0",
"ts-loader": "^9.5.1",
"tscw-config": "^1.1.2",
"tsx": "^4.19.2",
"tsx": "^4.20.3",
"typescript": "5.4.5",
"vm-browserify": "^1.1.2",
"webpack": "^5.99.9",
@@ -1086,9 +1086,9 @@
}
},
"node_modules/@babel/compat-data": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz",
"integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==",
"version": "7.28.0",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz",
"integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3989,18 +3989,18 @@
}
},
"node_modules/@deck.gl/core": {
"version": "9.1.13",
"resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.1.13.tgz",
"integrity": "sha512-c15DpwUEvDjmt3+/azSjcfhVQ5L5HiIj6LJob1KAwQOnB5zgVdKWukN/21ELQ7ekppEkfT0x4byRv5k4QVocqQ==",
"version": "9.1.14",
"resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.1.14.tgz",
"integrity": "sha512-tXakSSvi5g+EvxSsnnjoRO8z3XxHxISTRzzIqcs3AZuWHnDptK28y9iD0Da21ILop1IYLaWE1QTUe6IAdp/Wag==",
"license": "MIT",
"dependencies": {
"@loaders.gl/core": "^4.2.0",
"@loaders.gl/images": "^4.2.0",
"@luma.gl/constants": "^9.1.5",
"@luma.gl/core": "^9.1.5",
"@luma.gl/engine": "^9.1.5",
"@luma.gl/shadertools": "^9.1.5",
"@luma.gl/webgl": "^9.1.5",
"@luma.gl/constants": "~9.1.9",
"@luma.gl/core": "~9.1.9",
"@luma.gl/engine": "~9.1.9",
"@luma.gl/shadertools": "~9.1.9",
"@luma.gl/webgl": "~9.1.9",
"@math.gl/core": "^4.1.0",
"@math.gl/sun": "^4.1.0",
"@math.gl/types": "^4.1.0",
@@ -15253,9 +15253,10 @@
"license": "MIT"
},
"node_modules/@types/classnames": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.0.tgz",
"integrity": "sha512-3GsbOoDYteFShlrBTKzI2Eii4vPg/jAf7LXRIn0WQePKlmhpkV0KoTMuawA7gZJkrbPrZGwv9IEAfIWaOaQK8w==",
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.4.tgz",
"integrity": "sha512-dwmfrMMQb9ujX1uYGvB5ERDlOzBNywnZAZBtOe107/hORWP05ESgU4QyaanZMWYYfd2BzrG78y13/Bju8IQcMQ==",
"deprecated": "This is a stub types definition. classnames provides its own type definitions, so you do not need this installed.",
"license": "MIT",
"dependencies": {
"classnames": "*"
@@ -24128,9 +24129,9 @@
"license": "MIT"
},
"node_modules/dom-to-image-more": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/dom-to-image-more/-/dom-to-image-more-3.5.0.tgz",
"integrity": "sha512-VF/vwfHsPNMHJb5W/5sAmco3UIlEWSEFLppInQwqwN4joUvBULDwE3CqVcUDkUWleke/nZ5KwIVSrrFlGw7WPA==",
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/dom-to-image-more/-/dom-to-image-more-3.6.0.tgz",
"integrity": "sha512-0BB0M9gRRP7znKBNLRAvNyWnkDIzSgMSDcS7WdPDzPnWhW2YJqxUR/dCHiJ2HdCV3K2rVky5Vba8UF31mvrCuQ==",
"license": "MIT"
},
"node_modules/dom-to-pdf": {
@@ -54976,9 +54977,9 @@
"license": "0BSD"
},
"node_modules/tsx": {
"version": "4.19.4",
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.4.tgz",
"integrity": "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==",
"version": "4.20.3",
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz",
"integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -61643,7 +61644,7 @@
"@storybook/types": "8.4.7",
"@types/react-loadable": "^5.5.11",
"core-js": "3.40.0",
"gh-pages": "^6.2.0",
"gh-pages": "^6.3.0",
"jquery": "^3.7.1",
"memoize-one": "^5.2.1",
"react": "^17.0.2",
@@ -62584,7 +62585,7 @@
"license": "Apache-2.0",
"dependencies": {
"@deck.gl/aggregation-layers": "^9.1.13",
"@deck.gl/core": "^9.1.13",
"@deck.gl/core": "^9.1.14",
"@deck.gl/geo-layers": "^9.1.13",
"@deck.gl/layers": "^9.1.13",
"@deck.gl/react": "^9.1.13",

View File

@@ -129,7 +129,7 @@
"d3-color": "^3.1.0",
"d3-scale": "^2.1.2",
"dayjs": "^1.11.13",
"dom-to-image-more": "^3.2.0",
"dom-to-image-more": "^3.6.0",
"dom-to-pdf": "^0.3.2",
"echarts": "^5.6.0",
"emotion-rgba": "0.0.12",
@@ -208,7 +208,7 @@
"devDependencies": {
"@applitools/eyes-storybook": "^3.55.6",
"@babel/cli": "^7.27.2",
"@babel/compat-data": "^7.26.8",
"@babel/compat-data": "^7.28.0",
"@babel/core": "^7.26.0",
"@babel/eslint-parser": "^7.25.9",
"@babel/node": "^7.22.6",
@@ -243,7 +243,7 @@
"@testing-library/react": "^12.1.5",
"@testing-library/react-hooks": "^8.0.1",
"@testing-library/user-event": "^12.8.3",
"@types/classnames": "^2.2.10",
"@types/classnames": "^2.3.4",
"@types/dom-to-image": "^2.6.7",
"@types/jest": "^29.5.14",
"@types/js-levenshtein": "^1.1.3",
@@ -331,7 +331,7 @@
"ts-jest": "^29.4.0",
"ts-loader": "^9.5.1",
"tscw-config": "^1.1.2",
"tsx": "^4.19.2",
"tsx": "^4.20.3",
"typescript": "5.4.5",
"vm-browserify": "^1.1.2",
"webpack": "^5.99.9",

View File

@@ -57,5 +57,206 @@ const exampleThemes: Record<string, SerializableThemeConfig> = {
},
algorithm: ThemeAlgorithm.DARK,
},
claudette: {
algorithm: 'dark',
token: {
colorPrimary: '#C15F3C',
colorPrimaryHover: '#d16b48',
colorPrimaryActive: '#a84f30',
colorBgBase: '#1a1a1a',
colorBgContainer: '#2a2a2a',
colorBgElevated: '#323232',
colorBgLayout: '#0f0f0f',
colorBgSpotlight: '#323232',
colorText: '#F4F3EE',
colorTextSecondary: '#B1ADA1',
colorTextTertiary: '#8a8680',
colorTextQuaternary: '#6b6862',
colorTextPlaceholder: '#B1ADA1',
colorTextLightSolid: '#F4F3EE',
colorBorder: '#404040',
colorBorderSecondary: '#303030',
colorFill: '#404040',
colorFillSecondary: '#353535',
colorFillTertiary: '#2a2a2a',
colorFillQuaternary: '#1f1f1f',
colorFillAlter: '#323232',
colorIcon: '#B1ADA1',
colorIconHover: '#F4F3EE',
fontFamily:
"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu'",
fontFamilyCode:
"'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace",
fontSize: 14,
borderRadius: 6,
borderRadiusLG: 8,
wireframe: false,
},
},
figmate: {
algorithm: 'light',
token: {
colorPrimary: '#0d99ff',
colorPrimaryHover: '#3dadff',
colorPrimaryActive: '#0085e6',
colorInfo: '#4c74f4',
colorInfoHover: '#6b8af5',
colorInfoActive: '#2d5af2',
colorSuccess: '#00d2aa',
colorSuccessHover: '#1adbba',
colorSuccessActive: '#00c299',
colorWarning: '#ffad33',
colorWarningHover: '#ffbf5c',
colorWarningActive: '#ff9900',
colorError: '#ff5757',
colorErrorHover: '#ff7a7a',
colorErrorActive: '#ff3333',
colorBgBase: '#ffffff',
colorBgContainer: '#fafafa',
colorBgElevated: '#ffffff',
colorBgLayout: '#f5f5f5',
colorText: '#1a1a1a',
colorTextSecondary: '#666666',
colorTextTertiary: '#999999',
colorTextQuaternary: '#cccccc',
colorTextPlaceholder: '#999999',
colorBorder: '#e6e6e6',
colorBorderSecondary: '#f0f0f0',
colorFill: '#f0f0f0',
colorFillSecondary: '#f5f5f5',
colorFillTertiary: '#fafafa',
colorFillQuaternary: '#ffffff',
colorIcon: '#666666',
colorIconHover: '#333333',
fontFamily:
'-apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif',
fontFamilyCode:
'"SF Mono", Monaco, Inconsolata, "Roboto Mono", monospace',
fontSize: 14,
fontSizeLG: 16,
fontSizeXL: 20,
borderRadius: 8,
borderRadiusLG: 12,
borderRadiusSM: 6,
lineHeight: 1.5,
wireframe: false,
motion: true,
motionDurationSlow: '0.3s',
motionDurationMid: '0.2s',
motionDurationFast: '0.1s',
},
},
hubert: {
algorithm: 'dark',
token: {
colorPrimary: '#276EF1',
colorPrimaryHover: '#4285f4',
colorPrimaryActive: '#1557d6',
colorInfo: '#276EF1',
colorInfoHover: '#4285f4',
colorInfoActive: '#1557d6',
colorSuccess: '#3AA76D',
colorSuccessHover: '#4db87d',
colorSuccessActive: '#2d9657',
colorWarning: '#FFC043',
colorWarningHover: '#ffcd66',
colorWarningActive: '#e6ac26',
colorError: '#D44333',
colorErrorHover: '#dd5a4c',
colorErrorActive: '#bf3526',
colorBgBase: '#000000',
colorBgContainer: '#1a1a1a',
colorBgElevated: '#2a2a2a',
colorBgLayout: '#000000',
colorBgSpotlight: '#333333',
colorText: '#ffffff',
colorTextSecondary: '#cccccc',
colorTextTertiary: '#999999',
colorTextQuaternary: '#666666',
colorTextPlaceholder: '#999999',
colorTextLightSolid: '#ffffff',
colorBorder: '#333333',
colorBorderSecondary: '#1a1a1a',
colorFill: '#1a1a1a',
colorFillSecondary: '#2a2a2a',
colorFillTertiary: '#333333',
colorFillQuaternary: '#404040',
colorFillAlter: '#2a2a2a',
colorIcon: '#cccccc',
colorIconHover: '#ffffff',
fontFamily:
'-apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif',
fontFamilyCode:
'"SF Mono", Monaco, Inconsolata, "Roboto Mono", monospace',
fontSize: 14,
fontSizeLG: 16,
fontSizeXL: 20,
fontWeightStrong: 600,
borderRadius: 4,
borderRadiusLG: 6,
borderRadiusSM: 2,
lineHeight: 1.4,
lineWidthBold: 2,
wireframe: false,
motion: true,
motionDurationSlow: '0.3s',
motionDurationMid: '0.2s',
motionDurationFast: '0.1s',
},
},
bnb: {
algorithm: 'light',
token: {
colorPrimary: '#FF5A5F',
colorPrimaryHover: '#FF7479',
colorPrimaryActive: '#E5464B',
colorInfo: '#29696B',
colorInfoHover: '#3D7D7F',
colorInfoActive: '#1F5557',
colorSuccess: '#5BCACE',
colorSuccessHover: '#7DD4D8',
colorSuccessActive: '#49B6BA',
colorWarning: '#F4B02A',
colorWarningHover: '#F6C054',
colorWarningActive: '#E2A01E',
colorError: '#C32F0E',
colorErrorHover: '#D54428',
colorErrorActive: '#A8280C',
colorBgBase: '#ffffff',
colorBgContainer: '#fafafa',
colorBgElevated: '#ffffff',
colorBgLayout: '#f7f7f7',
colorText: '#222222',
colorTextSecondary: '#484848',
colorTextTertiary: '#767676',
colorTextQuaternary: '#b0b0b0',
colorTextPlaceholder: '#767676',
colorBorder: '#e8e8e8',
colorBorderSecondary: '#f0f0f0',
colorFill: '#f7f7f7',
colorFillSecondary: '#fafafa',
colorFillTertiary: '#fcfcfc',
colorFillQuaternary: '#ffffff',
colorIcon: '#767676',
colorIconHover: '#484848',
fontFamily:
'Circular, Circular Air Pro, Airbnb Cereal, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto',
fontFamilyCode:
'"SF Mono", Monaco, Inconsolata, "Roboto Mono", monospace',
fontSize: 14,
fontSizeLG: 16,
fontSizeXL: 20,
fontWeightStrong: 600,
borderRadius: 8,
borderRadiusLG: 12,
borderRadiusSM: 4,
lineHeight: 1.5,
wireframe: false,
motion: true,
motionDurationSlow: '0.3s',
motionDurationMid: '0.2s',
motionDurationFast: '0.1s',
},
},
};
export default exampleThemes;

View File

@@ -49,6 +49,21 @@ describe('isProbablyHTML', () => {
const trickyText = 'a <= 10 and b > 10';
expect(isProbablyHTML(trickyText)).toBe(false);
});
it('should return false for strings with angle brackets that are not HTML', () => {
// Test case from issue #25561
expect(isProbablyHTML('<abcdef:12345>')).toBe(false);
// Other similar cases
expect(isProbablyHTML('<foo:bar>')).toBe(false);
expect(isProbablyHTML('<123>')).toBe(false);
expect(isProbablyHTML('<test@example.com>')).toBe(false);
expect(isProbablyHTML('<custom-element>')).toBe(false);
// Mathematical expressions
expect(isProbablyHTML('if x < 5 and y > 10')).toBe(false);
expect(isProbablyHTML('price < $100')).toBe(false);
});
});
describe('sanitizeHtmlIfNeeded', () => {

View File

@@ -68,9 +68,87 @@ export function isProbablyHTML(text: string) {
return true;
}
// Check if the string contains common HTML patterns
if (!hasHtmlTagPattern(text)) {
return false;
}
const parser = new DOMParser();
const doc = parser.parseFromString(cleanedStr, 'text/html');
return Array.from(doc.body.childNodes).some(({ nodeType }) => nodeType === 1);
// Check if parsing created actual HTML elements (not just text nodes)
const elements = Array.from(doc.body.childNodes).filter(
node => node.nodeType === 1,
) as Element[];
// If no elements were created, it's not HTML
if (elements.length === 0) {
return false;
}
// Check if the elements are known HTML tags (not custom/unknown tags)
// This prevents strings like "<abcdef:12345>" from being treated as HTML
return elements.some(element => {
const tagName = element.tagName.toLowerCase();
// List of common HTML tags we want to recognize
const knownHtmlTags = [
'div',
'span',
'p',
'a',
'b',
'i',
'u',
'em',
'strong',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'table',
'tr',
'td',
'th',
'tbody',
'thead',
'tfoot',
'ul',
'ol',
'li',
'img',
'br',
'hr',
'pre',
'code',
'blockquote',
'section',
'article',
'nav',
'header',
'footer',
'form',
'input',
'button',
'select',
'option',
'textarea',
'label',
'fieldset',
'legend',
'video',
'audio',
'canvas',
'iframe',
'script',
'style',
'link',
'meta',
'title',
];
return knownHtmlTags.includes(tagName);
});
}
export function sanitizeHtmlIfNeeded(htmlString: string) {

View File

@@ -43,7 +43,7 @@
"@storybook/types": "8.4.7",
"@types/react-loadable": "^5.5.11",
"core-js": "3.40.0",
"gh-pages": "^6.2.0",
"gh-pages": "^6.3.0",
"jquery": "^3.7.1",
"memoize-one": "^5.2.1",
"react": "^17.0.2",

View File

@@ -25,7 +25,7 @@
],
"dependencies": {
"@deck.gl/aggregation-layers": "^9.1.13",
"@deck.gl/core": "^9.1.13",
"@deck.gl/core": "^9.1.14",
"@deck.gl/geo-layers": "^9.1.13",
"@deck.gl/layers": "^9.1.13",
"@deck.gl/react": "^9.1.13",