diff --git a/.changeset/chilly-yaks-listen.md b/.changeset/chilly-yaks-listen.md
new file mode 100644
index 0000000000..8a4217f757
--- /dev/null
+++ b/.changeset/chilly-yaks-listen.md
@@ -0,0 +1,13 @@
+---
+'@evidence-dev/tailwind': patch
+---
+
+[!] BREAKING CHANGE:
+Custom theme colors are converted implicitly to kebab-case by tailwindcss
+
+This means that some color defined in `evidence.config.yaml` as `myCustomColor`
+should be used as (for example) `text-my-custom-color`. (`text-myCustomColor` will not work)
+
+When referencing custom theme colors in Javascript the original case should still be used
+(for example) `myCustomColor` would still be ` `
+_NOT_ ` `
diff --git a/.changeset/kind-fishes-mate.md b/.changeset/kind-fishes-mate.md
new file mode 100644
index 0000000000..57b2c12d93
--- /dev/null
+++ b/.changeset/kind-fishes-mate.md
@@ -0,0 +1,7 @@
+---
+'@evidence-dev/core-components': patch
+'@evidence-dev/tailwind': patch
+'@evidence-dev/evidence': patch
+---
+
+Use theme class instead of data-
diff --git a/.changeset/strong-wombats-admire.md b/.changeset/strong-wombats-admire.md
new file mode 100644
index 0000000000..6f4dc03056
--- /dev/null
+++ b/.changeset/strong-wombats-admire.md
@@ -0,0 +1,5 @@
+---
+'@evidence-dev/evidence': patch
+---
+
+Add theme.css export for svelte component tags that need to access tailwind theme
diff --git a/e2e/base-path/tests/tests.spec.js b/e2e/base-path/tests/tests.spec.js
index 43ccadb494..eac1dad3a8 100644
--- a/e2e/base-path/tests/tests.spec.js
+++ b/e2e/base-path/tests/tests.spec.js
@@ -191,6 +191,24 @@ test.describe('Page', () => {
});
});
+test.describe('Parquet Files', () => {
+ test('Manifest links should use base path', async ({ page }) => {
+ // Firefox does not behave as expected in playwright.
+ // This isn't a browser-specific test, so we can get away with
+ // not running on firefox
+ if (test.info().project.name === 'firefox') return;
+ page.addListener('request', (req) => {
+ console.log(req.url());
+ });
+ const reqPromise = page.waitForRequest(`${basePath}/data/needful_things/orders/orders.parquet`);
+ page.goto(basePath);
+ const req = await reqPromise;
+
+ const res = await req.response();
+ expect(res?.ok()).toBe(true);
+ });
+});
+
test.describe('Components', () => {
test('Table row links should use base path', async ({ page }) => {
await page.goto(`${basePath}/table-row-links`);
diff --git a/e2e/hmr/tests/tests.spec.js b/e2e/hmr/tests/tests.spec.js
index d19b538c59..fba0d2b68a 100644
--- a/e2e/hmr/tests/tests.spec.js
+++ b/e2e/hmr/tests/tests.spec.js
@@ -1,6 +1,6 @@
// @ts-check
import { test, expect } from '@playwright/test';
-import { createFile, deleteFile, editFile, restoreChangedFiles } from './fs-utils';
+import { editFile, restoreChangedFiles } from './fs-utils';
import { waitForPageToLoad } from '../../test-utils';
/** @param {import("@playwright/test").Page} page */
@@ -26,34 +26,6 @@ test.describe('pages', () => {
await expect(page.getByText('This page has some different text on it')).toBeVisible();
});
-
- test('creating should add to the sidebar and allow navigation', async ({ page }) => {
- await page.goto('/');
- await waitForPageToLoad(page);
-
- await expect(page.getByText('Index')).toBeVisible();
-
- createFile('pages/new-page.md', 'This is a new page');
- // file deletions trigger full reload, so we don't waitForHMR() here
-
- await expect(page.getByRole('link', { name: 'New Page' })).toBeVisible();
- await page.goto('/new-page');
- await expect(page.getByText('This is a new page')).toBeVisible();
- });
-
- test('deleting should remove from the sidebar and prevent navigation', async ({ page }) => {
- await page.goto('/');
- await waitForPageToLoad(page);
-
- await expect(page.getByText('Index')).toBeVisible();
-
- deleteFile('pages/page.md');
- await waitForHMR(page);
-
- await expect(page.getByRole('link', { name: 'Page' })).not.toBeVisible();
- await page.goto('/page');
- await expect(page.getByText('Page Not Found')).toBeVisible();
- });
});
test.describe('sources', () => {
diff --git a/e2e/themes/pages/index.md b/e2e/themes/pages/index.md
index 1da87b7063..8788f51fa1 100644
--- a/e2e/themes/pages/index.md
+++ b/e2e/themes/pages/index.md
@@ -6,7 +6,7 @@
div-primary-var
-
+
div-myCustomColor-class
diff --git a/package.json b/package.json
index 201f368425..aea239f600 100644
--- a/package.json
+++ b/package.json
@@ -26,6 +26,8 @@
"@evidence-dev/telemetry": "link:packages/lib/telemetry",
"@evidence-dev/trino": "link:packages/datasources/trino",
"@evidence-dev/universal-sql": "link:packages/lib/universal-sql",
+ "@tailwindcss/vite": "^4.0.0",
+ "tailwindcss": "^4.0.0",
"@parcel/packager-ts": "2.12.0",
"@parcel/transformer-typescript-types": "2.12.0",
"@playwright/test": "^1.45.3",
diff --git a/packages/evidence/package.json b/packages/evidence/package.json
index 6d20f06bf0..43a564b387 100644
--- a/packages/evidence/package.json
+++ b/packages/evidence/package.json
@@ -21,6 +21,9 @@
"bin": {
"evidence": "cli.js"
},
+ "exports": {
+ "./theme.css": "./template/src/app.css"
+ },
"scripts": {
"build": "node scripts/build-template",
"prepublishOnly": "npm run build"
@@ -54,12 +57,10 @@
"autoprefixer": "^10.4.7",
"debounce": "^1.2.1",
"git-remote-origin-url": "4.0.0",
- "postcss": "^8.4.14",
- "postcss-load-config": "^4.0.1",
"svelte": "4.2.19",
"svelte-preprocess": "5.1.3",
"svelte2tsx": "0.7.4",
- "tailwindcss": "^3.3.1",
+ "tailwindcss": "^4.0.0",
"typescript": "5.4.2",
"unist-util-visit": "4.1.2",
"vite": "5.4.14"
diff --git a/packages/evidence/scripts/build-template.js b/packages/evidence/scripts/build-template.js
index da1cd2ab27..cc3b6caddd 100644
--- a/packages/evidence/scripts/build-template.js
+++ b/packages/evidence/scripts/build-template.js
@@ -21,9 +21,7 @@ const templatePaths = [
'src/pages/settings/',
'src/pages/explore',
'src/pages/api/',
- 'src/pages/manifest.webmanifest/+server.js',
- 'tailwind.config.cjs',
- 'postcss.config.cjs'
+ 'src/pages/manifest.webmanifest/+server.js'
];
const ignorePaths = ['static/data'];
@@ -54,6 +52,7 @@ fsExtra.outputFileSync(
import { isDebug } from '@evidence-dev/sdk/utils';
import { log } from "@evidence-dev/sdk/logger";
import { evidenceThemes } from '@evidence-dev/tailwind/vite-plugin';
+ import tailwindcss from '@tailwindcss/vite';
process.removeAllListeners('warning');
@@ -73,7 +72,7 @@ fsExtra.outputFileSync(
/** @type {import('vite').UserConfig} */
const config =
{
- plugins: [sveltekit(), configVirtual(), queryDirectoryHmr, sourceQueryHmr(), evidenceThemes()],
+ plugins: [tailwindcss(), sveltekit(), configVirtual(), queryDirectoryHmr, sourceQueryHmr(), evidenceThemes()],
optimizeDeps: {
include: ['echarts-stat', 'echarts', 'blueimp-md5', 'nanoid', '@uwdata/mosaic-sql',
// We need these to prevent HMR from doing a full page reload
diff --git a/packages/evidence/scripts/svelte.config.js b/packages/evidence/scripts/svelte.config.js
index 1c5fb12d35..03cab9dff1 100644
--- a/packages/evidence/scripts/svelte.config.js
+++ b/packages/evidence/scripts/svelte.config.js
@@ -1,5 +1,5 @@
import evidencePreprocess from '@evidence-dev/preprocess';
-import preprocess from 'svelte-preprocess';
+
import adapter from '@sveltejs/adapter-static';
import { addBasePathToHrefAndSrc, injectComponents } from '@evidence-dev/sdk/build/svelte';
import fs from 'fs';
@@ -37,14 +37,7 @@ function errorHandler(warning) {
/** @type {import('@sveltejs/kit').Config} */
const config = {
extensions: ['.svelte', '.md'],
- preprocess: [
- ...evidencePreprocess(true),
- injectComponents(),
- preprocess({
- postcss: true
- }),
- addBasePathToHrefAndSrc
- ],
+ preprocess: [...evidencePreprocess(true), injectComponents(), addBasePathToHrefAndSrc],
onwarn: errorHandler,
kit: {
adapter: adapter({
diff --git a/packages/lib/component-utilities/src/stores.js b/packages/lib/component-utilities/src/stores.js
index e22e609d04..9d988363b4 100644
--- a/packages/lib/component-utilities/src/stores.js
+++ b/packages/lib/component-utilities/src/stores.js
@@ -1,6 +1,6 @@
import { dev } from '$app/environment';
import { browser } from '$app/environment';
-import { writable } from 'svelte/store';
+import { get, writable } from 'svelte/store';
export const pageHasQueries = writable(true);
export const routeHash = writable('');
@@ -60,17 +60,6 @@ function createToastsObject() {
/** @type {import('svelte/store').Readable
& { add: (toast: Toast, timeout: number) => void }} */
export const toasts = createToastsObject();
-/**
- * @template T
- * @param {import('svelte/store').Readable} store
- * @returns {T}
- */
-const getStoreVal = (store) => {
- let v;
- store.subscribe((x) => (v = x))();
- return v;
-};
-
/** @template T @typedef {{ serialize: (value: T) => string; deserialize: (raw: string) => T }} SerializeAndDeserialize */
/**
@@ -99,7 +88,7 @@ export const localStorageStore = (key, init, serializeAndDeserialize) => {
}
};
- flush(getStoreVal(store));
+ flush(get(store));
/** @type {Writable} */
return {
@@ -109,7 +98,7 @@ export const localStorageStore = (key, init, serializeAndDeserialize) => {
flush(v);
},
update: (cb) => {
- const updatedStore = cb(getStoreVal(store));
+ const updatedStore = cb(get(store));
set(updatedStore);
flush(updatedStore);
}
diff --git a/packages/lib/sdk/src/build-dev/vite/virtuals/initUsql.js b/packages/lib/sdk/src/build-dev/vite/virtuals/initUsql.js
deleted file mode 100644
index dabd7b84b6..0000000000
--- a/packages/lib/sdk/src/build-dev/vite/virtuals/initUsql.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import {
- initDB,
- setParquetURLs,
- updateSearchPath,
- query
-} from '@evidence-dev/universal-sql/client-duckdb';
-
-import { getManifest } from '$evidence/static-assets';
-
-export default (async () => {
- await initDB();
- let res;
- // TODO: Optionally take in a filepath and/or URL for the manifest
- res = await getManifest();
- res = JSON.parse(res);
-
- await setParquetURLs(res.renderedFiles ?? {});
- await updateSearchPath(Object.keys(res.renderedFiles ?? {}));
- if (!res.renderedFiles) console.error('No fixture data available!');
- // Test Query
- await query('SELECT * FROM information_schema.tables');
- console.log('Universal SQL has been initialized successfully');
-})();
diff --git a/packages/lib/universal-sql/package.json b/packages/lib/universal-sql/package.json
index e339f24377..e5d71d5556 100644
--- a/packages/lib/universal-sql/package.json
+++ b/packages/lib/universal-sql/package.json
@@ -20,7 +20,6 @@
"cli-progress": "^3.12.0",
"lodash.chunk": "^4.2.0",
"parquet-wasm": "0.5.0",
- "@evidence-dev/sdk": "workspace:*",
"web-worker": "^1.2.0"
},
"exports": {
diff --git a/packages/lib/universal-sql/src/build-parquet.js b/packages/lib/universal-sql/src/build-parquet.js
index 42dd46709a..aa971bdc8a 100644
--- a/packages/lib/universal-sql/src/build-parquet.js
+++ b/packages/lib/universal-sql/src/build-parquet.js
@@ -20,7 +20,7 @@ import { emptyDbFs, initDB, query } from './client-duckdb/node.js';
import chunk from 'lodash.chunk';
import { columnsToScore } from './calculateScore.js';
import chalk from 'chalk';
-import { log } from '@evidence-dev/sdk/logger';
+// import { log } from '@evidence-dev/sdk/logger';
/**
* @param {{name: string, evidenceType: string}} column
@@ -86,9 +86,9 @@ export async function buildMultipartParquet(
outputFilename,
batchSize = 1000000
) {
- log.debug(`Building parquet file ${outputFilename}`);
- let { meta: fn_meta, done: fn_done } = log.measure('buildMultipartParquet');
- fn_meta('output filename', outputFilename);
+ // log.debug(`Building parquet file ${outputFilename}`);
+ // let { meta: fn_meta, done: fn_done } = log.measure('buildMultipartParquet');
+ // fn_meta('output filename', outputFilename);
let batchNum = 0;
const outputSubpath = outputFilename.split('.parquet')[0];
@@ -96,9 +96,9 @@ export async function buildMultipartParquet(
let rowCount = 0;
const flush = async (results) => {
- log.debug(`Flushing batch ${batchNum} with ${results.length} rows`);
- let { meta, done } = log.measure('flush');
- meta('batch number', batchNum);
+ // log.debug(`Flushing batch ${batchNum} with ${results.length} rows`);
+ // let { meta, done } = log.measure('flush');
+ // meta('batch number', batchNum);
// Convert JS Objects -> Arrow
const vectorized = Object.fromEntries(
@@ -131,8 +131,8 @@ export async function buildMultipartParquet(
tmpFilenames.push(tempFilename);
rowCount += results.length;
- done();
- log.debug(`Flushed batch ${batchNum} with ${results.length} rows`);
+ // done();
+ // log.debug(`Flushed batch ${batchNum} with ${results.length} rows`);
batchNum++;
};
@@ -153,26 +153,26 @@ export async function buildMultipartParquet(
})();
}
- log.debug('Reading rows from a generator object');
- let { meta, done } = log.measure('buildMultipartParquet');
- meta('batch number', batchNum);
+ // log.debug('Reading rows from a generator object');
+ // let { meta, done } = log.measure('buildMultipartParquet');
+ // meta('batch number', batchNum);
const currentBatch = [];
for await (const results of data) {
for (const result of results) currentBatch.push(result);
if (currentBatch.length >= batchSize) {
- done();
- log.debug(`Flushing batch ${batchNum} with ${currentBatch.length} rows`);
+ // done();
+ // log.debug(`Flushing batch ${batchNum} with ${currentBatch.length} rows`);
await flush(currentBatch);
currentBatch.length = 0;
- ({ meta, done } = log.measure('buildMultipartParquet'));
- meta('batch number', batchNum);
+ // ({ meta, done } = log.measure('buildMultipartParquet'));
+ // meta('batch number', batchNum);
}
}
- done();
- log.debug(`Flushing batch ${batchNum} with ${currentBatch.length} rows`);
+ // done();
+ // log.debug(`Flushing batch ${batchNum} with ${currentBatch.length} rows`);
if (currentBatch.length) await flush(currentBatch);
@@ -230,7 +230,7 @@ export async function buildMultipartParquet(
}
await emptyDbFs('*');
- fn_done();
+ // fn_done();
return rowCount;
}
diff --git a/packages/lib/universal-sql/src/client-duckdb/browser.d.ts b/packages/lib/universal-sql/src/client-duckdb/browser.d.ts
index 6783a0168c..f3f51e0d2f 100644
--- a/packages/lib/universal-sql/src/client-duckdb/browser.d.ts
+++ b/packages/lib/universal-sql/src/client-duckdb/browser.d.ts
@@ -25,10 +25,13 @@ export function query(sql: string): Promise[]>;
* Adds a new view to the database, pointing to the provided parquet URLs.
*
* @param {Record} urls
- * @param {boolean} [append]
+ * @param {{ append?: boolean, addBasePath?: (path: string) => string }} [opts]
* @returns {Promise}
*/
-export function setParquetURLs(urls: Record, append?: boolean): Promise;
+export function setParquetURLs(
+ urls: Record,
+ opts?: { append?: boolean; addBasePath?: (path: string) => string }
+): Promise;
/**
* Converts an Apache Arrow table to a Javascript array.
diff --git a/packages/lib/universal-sql/src/client-duckdb/browser.js b/packages/lib/universal-sql/src/client-duckdb/browser.js
index 33e008f3f6..27c5b439a5 100644
--- a/packages/lib/universal-sql/src/client-duckdb/browser.js
+++ b/packages/lib/universal-sql/src/client-duckdb/browser.js
@@ -6,7 +6,6 @@ import {
getPlatformFeatures,
VoidLogger
} from '@duckdb/duckdb-wasm';
-import { addBasePath } from '@evidence-dev/sdk/utils/svelte';
export { tableFromIPC } from 'apache-arrow';
@@ -106,10 +105,10 @@ export async function emptyDbFs(targetGlob) {
/**
* Adds a new view to the database, pointing to the provided parquet URL.
* @param {Record} urls
- * @param {boolean} [append]
+ * @param {{ append?: boolean, addBasePath?: (path: string) => string }} [opts]
* @returns {Promise}
*/
-export async function setParquetURLs(urls, append = false) {
+export async function setParquetURLs(urls, { append, addBasePath = (x) => x } = {}) {
if (!db) await initDB();
if (!append) await emptyDbFs('*');
if (import.meta.env.VITE_EVIDENCE_DEBUG) console.debug('Updating Parquet URLs');
@@ -142,6 +141,7 @@ export async function setParquetURLs(urls, append = false) {
resolveTables();
} catch (e) {
rejectTables(e);
+ console.error(`Error encountered while updating Parquet URLs`, e);
throw e;
}
}
diff --git a/packages/lib/universal-sql/src/client-duckdb/node.d.ts b/packages/lib/universal-sql/src/client-duckdb/node.d.ts
index bd07f9bac1..779ea3ee2b 100644
--- a/packages/lib/universal-sql/src/client-duckdb/node.d.ts
+++ b/packages/lib/universal-sql/src/client-duckdb/node.d.ts
@@ -30,10 +30,10 @@ export function query(
* Adds a new view to the database, pointing to the provided parquet URLs.
*
* @param {Record} urls
- * @param {boolean} [append]
+ * @param {{ append?: boolean }} [opts]
* @returns {void}
*/
-export function setParquetURLs(urls: Record, append?: boolean): void;
+export function setParquetURLs(urls: Record, opts?: { append?: boolean }): void;
/**
* Converts an Apache Arrow table to a Javascript array.
diff --git a/packages/lib/universal-sql/src/client-duckdb/node.js b/packages/lib/universal-sql/src/client-duckdb/node.js
index 54e20e507d..62ed790611 100644
--- a/packages/lib/universal-sql/src/client-duckdb/node.js
+++ b/packages/lib/universal-sql/src/client-duckdb/node.js
@@ -103,10 +103,10 @@ export async function emptyDbFs(targetGlob) {
* Adds a new view to the database, pointing to the provided parquet URLs.
*
* @param {Record} urls
- * @param {boolean} [append]
+ * @param {{ append?: boolean }} [opts]
* @returns {void}
*/
-export async function setParquetURLs(urls, append = false) {
+export async function setParquetURLs(urls, { append } = {}) {
if (!append) await emptyDbFs('*');
const pathDelimiterRegex = /[\\/]/;
diff --git a/packages/ui/core-components/.storybook/main.js b/packages/ui/core-components/.storybook/main.js
index 958ee22932..47b31ed6cc 100644
--- a/packages/ui/core-components/.storybook/main.js
+++ b/packages/ui/core-components/.storybook/main.js
@@ -15,8 +15,10 @@ const config = {
builder: '@storybook/builder-vite'
},
async viteFinal(config) {
+ // This was being weird about the imports, so we did it dynamically
+ const tailwindcss = (await import('@tailwindcss/vite')).default;
return mergeConfig(config, {
- plugins: [evidenceThemes()],
+ plugins: [tailwindcss(), evidenceThemes()],
server: {
fs: {
strict: false
diff --git a/packages/ui/core-components/.storybook/preview.js b/packages/ui/core-components/.storybook/preview.js
index 50c32f27a7..33cae35d5b 100644
--- a/packages/ui/core-components/.storybook/preview.js
+++ b/packages/ui/core-components/.storybook/preview.js
@@ -1,6 +1,6 @@
-import { withThemeByDataAttribute } from '@storybook/addon-themes';
+import { withThemeByClassName } from '@storybook/addon-themes';
-import '../src/app.postcss';
+import '../src/app.css';
import WithEvidence from '../src/lib/storybook-helpers/WithEvidence.svelte';
import { initialize } from '../src/lib/storybook-helpers/initializeUSQL.js';
@@ -23,12 +23,11 @@ const preview = {
series: { table: { disable: true } }
},
decorators: [
- withThemeByDataAttribute({
+ withThemeByClassName({
themes: {
- light: 'light',
- dark: 'dark'
+ light: 'theme-light',
+ dark: 'theme-dark'
},
- attributeName: 'data-theme',
defaultTheme: 'light'
}),
() => WithEvidence
diff --git a/packages/ui/core-components/package.json b/packages/ui/core-components/package.json
index d339a8573b..c244720f1c 100644
--- a/packages/ui/core-components/package.json
+++ b/packages/ui/core-components/package.json
@@ -94,6 +94,7 @@
"@sveltejs/kit": "2.8.4",
"@sveltejs/package": "^2.3.1",
"@sveltejs/vite-plugin-svelte": "3.0.2",
+ "@tailwindcss/vite": "^4.0.0",
"@types/chroma-js": "^2.4.4",
"@types/lodash.debounce": "^4.0.9",
"@vitest/coverage-v8": "3.0.5",
@@ -104,8 +105,6 @@
"eslint-plugin-storybook": "^0.8.0",
"eslint-plugin-svelte": "2.35.1",
"mockdate": "^3.0.5",
- "postcss": "^8.4.38",
- "postcss-load-config": "^4.0.2",
"prettier": "^3.2.5",
"prettier-plugin-svelte": "^3.2.3",
"publint": "^0.1.16",
@@ -115,7 +114,7 @@
"svelte": "4.2.19",
"svelte-check": "3.6.7",
"svelte-preprocess": "5.1.3",
- "tailwindcss": "^3.4.3",
+ "tailwindcss": "^4.0.0",
"tslib": "^2.6.2",
"typescript": "5.4.2",
"vite": "5.4.14",
diff --git a/packages/ui/core-components/postcss.config.cjs b/packages/ui/core-components/postcss.config.cjs
deleted file mode 100644
index 6293c3dc90..0000000000
--- a/packages/ui/core-components/postcss.config.cjs
+++ /dev/null
@@ -1,11 +0,0 @@
-const config = {
- plugins: [
- require('tailwindcss/nesting')(),
- //Some plugins, like tailwindcss/nesting, need to run before Tailwind,
- require('tailwindcss')(),
- //But others, like autoprefixer, need to run after,
- require('autoprefixer')
- ]
-};
-
-module.exports = config;
diff --git a/packages/ui/core-components/src/app.css b/packages/ui/core-components/src/app.css
new file mode 100644
index 0000000000..77d1360795
--- /dev/null
+++ b/packages/ui/core-components/src/app.css
@@ -0,0 +1,21 @@
+/* Write your global styles here, in PostCSS syntax */
+@import 'tailwindcss';
+@config "@evidence-dev/tailwind/config";
+
+/*
+ The default border color has changed to `currentColor` in Tailwind CSS v4,
+ so we've added these compatibility styles to make sure everything still
+ looks the same as it did with Tailwind CSS v3.
+
+ If we ever want to remove these styles, we need to add an explicit border
+ color utility to any element that depends on these defaults.
+*/
+@layer base {
+ *,
+ ::after,
+ ::before,
+ ::backdrop,
+ ::file-selector-button {
+ border-color: var(--color-gray-200, currentColor);
+ }
+}
diff --git a/packages/ui/core-components/src/app.postcss b/packages/ui/core-components/src/app.postcss
deleted file mode 100644
index 1a7b7cf38b..0000000000
--- a/packages/ui/core-components/src/app.postcss
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Write your global styles here, in PostCSS syntax */
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
diff --git a/packages/ui/core-components/src/lib/atoms/alert/Alert.svelte b/packages/ui/core-components/src/lib/atoms/alert/Alert.svelte
index b4fd5f3582..b9cd92c91b 100644
--- a/packages/ui/core-components/src/lib/atoms/alert/Alert.svelte
+++ b/packages/ui/core-components/src/lib/atoms/alert/Alert.svelte
@@ -18,6 +18,13 @@
}
return input;
};
+
+ const classMap = {
+ info: 'border-info/50 bg-info/10 text-info',
+ negative: 'border-negative/50 bg-negative/10 text-negative',
+ positive: 'border-positive/50 bg-positive/10 text-positive',
+ warning: 'border-warning/50 bg-warning/10 text-warning'
+ };
-
+
Copied to clipboard
{/if}
diff --git a/packages/ui/core-components/src/lib/atoms/fullscreen/Fullscreen.svelte b/packages/ui/core-components/src/lib/atoms/fullscreen/Fullscreen.svelte
index 343fd3b71a..e0fb99dd24 100644
--- a/packages/ui/core-components/src/lib/atoms/fullscreen/Fullscreen.svelte
+++ b/packages/ui/core-components/src/lib/atoms/fullscreen/Fullscreen.svelte
@@ -66,7 +66,7 @@
@@ -79,12 +79,8 @@
-
diff --git a/packages/ui/core-components/src/lib/molecules/toast/Toast.svelte b/packages/ui/core-components/src/lib/molecules/toast/Toast.svelte
index e995a55d83..a9501c42d0 100644
--- a/packages/ui/core-components/src/lib/molecules/toast/Toast.svelte
+++ b/packages/ui/core-components/src/lib/molecules/toast/Toast.svelte
@@ -15,6 +15,13 @@
}
return status;
};
+
+ const classLookup = {
+ negative: 'border-negative/50 bg-negative/10 text-negative',
+ positive: 'border-positive/50 bg-positive/10 text-positive',
+ info: 'border-info/50 bg-info/10 text-info',
+ warning: 'border-warning/50 bg-warning/10 text-warning'
+ };
-
+
diff --git a/packages/ui/core-components/src/lib/organisms/layout/header/SearchButton.css b/packages/ui/core-components/src/lib/organisms/layout/header/SearchButton.css
deleted file mode 100644
index f42d63eaac..0000000000
--- a/packages/ui/core-components/src/lib/organisms/layout/header/SearchButton.css
+++ /dev/null
@@ -1,16 +0,0 @@
-.DocSearch-Button {
- @apply bg-base-100 border-base-300 hover:bg-base-200/40 transition-colors duration-200 rounded-md flex gap-16 cursor-pointer py-1 pl-2 sm:pr-1 pr-20 sm:text-xs border font-sans font-medium items-center;
-}
-.DocSearch-Button-Placeholder {
- @apply text-base-content-muted;
-}
-.DocSearch-Search-Icon {
- display: none;
-}
-.DocSearch-Button-Keys {
- @apply sm:flex gap-0.5 bg-base-200/40 border-base-300 border rounded px-1 py-0.5 text-xs hidden;
-}
-.DocSearch-Button-Key,
-.DocSearch-Control-Key-Icon {
- @apply text-base-content-muted *:text-base-content-muted;
-}
diff --git a/packages/ui/core-components/src/lib/organisms/layout/sidebar/Badge.svelte b/packages/ui/core-components/src/lib/organisms/layout/sidebar/Badge.svelte
index 20f1357d00..5aac412a7f 100644
--- a/packages/ui/core-components/src/lib/organisms/layout/sidebar/Badge.svelte
+++ b/packages/ui/core-components/src/lib/organisms/layout/sidebar/Badge.svelte
@@ -1,5 +1,5 @@
diff --git a/packages/ui/core-components/src/lib/organisms/layout/tableofcontents/ContentsList.svelte b/packages/ui/core-components/src/lib/organisms/layout/tableofcontents/ContentsList.svelte
index e19e5339aa..3e4156d725 100644
--- a/packages/ui/core-components/src/lib/organisms/layout/tableofcontents/ContentsList.svelte
+++ b/packages/ui/core-components/src/lib/organisms/layout/tableofcontents/ContentsList.svelte
@@ -28,6 +28,12 @@
onDestroy(() => {
observer?.disconnect();
});
+
+ const classLookup = {
+ h1: 'mt-3 font-semibold block bg-base-100 shadow shadow-base-100',
+ h2: 'pl-0 text-base-content-muted',
+ h3: 'pl-4 text-base-content-muted'
+ };
{#if headers && headers.length > 1}
@@ -35,30 +41,13 @@
On this page
{#each headers as header}
-
{/each}
{/if}
-
-
diff --git a/packages/ui/core-components/src/lib/organisms/source-config/SourceConfigFormField.svelte b/packages/ui/core-components/src/lib/organisms/source-config/SourceConfigFormField.svelte
index d77b0a2922..be6bff83de 100644
--- a/packages/ui/core-components/src/lib/organisms/source-config/SourceConfigFormField.svelte
+++ b/packages/ui/core-components/src/lib/organisms/source-config/SourceConfigFormField.svelte
@@ -148,6 +148,9 @@
$: options[fieldValueKey] = fieldValue;
$: fieldDisabled = disabled || spec.forceReference || (spec.references && refVal !== null);
+
+ const inputClasses =
+ 'rounded-md border border-base-300 bg-base-100 shadow-sm px-2 py-1 text-sm focus-visible:ring-base-300 flex h-9 w-full transition-colors focus-visible:outline-none focus-visible:ring-1 p-1 ml-auto align-middle';
@@ -161,6 +164,7 @@
{#if spec.type === 'string'}
{#if spec.secret && !reveal && spec.shown !== true}
{:else}
{:else if spec.type === 'number'}
{:else if spec.type === 'select' && Array.isArray(spec.options)}
-
+
{#each spec.options as option}
{#if typeof option === 'string'}
@@ -227,15 +233,3 @@
{/if}
-
-
diff --git a/packages/ui/core-components/src/lib/storybook-helpers/WithEvidence.svelte b/packages/ui/core-components/src/lib/storybook-helpers/WithEvidence.svelte
index 0459a0cfbd..617dc648fc 100644
--- a/packages/ui/core-components/src/lib/storybook-helpers/WithEvidence.svelte
+++ b/packages/ui/core-components/src/lib/storybook-helpers/WithEvidence.svelte
@@ -1,6 +1,7 @@
-
-
diff --git a/packages/ui/core-components/src/lib/storybook-helpers/initializeUSQL.js b/packages/ui/core-components/src/lib/storybook-helpers/initializeUSQL.js
index 4a5303bd4e..b45ef48d13 100644
--- a/packages/ui/core-components/src/lib/storybook-helpers/initializeUSQL.js
+++ b/packages/ui/core-components/src/lib/storybook-helpers/initializeUSQL.js
@@ -9,7 +9,7 @@ export async function initialize() {
try {
await initDB();
const res = await fetch(addBasePath('/data/manifest.json')).then((r) => r.json());
- await setParquetURLs(res.renderedFiles ?? {});
+ await setParquetURLs(res.renderedFiles ?? {}, { addBasePath });
await updateSearchPath(Object.keys(res.renderedFiles ?? {}));
if (!res.renderedFiles) console.error('No fixture data available!');
} catch (e) {
diff --git a/packages/ui/core-components/src/lib/themes/themes.js b/packages/ui/core-components/src/lib/themes/themes.js
index 86c8156d88..adfa5e0cc6 100644
--- a/packages/ui/core-components/src/lib/themes/themes.js
+++ b/packages/ui/core-components/src/lib/themes/themes.js
@@ -105,26 +105,47 @@ export class ThemeStores {
}
/** @param {HTMLElement} element */
- syncDataThemeAttribute = (element) => {
- // Sync activeAppearance -> html[data-theme]
+ syncThemeAttribute = (element) => {
+ // Sync activeAppearance -> .theme-
+ const removeAllThemes = () => {
+ // When running in chromatic, it was complaining that forEach was not a function
+ // By explicitly converting to an array, we are ensuring that it will behave
+ // as we expect it to
+ Array.from(element.classList.values()).forEach((className) => {
+ if (className.startsWith('theme-')) {
+ element.classList.remove(className);
+ }
+ });
+ };
+
+ let controlledUpdate = false;
const unsubscribe = this.#activeAppearance.subscribe(($activeAppearance) => {
- const current = element.getAttribute('data-theme');
- if (current !== $activeAppearance) {
- element.setAttribute('data-theme', $activeAppearance);
- }
+ requestAnimationFrame(() => {
+ controlledUpdate = true;
+ // try to do this all in one frame to prevent jitter
+ removeAllThemes();
+ element.classList.add(`theme-${$activeAppearance}`);
+ requestAnimationFrame(() => (controlledUpdate = false));
+ });
});
- // Sync html[data-theme] -> activeAppearance
+ // Sync .theme- -> activeAppearance
const observer = new MutationObserver((mutations) => {
+ if (controlledUpdate) return;
const html = /** @type {HTMLHtmlElement} */ (mutations[0].target);
- const theme = html.getAttribute('data-theme');
+ const themes = [
+ ...html.classList.values().filter((className) => className.startsWith('theme-'))
+ ];
+ if (themes.length === 0) return;
+ const theme = themes[0].replace('theme-', '');
+
if (!theme || !['light', 'dark'].includes(theme)) return;
const current = get(this.#activeAppearance);
if (theme !== current) {
this.#selectedAppearance.set(/** @type {'light' | 'dark'} */ (theme));
}
});
- observer.observe(element, { attributeFilter: ['data-theme'] });
+ observer.observe(element, { attributeFilter: ['class'] });
return () => {
unsubscribe();
diff --git a/packages/ui/core-components/src/lib/unsorted/ui/Deployment/EvidenceDeploy.svelte b/packages/ui/core-components/src/lib/unsorted/ui/Deployment/EvidenceDeploy.svelte
index 8de49af055..f731b6cc24 100644
--- a/packages/ui/core-components/src/lib/unsorted/ui/Deployment/EvidenceDeploy.svelte
+++ b/packages/ui/core-components/src/lib/unsorted/ui/Deployment/EvidenceDeploy.svelte
@@ -1,5 +1,5 @@
-Deploying to Evidence Cloud
-Evidence Cloud allows you to:
+Deploying to Evidence Cloud
+Evidence Cloud allows you to:
Host your project at {'<'}project-name{'>'}.evidence.app
Authenticate users
@@ -18,15 +18,7 @@
-
diff --git a/packages/ui/core-components/src/lib/unsorted/ui/QueryViewerSupport/QueryDataTable.svelte b/packages/ui/core-components/src/lib/unsorted/ui/QueryViewerSupport/QueryDataTable.svelte
index 7eab35c6a1..e5fb5c9c63 100644
--- a/packages/ui/core-components/src/lib/unsorted/ui/QueryViewerSupport/QueryDataTable.svelte
+++ b/packages/ui/core-components/src/lib/unsorted/ui/QueryViewerSupport/QueryDataTable.svelte
@@ -52,13 +52,13 @@