Lexi
Smart Home Platform
  • User Research
    Information Architecture
    Digital Design Strategy
  • UI UX
    Visual Design
    Digital QA
The Client's Challenge

Establish LEXI as the mobile-first smart home system of choice for companies looking for a modern, intuitive, scalable, and uniquely customizable solution. With the increasing consumer adoption of smart home appliances, devices, and accessories, how might we create a holistic view of a more connected smart home and provide intuitive control?

The Strategic Approach

The LEXI Smart Home App is designed balancing intuitive usability and white-label customization. The ability for partner brands to ‘skin’ the App so it reflects their core brand identity offers a unique business differentiator compared to the plethora of smart home apps that came before.

The visual language has a rich, beautiful 3 dimensional quality to all the interactive components, bringing a uniquely Box Clever perspective. We wanted to develop an aesthetic that blends the digital experience with the physical world it controls. This approach improves clarity between states and is emotionally engaging.

The Creative Solution

This 3rd generation device was created with its design language heritage in mind, so that it is instantly recognizable within the Clip product and brand ecosystem. It thoughtfully incorporates design details for each of the payment interactions, with an emphasis on intuitive guidance without sacrificing the physical design.

The Business Impact

Launched in 2020 in the Mexican mPOS market to help small business owners adapt to changing industry policies and increase their mobile payment capabilities.

Clip has grown exponentially, became Mexico’s first FinTech unicorn in 2021, and continues to create positive impact.


<!-- 💙 MEMBERSCRIPT #112 v0.1 💙 - BEFORE & AFTER SLIDERS -->
<script>
document.addEventListener('DOMContentLoaded', () => {
    const wraps = document.querySelectorAll('[ms-code-ba-wrap]');

    wraps.forEach(wrap => {
        const before = wrap.querySelector('[ms-code-ba-before]');
        const after = wrap.querySelector('[ms-code-ba-after]');
        
        // Create slider element
        const slider = document.createElement('div');
        slider.setAttribute('ms-code-ba-slider', wrap.getAttribute('ms-code-ba-wrap'));
        wrap.appendChild(slider);

        let isDown = false;

        // Ensure proper positioning
        wrap.style.position = 'relative';
        wrap.style.overflow = 'hidden';
        before.style.width = '100%';
        before.style.display = 'block';
        after.style.position = 'absolute';
        after.style.top = '0';
        after.style.left = '0';
        after.style.width = '100%';
        after.style.height = '100%';
        slider.style.position = 'absolute';
        slider.style.top = '0';
        slider.style.bottom = '0';
        slider.style.width = '4px';
        slider.style.background = 'white';
        slider.style.cursor = 'ew-resize';
        slider.style.zIndex = '3';

        const setPosition = (position) => {
            const clampedPosition = Math.max(0, Math.min(1, position));
            slider.style.left = `${clampedPosition * 100}%`;
            after.style.clipPath = `inset(0 0 0 ${clampedPosition * 100}%)`;
        };

        const move = (e) => {
            if (!isDown && e.type !== 'mousemove') return;
            e.preventDefault();

            const x = e.type.includes('touch') ? e.touches[0].clientX : e.clientX;
            const rect = wrap.getBoundingClientRect();
            const position = (x - rect.left) / rect.width;
            
            setPosition(position);
        };

        const easeBack = () => {
            setPosition(0.5); // Move back to center
        };

        wrap.addEventListener('mousedown', () => isDown = true);
        wrap.addEventListener('mouseup', () => isDown = false);
        wrap.addEventListener('mouseleave', () => {
            isDown = false;
            easeBack();
        });
        wrap.addEventListener('mousemove', move);

        wrap.addEventListener('touchstart', (e) => {
            isDown = true;
            move(e);
        });
        wrap.addEventListener('touchmove', move);
        wrap.addEventListener('touchend', () => {
            isDown = false;
            easeBack();
        });

        // Initialize position
        setPosition(0.5);
    });
});
</script>
Text Link