Skip to content

feat: Upgrade to Ant Design v6 with Tailwind CSS layout system#2025

Merged
Gervwyk merged 372 commits intodevelopfrom
antd-v6
Apr 15, 2026
Merged

feat: Upgrade to Ant Design v6 with Tailwind CSS layout system#2025
Gervwyk merged 372 commits intodevelopfrom
antd-v6

Conversation

@Gervwyk
Copy link
Copy Markdown
Member

@Gervwyk Gervwyk commented Mar 7, 2026

Summary

Comprehensive upgrade of Lowdefy to Ant Design v6, Tailwind CSS v4, and Next.js 16 with a complete rewrite of the styling pipeline, layout system, and build infrastructure. Adds keyboard shortcuts, a Search command palette, a Calendar block, and a lowdefy upgrade CLI codemod system.

Design documents: lowdefy-design PR #9 — full architecture specs, migration manifests, and review documents.


What Changed

1. Ant Design v6 Upgrade

All 82 blocks migrated from antd v4 to v6. Key API changes:

Before After Affected Blocks
visible open Modal
defaultVisible / onVisibleChange defaultOpen / onOpenChange Tooltip
bordered: false variant: 'borderless' 16 input/display blocks
gapPosition gapPlacement Progress
dotPosition dotPlacement Carousel
expandIconPosition expandIconPlacement Collapse
tabPosition: left/right tabPlacement: start/end Tabs
properties.headerStyle style: { /header } Card, Drawer
properties.bodyStyle style: { /body } Card, Modal, Drawer
properties.maskStyle style: { /mask } Modal, Drawer
type: primary color: 'primary', variant: 'solid' Button
danger: true color: 'danger' Button
Breadcrumb.Item children items array prop Breadcrumb
Menu.Item / Menu.SubMenu items array prop Menu

Removed: Comment block (removed from antd in v5+).

New blocks (15): Flex, QRCode, Masonry, MasonryList, FloatButton, Tour, Watermark, ConfigProvider, SegmentedSelector, ColorSelector, Splitter, Search, DropdownMenu, DropdownButton, Calendar.

Key files for review

2. Styling Pipeline Rewrite

Removed:

  • @emotion/css and @emotion/styled — no more runtime CSS-in-JS
  • makeCssClass() — replaced by direct className/style prop passing
  • Less infrastructure (next-with-less, less, less-loader)
  • meta.styles mechanism and buildStyleImports / writeStyleImports
  • Build-time style collection pipeline

Added:

  • class property on all blocks (string or { block, element } object)
  • style property for inline styles with /-prefixed sub-slot targeting (e.g., style: { /header }, style: { /body })
  • cn() utility in @lowdefy/block-utils for className merging
  • CSS Modules for block-specific styles (Turbopack-compatible)
  • @layer ordering: @layer theme, base, antd, components, utilities
  • Build-time class extraction for Tailwind JIT compilation
Key files for review

3. Layout System Rewrite

Replaced antd's Row/Col with a pure CSS 24-column grid using CSS custom properties.

Architecture:

  • grid.css — 24-column responsive grid with gap-adjusted flex-basis formula: span/24 * (100% + gap) - gap
  • BlockLayout — wraps individual blocks with responsive column sizing (plain <div>)
  • Area — container for groups of blocks (creates flex rows with gap/alignment)
  • Responsive breakpoints aligned to Tailwind v4: xs (<640), sm (≥640), md (≥768), lg (≥1024), xl (≥1280), 2xl (≥1536)

Property renames (with deprecation warnings):

Before After
gutter gap
contentGutter / contentGap gap
contentAlign align
contentJustify justify
contentDirection direction
contentWrap wrap
contentOverflow overflow
layout.align (self) layout.selfAlign
xxl breakpoint 2xl

New layout features:

  • Responsive gap: gap: { xs: 4, sm: 8, md: 16, lg: 24 }
  • Flex sizing: grow, shrink, size properties
  • selfAlign: top | middle | bottom for individual block vertical alignment
  • span: 0 correctly hides blocks (was previously treated as full-width)
Key files for review

