# embed-core See [index.html](index.html) to understand how it can be used. ## Features - The Embed SDK can be added asynchronously - You can add it through any tag manager like GTM if you like[Need to Test] - Available configurations are - `theme` - Prefilling of - `name` - `email` - `notes` - `guests` ## How to use embed on any webpage no matter what framework - _Step-1._ Install the snippet ```javascript (function(C, A, L) { let p = function(a, ar) { a.q.push(ar); }; let d = C.document; C.Cal = C.Cal || function() { let cal = C.Cal; let ar = arguments; if (!cal.loaded) { cal.ns = {}; cal.q = cal.q || []; d.head.appendChild(d.createElement("script")).src = A; cal.loaded = true; } if (ar[0] === L) { const api = function() { p(api, arguments); }; const namespace = ar[1]; api.q = api.q || []; typeof namespace === "string" ? (cal.ns[namespace] = api) && p(api, ar) : p(cal, ar); return; } p(cal, ar); }; })(window, "https://cal.com/embed.js", "init"); ``` - _Step-2_. Give `init` instruction to it. It creates a queue so that even without embed.js being fetched, you can give instructions to embed. ```javascript Cal("init) // Creates default instance. Give instruction to it as Cal("instruction") ``` **Optionally** if you want to install another instance of embed you can do ```javascript Cal("init", "NAME_YOUR_OTHER_INSTANCE"); // Creates a named instance. Give instructions to it as Cal.ns.NAME_YOUR_OTHER_INSTANCE("instruction") ``` - Step-1 and Step-2 must be followed in same order. After that you can give various instructions to embed as you like. ## Supported Instructions Consider an instruction as a function with that name and that would be called with the given argument. `inline` - Appends embed inline as the child of the element. - `elementOrSelector` - Give it either a valid CSS selector or an HTMLElement instance directly - `calLink` - Cal Link that you want to embed e.g. john. Just give the username. No need to give the full URL . It makes it easy to configure the calendar host once and use as many links you want with just usernames `ui` - Configure UI for embed. Make it look part of your webpage. - `styles` - It supports styling for `body` and `eventTypeListItem`. Right now we support just background on these two. `preload` - If you want to open cal link on some action. Make it pop open instantly by preloading it. - `calLink` - Cal Link that you want to embed e.g. john. Just give the username. No need to give the full URL ## Development Run the following command and then you can test the embed in the automatically opened page `http://localhost:3002` ```bash yarn dev ``` ## Shipping to Production ```bash yarn build ``` Make `dist/embed.umd.js` servable on URL ## Upcoming Improvements - Unsupported Browsers and versions. Documenting them and gracefully handling that. - Accessibility and UI/UX Issues - Loader on ModalBox/popup - If website owner links the booking page directly for an event, should the user be able to go to events-listing page using back button ? - Bundling Related - Minify CSS in embed.js - Debuggability - Send log messages from iframe to parent so that all logs can exist in a single queue forming a timeline. - user should be able to use "on" instruction to understand what's going on in the system - Error Tracking for embed.js - Know where exactly it’s failing if it does. - Improved Demo - Seeding might be done for team event so that such an example is also available readily in index.html - Dev Experience/Ease of Installation - Do we need a one liner(like `window.dataLayer.push`) to inform SDK of something even if snippet is not yet on the page but would be there e.g. through GTM it would come late on the page ? - Might be better to pass all configuration using a single base64encoded query param to booking page. - Embed Code Generator - UI Config Features - Theme switch dynamically - If user switches the theme on website, he should be able to do it on embed. - Text Color - Brand color - At some places Text is colored by using the color specific tailwind class. e.g. `text-gray-400` is the color of disabled date. He has 2 options, If user wants to customize that - He can go and override the color on the class which doesn’t make sense - He can identify the element and change the color by directly adding style, which might cause consistency issues if certain elements are missed. - Challenges - How would the user add on hover styles just using style attribute ? - React Component - `onClick` support with preloading ## Pending Documentation - READMEs - How to make a new element configurable using UI instruction ? - Why do we NOT want to provide completely flexible CSS customization by adding whatever CSS user wants. ? - docs.cal.com - A complete document on how to use embed - app.cal.com - Get Embed code for each event-type