Abstract background with large soft-edged pastel shapes in blue, purple, and yellow blending together.
*
Content
*
Content
* * Text usage (requires JS): *
*

Your **amazing** solution

*
*/ /* ============================================ RAINBOW TEXT GRADIENTS ============================================ */ .rainbow-text { background: linear-gradient(90deg, #7A00FF 0%, #FF8082 100%); background-clip: text; -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-fill-color: transparent; } /* Dark variant - darker purple end */ [data-wf--section--variant="dark"] .rainbow-text, [data-rainbow-variant="dark"] .rainbow-text { background: linear-gradient(90deg, #7A00FF 0%, #490099 100%); background-clip: text; -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-fill-color: transparent; } /* Color/Purple/Pink variants - full spectrum */ [data-wf--section--variant="color"] .rainbow-text, [data-wf--section--variant="purple"] .rainbow-text, [data-wf--section--variant="pink"] .rainbow-text, [data-rainbow-variant="color"] .rainbow-text, [data-rainbow-variant="purple"] .rainbow-text, [data-rainbow-variant="pink"] .rainbow-text { background: linear-gradient(90deg, #7A00FF 0%, #FF8082 100%); background-clip: text; -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-fill-color: transparent; } /* ============================================ RAINBOW BORDERS ============================================ */ /* ============================================ DEFAULT: Light Variant ============================================ */ .border-rainbow { border: 1px solid transparent; border-radius: var(--_ui-styles---radius--medium, 10px); background: linear-gradient(var(--color-scheme-1--background, white), var(--color-scheme-1--background, white)) padding-box, linear-gradient(90deg, #7A00FF 0%, #FF8082 100%) border-box; } /* ============================================ DARK VARIANT ============================================ */ .border-rainbow-dark { border: 1px solid transparent; border-radius: var(--_ui-styles---radius--medium, 10px); background: linear-gradient(var(--color-scheme-1--background, white), var(--color-scheme-1--background, white)) padding-box, linear-gradient(90deg, #7A00FF 0%, #490099 100%) border-box; } /* ============================================ COLOR VARIANT ============================================ */ .border-rainbow-color, .border-rainbow-purple, .border-rainbow-pink { border: 1px solid transparent; border-radius: var(--_ui-styles---radius--medium, 10px); background: linear-gradient(var(--color-scheme-1--background, white), var(--color-scheme-1--background, white)) padding-box, linear-gradient(90deg, #7A00FF 0%, #FF8082 100%) border-box; } /* ============================================ AUTO-DETECT FROM PARENT WEBFLOW VARIANTS ============================================ */ /* Dark parent */ [data-wf--section--variant="dark"] .border-rainbow { background: linear-gradient(var(--color-scheme-1--background, white), var(--color-scheme-1--background, white)) padding-box, linear-gradient(90deg, #7A00FF 0%, #490099 100%) border-box; } /* Color parent */ [data-wf--section--variant="color"] .border-rainbow, [data-wf--section--variant="purple"] .border-rainbow, [data-wf--section--variant="pink"] .border-rainbow { background: linear-gradient(var(--color-scheme-1--background, white), var(--color-scheme-1--background, white)) padding-box, linear-gradient(90deg, #7A00FF 0%, #FF8082 100%) border-box; } /** * Rainbow Border - Pure CSS Solution * No JavaScript required! * * Replaces your existing border with a rainbow gradient. * Respects existing border-radius or uses 10px fallback. * * Usage: *
Content
*
Content
*
Content
*/ /* ============================================ DEFAULT: Light Variant ============================================ */ .border-rainbow { border: 1px solid transparent; border-radius: var(--_ui-styles---radius--medium, 10px); background: linear-gradient(var(--color-scheme-1--background, white), var(--color-scheme-1--background, white)) padding-box, linear-gradient(90deg, #7A00FF 0%, #FF8082 100%) border-box; } /* ============================================ DARK VARIANT ============================================ */ .border-rainbow-dark { border: 1px solid transparent; border-radius: var(--_ui-styles---radius--medium, 10px); background: linear-gradient(var(--color-scheme-1--background, white), var(--color-scheme-1--background, white)) padding-box, linear-gradient(90deg, #7A00FF 0%, #490099 100%) border-box; } /* ============================================ COLOR VARIANT ============================================ */ .border-rainbow-color, .border-rainbow-purple, .border-rainbow-pink { border: 1px solid transparent; border-radius: var(--_ui-styles---radius--medium, 10px); background: linear-gradient(var(--color-scheme-1--background, white), var(--color-scheme-1--background, white)) padding-box, linear-gradient(90deg, #7A00FF 0%, #FF8082 100%) border-box; } /* ============================================ AUTO-DETECT FROM PARENT WEBFLOW VARIANTS ============================================ */ /* Dark parent */ [data-wf--section--variant="dark"] .border-rainbow { background: linear-gradient(var(--color-scheme-1--background, white), var(--color-scheme-1--background, white)) padding-box, linear-gradient(90deg, #7A00FF 0%, #490099 100%) border-box; } /* Color parent */ [data-wf--section--variant="color"] .border-rainbow, [data-wf--section--variant="purple"] .border-rainbow, [data-wf--section--variant="pink"] .border-rainbow { background: linear-gradient(var(--color-scheme-1--background, white), var(--color-scheme-1--background, white)) padding-box, linear-gradient(90deg, #7A00FF 0%, #FF8082 100%) border-box; }
* * Advanced: Customize the variant * Option A: Use Webflow variants (auto-detected): *
*

Your **enterprise** solution

*
* * Option B: Manual override: *
*

Your **premium** solution

*
* * Conflict Prevention: * - Automatically detects and skips components managing their own rainbow text * - Add data-rainbow-managed to components with custom rainbow scripts * - Skips dynamic content areas (Finsweet, Webflow CMS, etc.) * - Use data-rainbow-skip to manually opt out specific elements */ (function() { 'use strict'; // Track processed elements to prevent conflicts and double-processing const processedElements = new WeakSet(); /** * Get the variant value from any Webflow-generated variant attribute * Returns the variant value (light, dark, color, purple, etc.) * Defaults to 'light' if no variant found - works independently! */ function getVariantValue(element) { // 1. Check for manual override on the element itself if (element.hasAttribute('data-rainbow-variant')) { return element.getAttribute('data-rainbow-variant'); } // 2. Search up the DOM tree for a Webflow variant attribute let current = element; while (current && current !== document.body) { const attributes = current.attributes; for (let i = 0; i < attributes.length; i++) { const attr = attributes[i]; if (attr.name.startsWith('data-wf--') && attr.name.endsWith('--variant')) { return attr.value; } } current = current.parentElement; } // 3. Default to 'light' variant - makes it work independently! return 'light'; } /** * Check if a component is managing its own rainbow text * Returns true if the component should be skipped */ function isComponentSelfManaged(element) { // Find the parent component with data-rainbow const component = element.closest('[data-rainbow]'); if (!component) return false; // Check if component has a marker indicating it manages its own rainbow text if (component.hasAttribute('data-rainbow-managed')) { return true; } // Check if component already has rainbow-text spans that weren't created by us // (indicating another script is managing it) const existingRainbow = component.querySelectorAll('.rainbow-text'); if (existingRainbow.length > 0) { // Check if any of these rainbow spans don't contain ** markers // If they don't have **, they were likely created by another script for (let i = 0; i < existingRainbow.length; i++) { const rainbowSpan = existingRainbow[i]; // Check parent text for ** markers const parentText = rainbowSpan.parentNode ? rainbowSpan.parentNode.textContent : ''; if (!parentText.includes('**')) { return true; // Component is managing its own rainbow } } } return false; } /** * Check if variant should skip rainbow styling (gradient backgrounds) * Returns true if the variant has a gradient background where rainbow wouldn't be visible */ function shouldSkipRainbow(variant) { // Skip rainbow for variants with gradient backgrounds // Add more variant names here as needed return variant === 'color' || variant === 'purple' || variant === 'gradient'; } /** * Process a single text element * Finds **text** patterns and wraps them in * Or just removes ** markers for gradient background variants */ function processRainbowText(element, variant) { // Skip if already processed if (processedElements.has(element)) { return; } // Skip if manually opted out via data-rainbow-skip if (element.hasAttribute('data-rainbow-skip') || element.closest('[data-rainbow-skip]')) { return; } // Skip if component is managing its own rainbow text if (isComponentSelfManaged(element)) { return; } // Skip if inside a dynamic content area that other scripts manage if (element.closest('[fs-list-element]') || element.closest('[data-w-id]') || element.closest('.w-dyn-item')) { return; } // Mark as processed processedElements.add(element); // Wrap in try-catch to prevent breaking other scripts try { processRainbowTextInternal(element, variant); } catch (error) { console.warn('Rainbow text processing failed for element:', element, error); } } /** * Internal processing function */ function processRainbowTextInternal(element, variant) { // Check if this variant should skip rainbow styling (gradient backgrounds) const skipRainbow = shouldSkipRainbow(variant); // Create tree walker to find text nodes const walker = document.createTreeWalker( element, NodeFilter.SHOW_TEXT, null, false ); const textNodes = []; let node; while (node = walker.nextNode()) { textNodes.push(node); } // Process each text node textNodes.forEach(textNode => { const text = textNode.textContent; // Check if text contains **markers** if (text.includes('**')) { let processedHTML; if (skipRainbow) { // For gradient background variants, just remove the ** markers processedHTML = text.replace(/\*\*(.+?)\*\*/g, '$1'); } else { // For other variants, wrap in rainbow-text span processedHTML = text.replace( /\*\*(.+?)\*\*/g, '$1' ); } // Only update if we found markers if (processedHTML !== text) { if (skipRainbow) { // Just update the text content textNode.textContent = processedHTML; } else { // Replace with HTML const tempDiv = document.createElement('div'); tempDiv.innerHTML = processedHTML; // Replace the text node with the new HTML const parent = textNode.parentNode; while (tempDiv.firstChild) { parent.insertBefore(tempDiv.firstChild, textNode); } parent.removeChild(textNode); } } } }); } /** * Initialize rainbow text processing for all components with data-rainbow */ function initRainbowText() { // Find all components with data-rainbow attribute const rainbowComponents = document.querySelectorAll('[data-rainbow]'); rainbowComponents.forEach(component => { // Get the variant value (auto-detects or defaults to 'light') const variant = getVariantValue(component); // Process all headings within the component const headings = component.querySelectorAll('h1, h2, h3, h4, h5, h6, .heading-style-h1, .heading-style-h2'); headings.forEach(heading => { processRainbowText(heading, variant); }); // Also process any paragraphs or other text elements if needed const paragraphs = component.querySelectorAll('p'); paragraphs.forEach(p => { processRainbowText(p, variant); }); }); } /** * Run on DOM ready, but AFTER other scripts have initialized * This prevents conflicts with Finsweet, Webflow, and other libraries */ function safeInit() { // Add a small delay to let other scripts initialize first setTimeout(function() { try { initRainbowText(); } catch (error) { console.warn('Rainbow text initialization failed:', error); } }, 100); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', safeInit); } else { safeInit(); } /** * Also run after Webflow interactions complete (if using Webflow) */ if (window.Webflow) { window.Webflow.push(function() { // Extra delay for Webflow since it modifies DOM setTimeout(initRainbowText, 200); }); } // Expose function globally for manual triggering if needed window.GuidebookRainbow = window.GuidebookRainbow || {}; window.GuidebookRainbow.processText = initRainbowText; // Keep backwards compatibility window.GuidebookCTA = { processRainbowText: initRainbowText }; })();

Finally, event tech that puts people first.

Build your event app, registration, website, and badges in one place (and remember what it feels like to enjoy the process).

Collage showing people using mobile devices at an event, a mobile app schedule with sessions, an event badge for Andrea Schmidt, and a woman smiling at her phone.

Trusted by thousands of event planners worldwide.

The only platform built to make attendees feel like VIPs.

From registration to real-time engagement, it’s all designed for a wow effect.

Event app

Give attendees everything they need — schedules, speakers, maps, messaging, and more — in one beautifully branded app.

Three smartphones showing Guidebook app screens with event guides, schedule sessions, and an expo hall map.

Badges

Design and print badges your way: DIY or pro.

Person scanning a glowing purple QR code with a smartphone under low light, featuring security and settings icons overlay.

Analytics

See what worked (and what didn’t) so your next event is more dialed-in.

People standing in a long line indoors with graphical overlays of charts representing data analytics.
Plastic badge holders with lanyards displayed on a reflective surface under purple lighting.

Registration and check-in

Branded registration that drives signups and captures the data you need.

Attendee engagement

Get attendees participating and interacting with gamification, polls, push notifications, and much more.

Woman smiling sideways in a colorful social setting with heart and star icons above her.

Simple where it matters. Powerful where it counts.

Powerful tools that help planners breathe easier and give attendees a reason to smile.

Effortless for you.

Create, customize, and launch your event with ease. No bloated tech stack or repetitive manual tasks.

Woman wearing glasses working on a laptop with floating digital interface elements and text highlighting brand focus, design ease, actionable insights, and platform unity.

Delightful for them.

No scrambling or awkward “where am I supposed to be?” moments. Just a clear path from check-in to connection.

Smiling woman at a check-in counter with event lanyard, surrounded by people and text bubbles highlighting fast self-check-in and event engagement features.
Collage of three circular images showing smiling conference attendees using devices, a large audience at a presentation, and event badges with awards for Best Estimated ROI and Users Love Us.

Your trusted partner for every event.

Proven across industries and event types, here’s what Guidebook has made possible.

5M

Attendees connected through our platform

2M

App downloads helping attendees engage and connect

5K

Event planners building unforgettable experiences

4K

Reviews celebrating our support and ease of use

Join 5,000+ other
**event planners** today.

From Fortune 500s to universities to associations, teams trust Guidebook to save time, reduce chaos, and delight attendees.

Young woman with glasses and a gray sweater resting her chin on her hand, attentively watching an event.

See how it works

"Guidebook allows us to present a complex schedule in a straightforward and easy to navigate manner without overwhelming our participants."
Deca Inc Team
Deca Inc
Group of five young people smiling and posing in front of a colorful graffiti wall at an event.

Real feedback from real teams

Smiling business people holding wine glasses at a lively indoor event with warm lighting.

Plan your next event with ease

"Going back, if I had to do it over again, I would have never left Guidebook"
Lori J. Reed
Division Program Coordinator
Smiling businessman in suit and tie enjoying a lively networking event with blurred people and warm lighting in the background.

Trusted by enterprises, associations and more

Built for your industry.

Whether you're planning for students, members, employees, or other attendees, Guidebook helps you create events that make an impact. See how easily you can tailor the experience to your goals and your community.

Higher Education

Keep students on track, staff in sync, and alumni in the loop — all without spreadsheet-and-email overwhelm.

Enterprise

Whether it’s a conference, tradeshow, or internal training, create on-brand experiences that hit the mark every time.

Two women smiling and looking at a smartphone together at a social event with blurred people in the background.

Associations

Engage the members you have. Attract the ones you don’t (yet!). And do both with ease.

Non-profits

Rally your supporters, simplify event planning, and do more good without burning out.