4. Tailwind CSS v4 Integration

  • Build generates globals.css with @layer declarations and @import "tailwindcss"
  • Antd-to-Tailwind theme bridge: maps --ant-* CSS variables to Tailwind design tokens
  • Custom theme tokens in lowdefy.yaml (theme.tailwind) flow to both antd and Tailwind
  • JIT hot reload in dev server — Tailwind recompiles on YAML class changes
Key files for review

5. Theme Token System

  • New theme config in lowdefy.yaml with theme.antd (design tokens) and theme.tailwind (custom tokens)
  • ConfigProvider auto-configured with theme tokens at app root
  • Per-block properties.theme overrides for scoped theming
  • New _theme operator to resolve token values in YAML expressions
  • New ConfigProvider container block for scoped theme overrides
Key files for review

6. Moment.js → Day.js Migration

Complete removal of moment.js from 4 packages:

Package Change
operators-moment Renamed to operators-dayjs, operator _moment_dayjs
nunjucks dateFilter uses dayjs instead of moment
connection-google-sheets moment.utc()dayjs.utc()
blocks-antd (date blocks) moment → dayjs for 5 date picker blocks

Behavioral changes:

  • 22 common locales bundled (~11KB vs moment's ~250KB)
  • humanizeDuration thresholds parameter no longer supported
  • dayjs is immutable (safer than moment's mutation)
  • Locale names auto-normalized to lowercase
Key files for review

7. Areas → Slots Rename

Internal rename of areas to slots in engine, client, and build. User-facing areas key is supported as a deprecated alias with backwards compatibility.

Key files for review

8. Build Pipeline Improvements

  • Walker module: Single-pass tree walker for ref resolution (buildRefs, buildPageJit)
  • evaluateOperators: In-place operator evaluation replacing evaluateStaticOperators
  • Plugin types — source types.js: Source types.js files replace auto-generated types.json in all plugin packages. Block packages derive types from metas.js via extractBlockTypes. The extract-plugin-types script has been removed.
  • Block metadata restructure: schema.js renamed to meta.js, .meta static properties removed from components, schemas.js barrel renamed to metas.js. Build writes blockMetas.json artifact with category, valueType, and initValue for each block type.
  • ~shallow markers: Skip _build.* eval in shallow builds
Key files for review

9. Server & Tooling Upgrades

Dependency Before After
Next.js 13.5.4 16.1.6
antd 4.24.14 6.x
SWC 1.15.18
Bundler Webpack Turbopack (dev)
React 18.2.0 18.2.0 (unchanged)
  • CSS Modules conversion for Turbopack compatibility
  • @swc/cli with config file support

10. Keyboard Shortcuts

Event-level keyboard shortcut support with visual badges.

  • Config: events.onClick.shortcut: 'mod+k' — platform-aware (mod = Cmd on Mac, Ctrl on Windows), supports sequences (g i) and arrays for multiple bindings
  • Build validation: Warns on duplicate shortcuts within a page and conflicts with browser defaults (e.g., mod+N)
  • ShortcutManager: Registers a single global keydown listener via tinykeys with visibility gating and input field suppression
  • ShortcutBadge: Renders platform-appropriate key symbols (e.g., ⌘ K on Mac, Ctrl K on Windows), available to all blocks via components.ShortcutBadge
  • Block integration: Button, Anchor, Tag, Search, Menu, and MobileMenu render shortcut badges automatically when an event defines a shortcut
Key files for review

11. Search Command Palette

New Search block — a MiniSearch-powered Cmd+K command palette (~6KB) that replaces @lowdefy/blocks-algolia.

  • Pre-built index: Load a static JSON index via indexUrl for zero-config search on static sites
  • Runtime indexing: Pass documents array with fields and storeFields for client-side indexing
  • UI: Grouped results with section headers, keyboard navigation (arrow keys, Enter, Escape), matched term highlighting, recent search history (localStorage)
  • Analytics events: onSelect passes the result item plus query and resultCount for click-through tracking; onSearch passes the term and count on each query change
  • 14 CSS slots: Full style customization via style/class with / keys (trigger, modal, input, results, groups, highlights)

Docs app integration: New search index transformer builds a MiniSearch index at build time from page content, written to public/search-index.json. Replaces Algolia DocSearch — removes external CDN dependency.

Removed: @lowdefy/blocks-algolia package.

Key files for review

12. lowdefy upgrade CLI Command

New codemod system for automated version migrations.

  • lowdefy upgrade with --to, --plan, --dry-run, --scripts-only, --resume options
  • @lowdefy/codemods package: Published on npm, contains all migration scripts with a version-to-codemod registry
  • v5.0 entry: 20 codemods — 10 automated (Category A), 8 semi-automated with review (Category B), 2 AI-guided (Category C)
  • Covers: antd v6 prop renames (12 scripts), layout grid migration (4 scripts), dayjs migration (2 scripts), plugin API changes
  • Version chain resolver: Computes ordered upgrade phases from semver ranges (e.g., 4.5 → 5.0 runs all intermediate codemods)
  • State persistence: Progress saved in .lowdefy/upgrade-state.json for --resume on interrupted upgrades
  • Build integration: Warning emitted when skipped codemods are detected
Key files for review

13. Dark Mode System

  • System dark mode support via theme.darkMode: 'system' | 'light' | 'dark'
  • Built-in dark mode toggle button on PageHeaderMenu/PageSiderMenu (darkModeToggle: true)
  • SetDarkMode action cycles through light/dark/system preferences
  • _media: darkModePreference operator returns user's preference
  • Dark mode icons corrected (moon for dark, sun for light)
  • Notification, Message, ConfirmModal render with correct dark mode colors via App.useApp() hooks
  • Loader blocks (Skeleton, Spinner) use antd design tokens for dark mode adaptation

14. Production Build Fixes

Tailwind CSS in production (@lowdefy/server):

  • postcss.config.js was missing from the server package's files array — Next.js skipped the Tailwind PostCSS plugin entirely in production builds. Fixed by including it in the published package.

dayjs dependency resolution (@lowdefy/server, server-dev, server-e2e):

  • dayjs was not a direct dependency of the server packages. In production installs (without monorepo hoisting), Turbopack couldn't resolve dayjs or resolved antd's bundled copy — causing dayjs.extend(utc) to fail. Added dayjs as a direct dependency of all three server packages.

dayjs UTC plugin compatibility (@lowdefy/blocks-antd):

  • antd v6 bundles its own dayjs via @rc-component/picker without the UTC plugin. Date selector onChange and disabledDate callbacks now wrap antd's dayjs instances with the extended dayjs before calling .utc(). Affects DateSelector, DateTimeSelector, DateRangeSelector, WeekSelector, MonthSelector, and the shared disabledDate utility.

Breaking Changes

For Lowdefy App Developers

  1. _moment_dayjs — Rename operator in YAML configs
  2. Comment block removed — Use Card + Avatar + Paragraph composition
  3. Responsive inline style removedstyle: { sm: { padding: 32 } } no longer works; use Tailwind classes (class: 'p-8 sm:p-4') or custom CSS
  4. areasslots — Deprecated alias works but will be removed in next major
  5. Layout property renamescontentGuttergap, contentJustifyjustify, etc. (deprecation warnings emitted)
  6. xxl2xl breakpoint rename
  7. Breakpoint pixel values changed — sm: 576→640, lg: 992→1024, xl: 1200→1280, 2xl: 1600→1536
  8. span: 0 behavior — Now correctly hides blocks (was previously treated as full-width)
  9. antd prop renamesvisibleopen, borderedvariant, tabPositiontabPlacement, etc.
  10. Button type/dangercolor/variant API
  11. public/styles.less — Must be converted to CSS or moved to theme.antd.token config
  12. ColorPickerColorSelector — Renamed and moved to @lowdefy/blocks-antd. The @lowdefy/blocks-color-selectors package has been removed.
  13. SegmentedSegmentedSelector — Renamed to follow the selector naming convention; now supports complex option values and HTML labels
  14. @lowdefy/blocks-algolia removed — Use the Search block in @lowdefy/blocks-antd instead

Migration: All breaking changes above can be automated via lowdefy upgrade --to 5.0. See section 12.

For Plugin Developers

  1. makeCssClass removed — Use className and style props directly
  2. meta.styles removed — Import CSS directly in component files
  3. types.js is now source — Source types.js files replace auto-generated types.json. Block packages derive types from metas.js via extractBlockTypes. The extract-plugin-types script has been removed.
  4. schema.jsmeta.js — Block metadata moved to dedicated meta.js files. .meta static properties removed from components. schemas.js barrel renamed to metas.js.
  5. @emotion/css removed — No runtime CSS-in-JS

New Features

Feature Description
class property Tailwind/CSS classes on any block
style with / slot keys Fine-grained inline styles (style: { /header }, style: { /body }, etc.)
Theme tokens theme.antd + theme.tailwind in lowdefy.yaml
_theme operator Resolve design tokens in YAML expressions
ConfigProvider block Scoped theme overrides
Dark mode system theme.darkMode: 'system', toggle button, SetDarkMode action
Responsive gap gap: { xs: 4, md: 16, lg: 24 }
Flex layout grow, shrink, size on any block
Tailwind JIT Hot reload on class changes in dev
Turbopack Fast dev builds with Next.js 16
Keyboard shortcuts events.onClick.shortcut: 'mod+k' — platform-aware shortcuts on any event
ShortcutBadge Visual keyboard shortcut indicators on Button, Anchor, Tag, Menu, Search
Search command palette MiniSearch-powered Cmd+K search with pre-built index, grouped results, recent history
Calendar block Full-size/compact calendar with date selection, disabled dates, cell badge data
lowdefy upgrade CLI Codemod system with 20 v5.0 codemods (automated, semi-auto, AI-guided)
ErrorBar (dev) Build warnings and errors displayed in-browser during development
ECharts v6 Upgraded to echarts 6.0.0 with improved flex container sizing
15 new blocks Flex, QRCode, Masonry, MasonryList, FloatButton, Tour, Watermark, ConfigProvider, SegmentedSelector, ColorSelector, Splitter, Search, DropdownMenu, DropdownButton, Calendar

🤖 Generated with Claude Code

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Mar 7, 2026

🦋 Changeset detected

Latest commit: 373c09f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 57 packages
Name Type
@lowdefy/blocks-aggrid Major
@lowdefy/blocks-basic Major
@lowdefy/blocks-antd Major
@lowdefy/build Major
@lowdefy/engine Major
@lowdefy/client Major
@lowdefy/layout Major
@lowdefy/block-dev Major
@lowdefy/e2e-utils Major
@lowdefy/block-utils Major
@lowdefy/blocks-loaders Major
@lowdefy/blocks-echarts Major
@lowdefy/blocks-markdown Major
@lowdefy/blocks-qr Major
@lowdefy/blocks-google-maps Major
@lowdefy/plugin-aws Major
@lowdefy/server-dev Major
lowdefy Major
@lowdefy/codemods Major
@lowdefy/operators-dayjs Major
@lowdefy/nunjucks Major
@lowdefy/connection-google-sheets Major
@lowdefy/docs Major
@lowdefy/operators-js Major
@lowdefy/actions-core Major
@lowdefy/server Major
@lowdefy/helpers Major
@lowdefy/server-e2e Major
@lowdefy/block-dev-e2e Major
@lowdefy/api Major
@lowdefy/operators-nunjucks Major
@lowdefy/ajv Major
@lowdefy/operators Major
@lowdefy/connection-axios-http Major
@lowdefy/connection-elasticsearch Major
@lowdefy/connection-knex Major
@lowdefy/connection-mongodb Major
@lowdefy/connection-redis Major
@lowdefy/connection-sendgrid Major
@lowdefy/connection-stripe Major
@lowdefy/operators-change-case Major
@lowdefy/operators-diff Major
@lowdefy/operators-jsonata Major
@lowdefy/operators-mql Major
@lowdefy/operators-uuid Major
@lowdefy/operators-yaml Major
@lowdefy/logger Major
@lowdefy/node-utils Major
@lowdefy/actions-pdf-make Major
@lowdefy/connection-test Major
@lowdefy/plugin-auth0 Major
@lowdefy/plugin-csv Major
@lowdefy/plugin-next-auth Major
@lowdefy/website Major
@lowdefy/errors Major
@lowdefy/jest-yaml-transform Major
lowdefy-vscode Major

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel
Copy link
Copy Markdown

vercel Bot commented Mar 7, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
docs Ready Ready Preview Apr 15, 2026 11:17am
lowdefy-website Ready Ready Preview Apr 15, 2026 11:17am

Request Review

Comment thread packages/docs/templates/blocks/galleryTransformer.js Fixed
Comment thread packages/docs/templates/blocks/galleryTransformer.js Fixed
Comment thread packages/docs/templates/blocks/galleryTransformer.js Fixed
Comment thread packages/docs/templates/blocks/galleryTransformer.js Fixed
Gervwyk and others added 30 commits March 29, 2026 08:37
Request: Audit changesets on the antd-v6 PR and clean up iterative fix/patch entries.
Motivation: 45 changesets accumulated over iterative development — many "fix" entries
were fixing features introduced on the same branch, not user-visible bugs.

Decisions:
- Absorb fix changesets into parent feature changesets rather than keeping separate entries
- Split grab-bag changeset (menu-links-dark-mode-fixes) into focused single-concern entries
- Add ErrorBar mention to server-dev code-docs

Changes:
- Deleted 8 changesets absorbed into parent features (e2e-test-fixes, numberinput-fix, fix-dayjs-utc-postcss-calendar, fix-block-tailwind-and-antd-deps, fix-loaders-dark-mode-tokens, gallery-docs, shortcut-badge-in-blocks, menu-links-dark-mode-fixes)
- Updated 9 changesets with absorbed content and cleaned prefixes
- Created build-error-messages.md and menu-operator-links.md from split grab-bag
- server-dev.md: Added ErrorBar section under Client Components

Tags: changesets, changeset-cleanup, antd-v6, changelog, docs, server-dev, errorbar
Request: Add the v5 release article to the lowdefy website's articles section.
Motivation: The v5 release article was written in lowdefy-design and needs to be published on the website.

Changes:
- lowdefy-5-whats-new.md: Full v5 release article covering Tailwind, dark mode, shortcuts, antd v6, slots, new blocks, plugin updates, DX improvements
- index.js: Register article in the articles content registry
- layout.jsx: SEO and OpenGraph metadata for the article route
- page.jsx: Article page component with Header/Footer
- opengraph-image.jsx: Social media preview image generator

Tags: website, article, v5-release, docs, blog
…format.

Request: Fix _js error showing as LowdefyInternalError with no config path
Motivation: When _js is used with wrong format (e.g. _js: { expr: '...' } instead of
_js: '...'), the error was a plain Error wrapped in LowdefyInternalError — giving the
user no indication of where the bad config is.

Changes:
- jsMapParser.js: Throw ConfigError instead of plain Error, include configKey from ~k
  marker and the received value in the message. ConfigError.isLowdefyError = true so
  buildPageJit's catch handler preserves it instead of wrapping in LowdefyInternalError.

Tags: _js, config-error, jsMapParser, error-tracing, build
Request: Add a height property to define the dragger area height in pixels
Motivation: Allow users to control the dragger area size.

Changes:
- S3UploadDragger.js: Pass properties.height to antd Dragger's built-in height prop
- meta.js: Add height property metadata
- schema.js: Add height property schema

Tags: s3-upload, dragger, height, plugin-aws
Request: Add _math.mod operator
Motivation: JavaScript's Math object lacks a modulo method, but remainder is a common operation in configs.

Changes:
- math.js: Add mod to meta, wrap Math with Object.create(Math) to add custom mod function
- math.test.js: Add mod tests (array and object forms), update inline snapshots
- _math.yaml: Add mod method entry to user-facing docs
- js.md: Add mod to supported methods list in code-docs
- feat-math-mod-operator.md: Changeset for patch bump

Tags: operators-js, math, mod, modulo, remainder
Request: Fix PhoneNumberInput phone_number formatting.
Motivation: Raw string concatenation produced malformed phone numbers — leading
zeros weren't stripped ("+270821234567"), non-digit characters passed through,
and empty input stored just the dial code ("+27") instead of empty string.

Changes:
- formatPhoneNumber.js: New helper strips non-digits and leading zeros from input
- PhoneNumberInput.js: Use formatPhoneNumber for both onChange handlers, remove phone_number from null init
- PhoneNumberInput.e2e.spec.js: Add 3 formatting tests (leading zeros, non-digits, empty init)
- PhoneNumberInput.e2e.yaml: Add format_test and empty_test blocks with display spans
- fix-phone-number-formatting.md: Changeset for patch bump

Tags: phone-number, formatting, blocks-antd, phone-input, dial-code, strip-zeros
Request: Fix logger crash "Converting circular structure to JSON" when AxiosHttp requests fail
Motivation: extractErrorProps included plain objects by reference without deep-cleaning, so Axios error
responses containing Node.js request/response cycles crashed JSON.stringify.

Decisions:
- Fix in extractErrorProps, not the serializer: extractErrorProps broke its contract to return serialisable output
- Separate objectDepth/causeDepth counters: object nesting (5 levels) and cause chains (3 levels) are independent limits
- Shared seen Set between cleanValue and _extractErrorProps: tracks circular refs across error cause chains and nested objects in one pass

Changes:
- extractErrorProps.js: Add cleanValue helper, wire into plain-object/array/non-Error-cause branches, split _extractErrorProps depth param into objectDepth+causeDepth
- extractErrorProps.test.js: Add 6 tests for circular refs in plain objects, deep nesting truncation, array cleaning, non-Error cause cleaning, errors inside plain objects
- serializer.test.js: Add integration test exercising full serialize path with Axios-shaped circular error
- fix-serialize-circular-errors.md: Changeset for @lowdefy/helpers patch
- code-docs/utils/helpers.md: Document cleanValue deep-cleaning behaviour
- code-docs/architecture/error-tracing.md: Note deep-cleaning in error serialization section

Tags: extractErrorProps, cleanValue, circular-reference, serializer, axios, error-serialization, helpers
Request: Fix failing build package tests.
Motivation: writeGlobalsCss now emits a layer-order.css build artifact but
the 54 snapshot files were not regenerated.

Changes:
- 54 snapshot.json files: Added layer-order.css entry to match new build output

Tags: build, snapshots, layer-order, css, test-fix
…r handling.

Motivation: Need to validate or confirm files before upload begins, and upload
failures were silently swallowed with no diagnostic information.

Changes:
- meta.js (S3UploadButton, S3UploadDragger): Add onBeforeUpload event definition
- useFileList.js: Trigger onBeforeUpload before upload, cancel if action throws; serialize file metadata to plain object to survive serializer.copy()
- getS3Upload.js: Rewrite XHR upload as Promise-based with proper error propagation; throw ServiceError on CORS/network failures
- feat-s3-upload-before-upload.md: Changeset for minor bump

Tags: plugin-aws, s3-upload, onBeforeUpload, file-validation, error-handling, xhr, cors
Request: Investigate the bad icon import error and make it pretty.
Motivation: When a user writes a bad icon name (e.g. AiOutlineToolOutlined),
the Lowdefy build generates a massive single-line import that Next.js dumps
as a wall of unreadable text. The actual useful info is buried.

Decisions:
- Warning not error: invalid icons emit ConfigWarning so build continues
- Proportional Levenshtein threshold: maxDistance scales with icon name length to catch suffix typos like "ToolOutlined" → "Tool"
- Graceful fallback: if a react-icons package can't be loaded, skip validation

Changes:
- validateIconImports.js: New — validates icon names against actual react-icons package exports, filters invalid ones, emits ConfigWarning with "did you mean?" suggestion
- buildIconImports.js: Call validateIconImports after collecting icons
- extractIconData.js: Add warning with suggestion in JIT path for invalid icons
- validateIconImports.test.js: 7 tests covering valid/invalid icons, suggestions, package load failure, caching

Tags: build, icons, validation, react-icons, config-warning, did-you-mean

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…plugins.

Request: Should we apply changes to the plugin dependency definitions in the lowdefy repo?
Motivation: All block plugins declared react and react-dom as direct dependencies
(pinned 18.2.0). In consuming workspaces, if any other package pulls a different
React version, pnpm installs two copies — two React instances means two context
trees and ConfigProvider theme (dark mode, compact, tokens) becomes invisible to
plugin components.

Decisions:
- Use >=18 for react/react-dom, >=5 for antd (blocks-antd uses v5+ API), >=6 for antd in plugin-aws
- block-dev left unchanged: it's a test utility that correctly provides React for the test environment
- @lowdefy/client and @lowdefy/layout left unchanged: core packages that correctly own React

Changes:
- blocks-basic/package.json: react, react-dom → peerDependencies
- blocks-antd/package.json: react, react-dom, antd → peerDependencies
- blocks-echarts/package.json: react, react-dom → peerDependencies
- blocks-loaders/package.json: react, react-dom → peerDependencies
- blocks-markdown/package.json: react, react-dom → peerDependencies
- blocks-aggrid/package.json: react, react-dom → peerDependencies
- blocks-google-maps/package.json: react, react-dom → peerDependencies
- blocks-qr/package.json: react, react-dom → peerDependencies
- plugin-aws/package.json: react, react-dom, antd → peerDependencies
- block-utils/package.json: react, react-dom → peerDependencies
- pnpm-lock.yaml: Regenerated

Tags: plugins, peer-dependencies, react, antd, dual-instance, dark-mode, theme

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…d add border styles.

Changes:
- Header/meta.js, PageHeaderMenu/meta.js, PageSiderMenu/meta.js: Change profile dropdown trigger default from 'click' to 'hover'
- headerActions.js: Update runtime fallback to match new 'hover' default
- PageSiderMenu.js: Add borderBottom to header and borderInlineEnd to sider for visual separation

Tags: blocks-antd, profile-dropdown, hover, border, page-sider-menu, header-actions
…thor.

Request: Add article from external markdown file to the website with a new author profile
Motivation: Publishing a new opinion piece on config-driven development in the AI era

Changes:
- case-for-config-driven-development.md: New article with frontmatter
- authors.js: Added stephanie author profile
- index.js: Registered article import and parse entry
- page.jsx: Article page route component
- layout.jsx: Article layout with SEO metadata

Tags: website, article, author, config-driven, ai, stephanie, content
Add config-driven development article to website
…ations.

Request: Add missing icons to block meta so they are bundled in production builds.
Motivation: The build uses meta.icons to determine which react-icons to bundle. Icons used in code or as schema defaults but not declared in meta get tree-shaken out, causing missing icons in production.

Changes:
- Header/meta.js: Add AiOutlineLaptop (system dark mode toggle icon from headerActions.js)
- PageHeaderMenu/meta.js: Add AiOutlineLaptop
- PageSiderMenu/meta.js: Add AiOutlineLaptop
- Selector/meta.js: Add AiOutlineCloseCircle, AiOutlineDown (schema defaults for clearIcon, suffixIcon)
- MultipleSelector/meta.js: Add AiOutlineCheck, AiOutlineCloseCircle, AiOutlineDown (schema defaults for selectedIcon, clearIcon, suffixIcon)
- Icon/meta.js: Add AiOutlineCloseCircle (schema default for name property)

Tags: icons, meta, tree-shaking, dark-mode, selector, production-build, blocks-antd, blocks-basic
# Conflicts:
#	code-docs/architecture/build-pipeline.md
#	code-docs/packages/build.md
#	packages/build/package.json
#	packages/build/src/build/jit/shallowBuild.js
#	packages/build/src/tests/success/34-crud-app-complete/snapshot.json
#	packages/build/src/tests/success/39-global-state-app/snapshot.json
#	packages/build/src/tests/success/47-operators-comprehensive/snapshot.json
#	packages/build/src/tests/success/55-complete-enterprise-app/snapshot.json
#	packages/client/package.json
#	packages/docs/package.json
#	packages/engine/package.json
#	packages/layout/package.json
#	packages/plugins/blocks/blocks-aggrid/package.json
#	packages/plugins/blocks/blocks-algolia/CHANGELOG.md
#	packages/plugins/blocks/blocks-algolia/package.json
#	packages/plugins/blocks/blocks-antd/package.json
#	packages/plugins/blocks/blocks-basic/package.json
#	packages/plugins/blocks/blocks-color-selectors/CHANGELOG.md
#	packages/plugins/blocks/blocks-color-selectors/package.json
#	packages/plugins/blocks/blocks-echarts/package.json
#	packages/plugins/blocks/blocks-google-maps/package.json
#	packages/plugins/blocks/blocks-loaders/package.json
#	packages/plugins/blocks/blocks-qr/package.json
#	packages/plugins/connections/connection-axios-http/package.json
#	packages/plugins/connections/connection-elasticsearch/package.json
#	packages/plugins/connections/connection-google-sheets/package.json
#	packages/plugins/connections/connection-knex/package.json
#	packages/plugins/connections/connection-redis/package.json
#	packages/plugins/connections/connection-sendgrid/package.json
#	packages/plugins/connections/connection-stripe/package.json
#	packages/plugins/operators/operators-dayjs/package.json
#	packages/plugins/operators/operators-js/src/operators/shared/date.js
#	packages/plugins/operators/operators-moment/CHANGELOG.md
#	packages/plugins/plugins/plugin-aws/package.json
#	packages/servers/server-dev/package.json
#	packages/servers/server-e2e/package.json
#	packages/servers/server/package.json
#	packages/utils/block-dev/package.json
#	packages/utils/block-utils/package.json
#	packages/utils/nunjucks/package.json
#	packages/website/src/content/articles/index.js
#	pnpm-lock.yaml
Request: Resolve merge conflict between antd-v6 and main.
Motivation: After merging main into antd-v6, package.json files needed @lowdefy/* internal dependency versions updated from 4.7.2 to 4.7.3 to match main's latest release.

Changes:
- 41 package.json files: Updated version and @lowdefy/* dependency versions from 4.7.2 to 4.7.3

Tags: version-bump, merge, package-json, 4.7.3
Request: Fix CI snapshot test failures.
Motivation: Snapshots were generated against stale dist/ files that lacked
the dynamic: true flag on _date.valueOf (operators-js) and new icons in
block metas (blocks-antd, blocks-basic). CI compiles fresh dist from src
before testing, so CI's build output differed from the stale-dist snapshots.

Decisions:
- Rebuilt operators-js, blocks-antd, blocks-basic dist before regenerating: ensures snapshots match what CI produces

Changes:
- 33-multifile-nested-refs/snapshot.json: Key reordering from collectSkeletonSourceFiles
- 34-crud-app-complete/snapshot.json: ~k shifts (+2) from _date server operator, new icon entries
- 39-global-state-app/snapshot.json: Same ~k shifts and _date additions
- 47-operators-comprehensive/snapshot.json: Same ~k shifts and _date additions
- 55-complete-enterprise-app/snapshot.json: Same ~k shifts and _date additions

Tags: snapshots, dist, ci, _date, dynamic, operators-js, blocks-antd, build
Request: "we can remove the claude code review in this repo"

Changes:
- claude-code-review.yml: Removed PR review workflow

Tags: ci, workflow, claude-code-review
Request: Harden ID validation across the build pipeline.
Motivation: Scattered `.includes('.')` checks only caught periods. A shared
validateId utility enforces a strict allowlist (A-Z, a-z, 0-9, "-", "_", "/")
and is applied consistently to endpoints, steps, requests, connections, and pages.

Changes:
- validateId.js: New shared utility with regex-based ID validation
- validateId.test.js: Tests for valid IDs, periods, traversal, spaces, specials
- validateStep.js: Replace inline period check with validateId
- validateEndpoint.js: Replace inline period check with validateId
- buildRequests.js: Replace inline period check with validateId
- buildConnections.js: Add validateId call for connection IDs
- buildPage.js: Add validateId call for page IDs
- buildApi.test.js: Update test name and expected error message
- buildRequests.test.js: Update test name and expected error message
- F4-request-id-with-period/expected.json: Update expected error strings

Tags: validate-id, build, security, id-validation, config-error
Request: Prevent directory traversal in config file reads.
Motivation: readConfigFile accepted arbitrary paths that could escape the build
directory via ".." or special characters. A regex allowlist and ".." check now
reject invalid paths before they reach the filesystem.

Changes:
- createReadConfigFile.js: Add validPathPattern regex and ".." guard
- createReadConfigFile.test.js: Add tests for traversal, spaces, and injection

Tags: path-traversal, security, api, readConfigFile, input-validation
Page IDs like ":reject" and ":throw" in the docs app use colons.
The validateId regex and readConfigFile path regex now permit ":".

Tags: validate-id, docs-build, colon, regex
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants