* fix: key the large root font size on screen width, not window width
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: move the flow preview button offset to the screen-width query
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(frontend): render ordered lists in markdown descriptions
`GfmMarkdown` defaulted to `prose-xs`, which Tailwind Typography does not
define — the class only ever matched four hand-rolled rules in app.css, all
scoped to `ul`. Every surface on that default (script and flow descriptions,
flow-graph notes, markdown job results) therefore rendered `<ol>` with
Preflight's `list-style: none` and no typography at all: no numbers, no
heading or paragraph rhythm.
Route the default through the shared `markdownProse` stacks instead, and cut
the app.css list rules down to the dash glyph so ordered and unordered lists
share Tailwind Typography's indentation and rhythm.
Fixes#10971
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6G5gDXJnm6uqch4uCPkPE
* fix(frontend): address review nits on the markdown prose fix
- default `GfmMarkdown` to the `sm` stack rather than `xs`: the AI-agent tool
Message pane takes the default and has no ancestor font size, so `xs` left it
smaller than its own label. The group note, whose wrapper is `text-2xs`, opts
down explicitly.
- regenerate `static/tailwind_full.css`, which raw apps are served and which
still carried the deleted list rules.
- correct the marker-color rationale: the typography config already maps markers
to tertiary, so the rule steps them up rather than rescuing them.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6G5gDXJnm6uqch4uCPkPE
* fix(frontend): make the note color override an arbitrary value
`text-inherit` is not generated: this config replaces the Tailwind color palette
outright and defines no `inherit` key, so `[&_*]:!text-inherit` compiled to
nothing and notes still rendered in the prose stack's `text-primary`. Verified in
the browser: a yellow note's list items now compute to `text-yellow-900`, matching
the wrapper and the edit-mode textarea, in both themes.
Also drop the `static/tailwind_full.css` regeneration. That file was generated with
tailwind 3.4.1 against a config predating the typography theme overrides; rebuilding
it today sweeps in 250KB of unrelated churn and would flip every raw app's `.prose`
palette from stock gray to Windmill tokens. Its staleness predates this PR and is
its own change.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6G5gDXJnm6uqch4uCPkPE
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(frontend): draw the tab strip's scroll bar instead of the native one
The strip sizes its scroll row to the tabs, but a native horizontal
scrollbar claims layout height on top of that: Firefox spends 11px on
`scrollbar-width: thin` — `--wm-scrollbar-size` is WebKit-only, so the
4px it asks for is ignored there — which clipped the tabs at the top of
the 32px sessions strip and left a wide gutter under them.
Hide the native bar and draw a 4px thumb from `scrollLeft`/`scrollWidth`
instead: it costs no layout height, is the same size in every engine, and
sits on the strip's bottom edge, flush under the tabs. Tabs drop to `h-6`
so they clear it, and the strip's default height matches the sessions
caller's `h-8` so every strip has the same geometry.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(frontend): clamp the tab strip thumb at both ends of its track
WebKit's elastic overscroll drives `scrollLeft` negative, which slid the
thumb out of the track's left edge and into the strip's padding.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: bundle a vector emoji font so emoji scale with flow graph zoom
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: include the upstream copyright notice in the bundled OFL license
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: match the bundled license notice to the shipped font binaries
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs: correct the unicode-range gating comment
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat: universal styled markdown code blocks with copy button and subtle scrollbar
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(sessions): use the shared DraggableTabs for the preview tab strip
The session preview tabs were bespoke markup; converge them onto the same
DraggableTabs component the raw-app editor uses, gaining drag-reorder and
keyboard nav. The active tab keeps its breadcrumb/router picker via a new
tabAccessory snippet, and tabs persist their new order.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(sessions): keep the new-tab + button right after the last tab
Add an afterTabs snippet to DraggableTabs that renders inside the scroll row
after the tabs (unlike trailing, which stays pinned outside it), and move the
session preview "+" there so it sits next to the last tab.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(tabs): use the subtle ScrollableX scrollbar for Tabs/TabsV2 headers
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* style(sessions): use bg-surface for the preview tab strip
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* style(tabs): add subtle shadow-sm to the selected DraggableTabs tab
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* style(tabs): drop selected-tab shadow; session strip bg-surface-secondary/50
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* style(sessions): drop persistent bg on preview bar buttons, hover-only
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(scrollbar): share a .scrollbar-subtle utility across tabs and chat
Extract ScrollableX's hover-revealed scrollbar styling into a global
.scrollbar-subtle utility (both axes, size via --wm-scrollbar-size), have
ScrollableX consume it, and apply it to the AI chat message list so the chat
scrollbar matches the tabs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: address review — scope HighlightCode copy button, plaintext unknown fences, Tailwind ScrollableX
- HighlightCode: keep the subtle CopyButton + surface chip behind buttonsOnHover
so the ~20 non-markdown callers keep the original light copy Button.
- MarkdownCodeBlock: unlabeled/unknown fences render as plaintext instead of
being mis-colored as TypeScript; added common language aliases (ts/js/py/...)
so real languages still highlight.
- ScrollableX: replace the custom <style> block with Tailwind overflow classes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* style: make chat and session-sidebar typing dots slightly smaller
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: address auto-review — powershell fence to plaintext + reorder tests
- MarkdownCodeBlock: drop 'powershell' from the sql group so it renders
plaintext instead of SQL-colored (no powershell highlighter in the map).
- sessionPreviewTabs.test.ts: cover reorder (reorders+persists, ignores
unknown ids / keeps omitted at end, no-op when unchanged).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: keep scrollbar-hidden on Tabs row as TroubleshootFlowTutorial selector hook
codex-review: removing scrollbar-hidden broke the tutorial's '.border-b.flex
.flex-row.whitespace-nowrap.scrollbar-hidden.mx-auto' selector. The class is
inert on the non-scrolling row (ScrollableX owns the scroll) but is kept as the
tutorial's stable hook.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: preserve raw <pre> content in MarkdownCodeBlock (codex-review)
As the universal pre renderer, MarkdownCodeBlock also handles sanitized raw
HTML <pre>text</pre> from rehypeRaw, where the text is a direct child of <pre>
(no <code>). Fall back to that text child so raw pre content isn't dropped to
an empty block. Kitchen-sink sample gains a raw <pre> case.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: add fuzzy search to instance settings sidebar
Adds a search input at the top of the superadmin settings sidebar that
uses uFuzzy for fuzzy matching against all setting labels, descriptions,
and categories. Selecting a result navigates to the correct tab and
scrolls to the specific setting card with a brief highlight.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: improve settings search display and description matching
- Extract only the label portion from uFuzzy highlighted text for
cleaner dropdown display
- Show description only when the match is in the description and NOT
in the label
- Truncate descriptions to 80 chars in searchable items
- Add maxHeight prop to SelectDropdown for configurable height
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: fix search description truncation and handle undefined marked values
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: remove description from settings search dropdown
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add smooth outline transition for setting highlight animation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: highlight first search result by default for enter-to-select
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* nit
* clean code
* fix: address review feedback - sanitize html, remove max-w-40, document description field
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: constrain search dropdown width to prevent long title overflow
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* perf: add 150ms debounce to settings search filter
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: clean up timeouts on destroy and re-invocation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor: extract settings search into reusable SettingsSearchInput component
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: use twMerge for class prop in SettingsSearchInput
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: wrap debounced state write in untrack to prevent re-triggering
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* data tables settings ui
* install runed
* zod 4 fixes
* use new toJSONSchema
* Migrate ducklake catalogs to more generic custom instance databases
* fix compilation
* Safety conversion for old duckdb ffi
* data tables settings
* ts client basis
* inline run works
* datatables work
* Revert "datatables work"
This reverts commit 6e1588d59e.
* datatables work (without leaking pg credentials)
* println
* separate sqlUtils.ts
* nit
* Separate custom instance db Select and Wizard components
* nit
* nit wording
* add tags to custom instance dbs
* error when trying to use ducklake as datatable or opposite
* show status in dropdown
* data table instance setup works
* sqk function for ducklake
* factorize logic
* fix temp reactivity
* Data table assetexplore
* Migrate S3 permissions to modal
* Revert "Migrate S3 permissions to modal"
This reverts commit 0631d03cb0.
* nit query -> fetch
* Custom instance setup new look
* run_language_executor separate fn
* run_inline param
* nit wording
* Better typed client
* Data tables display as assets in frontend
* asset db icon
* nit
* cleaner errors
* nit
* Fix sed calls in mac
* run_inline_script_preview in python client
* basic python datatable client
* datatable and datalake parser in python
* ducklake client python
* nit fix
* Fix migration producing NULL instead of {} when no custom databases
* merge conflict fail
* python ducklake client arg fix
* parse or infer sql types in ts client
* ts asset parser, detect datatable & ducklake R/W
* fix sql repl for other read ops than select
* export type SqlTemplateFunction
* rename list_custom_instance_pg_databases
* typecheck datatable and ducklake name in Typescript
* Fix typecheck datatable and ducklake in TS
* declare module overriding instead of extending
* infer_sql_type in python client
* SqlQuery object in python
* fix merge conflicts
* update const_format
* CI fix
* factor out to var_identifiers
* sqlx prepare
* unnecessary security (admin is required)
* clearer comment
* ee repo ref
* nit snake case
* claude step 1: detect var declarations
* move detect_sql_access_type to common mod
* claude step 2: detect when saved vars are queried
* Revert "claude step 2: detect when saved vars are queried"
This reverts commit 1e1f930568.
* Revert "claude step 1: detect var declarations"
This reverts commit f866f4819d.
* remove ducklake/datatable and default
* detect data table assigns in var_identifiers
* Python parser successfully infers R/W/RW from ducklake / datatable
* still register ducklake/datatable if not used as unknown R/W
* Go to settings button in Assets Dropdown on not found
* nit
* sqlx prepare fail
* manual fix, somehow sqlx prepare won't do it
* fix frontend ci
* ee repo ref
* ducklake_user doesnt exist in unit tests
* nit fix
* ui nit
* nit
* nit missing clone
* fork ducklakes and datatables
* fix surface hover bug
* stupid mistake
* better deeply reactive mutable derived
* Ducklake picker
* Editor bar data tables
* DuckDB supports datatables
* datatable in duckdb asset parser
* duckdb asset parser var_identifiers
* Revert "duckdb asset parser var_identifiers"
This reverts commit 88068b1a77.
* sqlx prepare
* Box pin in test_workflow_as_code to fix stack overflow
* stash
* sql asset parser parses most s3 literals
* nit
* Detect attach + handle returning RW
* detect assets used with dot notation
* detect implicit access with USE dl; syntax
* Add assets as unknown if var was never used
* Support default ducklake/datatable main in parser
* ignore asset parsing errors in frontend (avoid flow layout shift)
* super weird duplication (merge conflict ?)
* nits
* fix duckdb parser detecting too much as asset when RW ctx is unknown
* fix transparent assets btn
* missing arg
* nit styling
* asset parser specific table parsing
* fix resource specific table parsing
* More concise asset display in flows + better icons
* fix assets page filtering out resources with added table
* Fix frontend to support specific table assets
* Open DB Manager to specific table
* Specific table parser in Python and TS + unit tests
* Fix UPDATE setting access to None
* fix flow edge rendering on top of output picker
* python parser fix var override bug
* add ts test
* fix compilation
* sqlx prepare
* update parsers version
* fix missing schema key onDelete
* feat(frontend): wip
* feat(frontend): wip
* feat(frontend): wip
* feat(frontend): move component inside containers
* feat(frontend): done
* feat(frontend): done
* fix(frontend): wip
* fix(frontend): wip
* fix(frontend): done
* fix(frontend): done
* fix(frontend): fix anchored
* fix(frontend): restore event
* feat(frontend): support dropping on the top level + hide the shadow when leaving the grid
* feat(frontend): drop in the correct subgrid when there are multiple
* feat(frontend): wip
* feat(frontend): fix hide shadow
* feat(frontend): remove dead code
* feat(frontend): wip
* feat(frontend): fix overflow
* feat(frontend): wip
* feat(frontend): done
* feat(frontend): fix z-index
* feat(frontend): wip
* feat(frontend): fix shadow
* feat(frontend): fix resize + drop position
* feat(frontend): fix dropped when no movement
* feat(frontend): hide the fake shadow if the move mode is set
* feat(frontend): add small timeout when we leave the insert mode
* feat(frontend): render the shadow where the component will drop
* feat(frontend): done
* feat(frontend): done
* feat(frontend): improve perf
* feat(frontend): done
* feat(frontend): remove console.log
* feat(frontend): fix move toplevel
* feat(frontend): Components positions are restored when the mode changes
* feat(frontend): Components positions are restored when the mode changes
* feat(frontend): Components positions are restored when the mode changes
* feat(frontend): fix edges cases + improve perf
* feat(frontend): fix drop position
* feat(frontend): fix final drop position
* feat(frontend): fix final drop position
* feat(frontend): fix insert from component bar
* feat(frontend): Fix disapearing components
* feat(frontend): add indicator when a component is locked
* feat(frontend): add indicator when a component is locked
* feat(frontend): improve interactivity
* feat(frontend): fix how the lock overlay renders
* feat(frontend): use builin detection
* feat(frontend): fix zIndex
* feat(frontend): update the shadow when dragged over a locked component