Blog

Luis Majano

October 31, 2025

Spread the word


Share your thoughts

We're thrilled to announce the release of bx-compat-ui, a comprehensive UI compatibility module that makes migrating your Adobe ColdFusion and Lucee applications to BoxLang seamless and straightforward. If you've been hesitant about moving to BoxLang because of your existing UI components, this module is your answer. Even though the core team doesn't believe BoxLang should be doing any UI decisions for a developer, this was sorely needed in order to migrate existing CFML applications into BoxLang, where then you can decide a path forward.

๐Ÿš€ Why bx-compat-ui?

BoxLang represents the future of JVM-based dynamic languages, but we understand that many organizations have substantial investments in CFML applications with rich user interfaces. The bx-compat-ui module bridges this gap, providing:

  • โœ… Familiar CFML syntax for layout, grid, and AJAX components
  • โœ… Compatibility with your existing UI code. (See documentation for compatability notes)
  • โœ… Zero learning curve for experienced CFML developers
  • โœ… Production-ready enterprise-grade quality from Ortus Solutions
  • โœ… Full documentation with an interactive MCP Server

Please note that the examples below are in bx: syntax. Your existing CFML applications using our bx-compat-cfml module will run with no changes.

๐Ÿ“ฆ Quick Installation

Getting started is as simple as running a single CommandBox command:

box install bx-compat-ui

That's it! The module automatically registers and makes all UI components available in your BoxLang applications.

๐ŸŽฏ Major Features

1. Layout Management - Organize Your UI Like a Pro

Create sophisticated layouts with tabs, accordions, borders, and box containers. Here's a quick example of a tabbed interface:

<bx:layout type="tab" fillHeight="true">
    <bx:layoutarea title="Dashboard">
        <h2>Welcome to My App</h2>
        <p>Dashboard content goes here</p>
    </bx:layoutarea>
    <bx:layoutarea title="Reports">
        <bx:grid name="salesGrid" pageSize="25">
            <bx:gridcolumn name="date" header="Date" width="120" />
            <bx:gridcolumn name="revenue" header="Revenue" width="150" type="numeric" format="currency" />
            <bx:gridcolumn name="orders" header="Orders" width="100" />
        </bx:grid>
    </bx:layoutarea>
    <bx:layoutarea title="Settings">
        <p>Application settings and preferences</p>
    </bx:layoutarea>
</bx:layout>

Supported Layout Types:

  • Tab - Tabbed interfaces for organizing related content
  • Accordion - Collapsible panels that conserve vertical space
  • Border - Five-region layouts (top, bottom, left, right, center)
  • HBox - Horizontal box layouts with flexbox
  • VBox - Vertical box layouts with flexbox

2. Powerful Data Grids - Display and Manage Data Effortlessly

Create sortable, paginated, and even editable data grids with minimal code:

<bx:script>
employeeQuery = queryNew( "id,name,department,salary", "integer,varchar,varchar,numeric", [
    [ 1, "John Doe", "Engineering", 75000 ],
    [ 2, "Jane Smith", "Marketing", 65000 ],
    [ 3, "Bob Johnson", "Sales", 55000 ],
    [ 4, "Alice Brown", "Engineering", 80000 ]
] );
</bx:script>

<bx:grid 
    name="employeeGrid" 
    query="#employeeQuery#" 
    pageSize="10" 
    sortable="true" 
    stripeRows="true"
    selectMode="multi">
    
    <bx:gridcolumn name="id" header="ID" width="60" sortable="false" />
    <bx:gridcolumn name="name" header="Employee Name" width="200" />
    <bx:gridcolumn name="department" header="Department" width="150" />
    <bx:gridcolumn 
        name="salary" 
        header="Salary" 
        width="120" 
        type="numeric" 
        format="currency" 
        align="right" />
</bx:grid>

Grid Features:

  • โœจ Built-in sorting and pagination
  • โœ๏ธ Inline editing capabilities
  • ๐ŸŽจ Customizable column formatting
  • ๐Ÿ“Š Event handlers for user interactions
  • ๐Ÿ”„ AJAX data binding support

3. AJAX Components - Rich Client-Server Communication

Build dynamic, responsive interfaces without page refreshes:

<bx:ajaximport tags="ajaxproxy" />

<bx:ajaxproxy cfc="components.UserService" jsclassname="UserProxy" />

<script>
var userProxy = new UserProxy();

function loadUserData() {
    userProxy.call( "getUsers", { department: "Engineering" }, ( result ) => {
        console.log( "Users loaded:", result );
        displayUsers( result );
    } );
}

function displayUsers( users ) {
    var html = "<ul>";
    users.forEach( ( user ) => {
        html += `<li>${Setting: user.name not found} (${Setting: user.email not found})</li>`;
    } );
    html += "</ul>";
    document.getElementById( "userList" ).innerHTML = html;
}
</script>

<button onclick="loadUserData()">Load Users</button>
<div id="userList"></div>

AJAX Features:

  • ๐Ÿ”— JavaScript proxy generation for CFCs
  • ๐Ÿ“ฅ Dynamic content loading
  • ๐Ÿ”„ Bind expressions for automatic updates
  • โšก Optimized for performance

4. UI Components - Flexible Containers and Elements

Create rich interfaces with pods, divs, and tooltips:

<bx:layout type="hbox" width="100%" style="gap: 20px;">
    <bx:layoutarea>
        <bx:pod title="Statistics" width="250px" height="200px">
            <p><strong>Active Users:</strong> 1,234</p>
            <p><strong>Revenue Today:</strong> $45,678</p>
            <p><strong>Orders Pending:</strong> 89</p>
        </bx:pod>
    </bx:layoutarea>
    
    <bx:layoutarea>
        <bx:pod title="Recent Activity" width="400px" height="200px">
            <ul>
                <li>New user registration</li>
                <li>Order #12345 processed</li>
                <li>Payment received</li>
            </ul>
        </bx:pod>
    </bx:layoutarea>
    
    <bx:layoutarea>
        <bx:pod title="Quick Actions" width="250px" height="200px">
            <button style="width: 100%; margin: 5px 0;">๐Ÿ“ค Export Data</button>
            <button style="width: 100%; margin: 5px 0;">๐Ÿ“Š Generate Report</button>
            <button style="width: 100%; margin: 5px 0;">๐Ÿ’พ Backup System</button>
        </bx:pod>
    </bx:layoutarea>
</bx:layout>

๐Ÿข Real-World Example: Enterprise Dashboard

Here's a complete example showing how to build a sophisticated enterprise dashboard:

<!DOCTYPE html>
<html>
<head>
    <title>Enterprise Dashboard</title>
    <bx:ajaximport tags="layout,grid,pod" />
</head>
<body>
    <bx:layout type="border" fitToWindow="true">
        <!-- Header -->
        <bx:layoutarea position="top" size="70px">
            <header style="background: linear-gradient(90deg, #00FF78 0%, #00DBFF 100%); color: #2c3e50; padding: 15px;">
                <h1>๐Ÿ“Š Enterprise Dashboard</h1>
            </header>
        </bx:layoutarea>
        
        <!-- Sidebar Navigation -->
        <bx:layoutarea position="left" size="280px">
            <bx:layout type="accordion">
                <bx:layoutarea title="Navigation">
                    <ul style="list-style: none; padding: 10px;">
                        <li><a href="#ajaxLink( 'dashboard/overview.bxm' )#">๐Ÿ“Š Overview</a></li>
                        <li><a href="#ajaxLink( 'dashboard/analytics.bxm' )#">๐Ÿ“ˆ Analytics</a></li>
                        <li><a href="#ajaxLink( 'dashboard/users.bxm' )#">๐Ÿ‘ฅ Users</a></li>
                        <li><a href="#ajaxLink( 'dashboard/reports.bxm' )#">๐Ÿ“‹ Reports</a></li>
                    </ul>
                </bx:layoutarea>
                
                <bx:layoutarea title="Quick Stats" initcollapsed="false">
                    <bx:pod title="Today's Metrics">
                        <p><strong>Active Users:</strong> 1,234</p>
                        <p><strong>Revenue:</strong> $45,678</p>
                        <p><strong>Orders:</strong> 89</p>
                    </bx:pod>
                </bx:layoutarea>
            </bx:layout>
        </bx:layoutarea>
        
        <!-- Main Content Area -->
        <bx:layoutarea position="center">
            <bx:layout type="tab" fillHeight="true">
                <bx:layoutarea title="๐Ÿ“Š Overview">
                    <div style="padding: 20px;">
                        <h2>System Overview</h2>
                        <bx:grid 
                            name="summaryGrid" 
                            pageSize="15" 
                            sortable="true"
                            stripeRows="true">
                            <bx:gridcolumn name="metric" header="Metric" width="200" />
                            <bx:gridcolumn name="value" header="Value" width="150" type="numeric" />
                            <bx:gridcolumn name="change" header="Change" width="100" />
                        </bx:grid>
                    </div>
                </bx:layoutarea>
                
                <bx:layoutarea title="๐Ÿ“‹ Data Management">
                    <div style="padding: 20px;">
                        <h2>User Management</h2>
                        <bx:grid 
                            name="userGrid" 
                            pageSize="20" 
                            sortable="true" 
                            editable="true"
                            selectMode="multi">
                            <bx:gridcolumn name="id" header="ID" width="60" editable="false" />
                            <bx:gridcolumn name="username" header="Username" width="150" />
                            <bx:gridcolumn name="email" header="Email" width="250" />
                            <bx:gridcolumn name="role" header="Role" width="120" />
                            <bx:gridcolumn name="lastLogin" header="Last Login" width="150" type="date" />
                            <bx:gridcolumn name="active" header="Active" width="80" type="boolean" />
                        </bx:grid>
                    </div>
                </bx:layoutarea>
            </bx:layout>
        </bx:layoutarea>
        
        <!-- Footer -->
        <bx:layoutarea position="bottom" size="50px">
            <footer style="background: #ecf0f1; padding: 15px; text-align: center;">
                <p>ยฉ 2024 Built with BoxLang UI Compatibility Module</p>
            </footer>
        </bx:layoutarea>
    </bx:layout>
</body>
</html>

๐Ÿ“š Comprehensive Documentation

We've built extensive documentation to help you get started quickly:

Interactive MCP Server

Connect to our Model Context Protocol server for interactive documentation:

https://boxlang.ortusbooks.com/~gitbook/mcp

This allows you to query documentation directly from your development environment, making it easier than ever to find the information you need.

Full Documentation Site

Visit our complete documentation at:

https://boxlang.ortusbooks.com/

You'll find:

  • ๐Ÿ“– Complete component reference
  • ๐Ÿ’ก Step-by-step tutorials
  • ๐ŸŽฏ Real-world examples
  • ๐Ÿ”ง Troubleshooting guides
  • ๐Ÿš€ Best practices

๐Ÿ› ๏ธ Built-In Functions (BIFs)

The module includes several helpful Built-In Functions to enhance your AJAX and grid functionality:

AJAX Functions

// Generate AJAX-enabled links
ajaxURL = ajaxLink( "content/page1.bxm" );

// Execute function on page load
ajaxOnLoad( "initializePage" );

Grid Functions

// Convert query for grid display with pagination
gridData = queryConvertForGrid( myQuery, page = 1, pageSize = 25 );

๐ŸŽจ Styling and Customization

All components generate semantic CSS classes for easy customization:

/* Customize tab layouts */
.bx-layout-tab .bx-tab-header.active {
    background: linear-gradient( 90deg, #00FF78 0%, #00DBFF 100% );
    color: #2c3e50;
    font-family: 'Poppins', sans-serif;
}

/* Style data grids */
.bx-grid .bx-grid-row:nth-child( even ) {
    background-color: #f8f9fa;
}

/* Customize pods */
.bx-pod .bx-pod-title {
    background: linear-gradient( 90deg, #00FF78 0%, #00DBFF 100% );
    color: #2c3e50;
    font-family: 'Poppins', sans-serif;
}

๐ŸŽฏ Perfect for CFML Migration

The bx-compat-ui module is specifically designed to make your CFML to BoxLang migration as smooth as possible:

Migration Benefits:

  1. Minimal Code Changes - Most of your UI code works as-is
  2. Familiar Syntax - Same component names and attributes you already know
  3. Gradual Migration - Move components piece by piece
  4. Enhanced Performance - Benefit from BoxLang's JVM optimizations
  5. Modern Architecture - Built on current web standards

Migration Path:

CFML Application โ†’ Install bx-compat-ui โ†’ Test Components โ†’ Deploy to BoxLang

It's that straightforward!

๐Ÿš€ Getting Started Today

Ready to start your migration journey? Here's your quick-start checklist:

  1. Install the module:

    box install bx-compat-ui
    
  2. Update your imports:

    <bx:ajaximport />
    
  3. Start using components:

    <bx:layout type="tab">
        <!-- Your content here -->
    </bx:layout>
    
  4. Explore the documentation: Visit https://boxlang.ortusbooks.com/

๐Ÿ“ž Get Involved

We'd love to hear from you:

  • Issues or Questions? Open an issue on our GitHub repository
  • Feature Requests? Let us know what you need
  • Success Stories? Share how bx-compat-ui helped your migration
  • Documentation Improvements? Submit a pull request

๐ŸŽ‰ Conclusion

The bx-compat-ui module represents our commitment to making BoxLang adoption seamless for the CFML community. Whether you're migrating an existing application or building something new, this module provides the UI components you need with the familiar syntax you already know.

Stop waiting. Start migrating.

Install bx-compat-ui today and experience the power of BoxLang with the comfort of CFML compatibility.

box install bx-compat-ui

Happy coding! ๐Ÿš€

Add Your Comment

Recent Entries

12 Days of BoxLang - Day 4: TestBox

12 Days of BoxLang - Day 4: TestBox

Today weโ€™re celebrating one of the most exciting new additions to the BoxLang ecosystem:

the TestBox BoxLang CLI Runnerย โ€” a fast, native way to run your TestBox tests directly through the BoxLang Runtime. โšก

No server required. No CommandBox needed. Just pure, ultra-fastย BoxLang-powered testing from the command lineon Windows, Mac, and Linux.

If youโ€™re building modern applications with BoxLang โ€” web apps, CLIs, serverless functions, Android apps, or OS-level utilities โ€” this new feature gives you a unified, flexible testing workflow you can run anywhere.

Victor Campos
Victor Campos
December 13, 2025
12 days of BoxLang - Day 3: SocketBox!

12 days of BoxLang - Day 3: SocketBox!

As BoxLang continues evolving into a modern, high-performance, JVM-based runtime, real-time communication becomes essential for the applications we all want to build: dashboards, collaboration tools, notifications, live feeds, multiplayer features, and more.

Thatโ€™s whereย SocketBoxย steps in โ€” the WebSocket upgrade listener built to work seamlessly withย CommandBoxย and theย BoxLang MiniServer. โšก

Today, for Day 3, weโ€™re highlighting howย SocketBox supercharges BoxLang developmentย by giving you fast, flexible, and framework-agnostic WebSocket capabilities.

Maria Jose Herrera
Maria Jose Herrera
December 12, 2025
12 Days of BoxLang - Day 2: CommandBox

12 Days of BoxLang - Day 2: CommandBox

BoxLang + CommandBox: The Enterprise Engine Behind Your Deployments

For Day 2 of our 12 Days of Christmas series, weโ€™re diving into one of the most powerful parts of the BoxLang ecosystem:ย CommandBox theย defacto enterprise servlet deployment platformย for BoxLang.

If BoxLang is the language powering your applications,ย CommandBox is the engine room behind it all. โš™๏ธ

Victor Campos
Victor Campos
December 11, 2025