
Research
/Security News
737 Chrome VPN Extensions Linked to Brand Impersonation and Browser Traffic Redirection
The campaign amassed more than 75,000 installs by targeting Russian-speaking users seeking access to blocked services.
@astrocal/widget
Advanced tools
Embeddable booking widget for Astrocal — drop-in scheduling UI for any website or app
Embeddable booking widget for Astrocal — drop-in scheduling UI for any website or app.
npm install @astrocal/widget
import { open } from "@astrocal/widget";
open({
eventTypeId: "your-event-type-id",
mode: "popup",
});
Mount the widget into a specific DOM element:
import { open, destroy } from "@astrocal/widget";
// Mount
open({
eventTypeId: "your-event-type-id",
mode: "inline",
target: "#booking-container",
});
// Clean up when done
destroy("#booking-container");
For non-npm users, load the widget via a script tag:
<script src="https://cdn.astrocal.dev/widget/latest/astrocal.js"></script>
<script>
Astrocal.open({
eventTypeId: "your-event-type-id",
mode: "popup",
});
</script>
Or use auto-initialization with data attributes:
<script src="https://cdn.astrocal.dev/widget/latest/astrocal.js"></script>
<div data-astrocal-event-type-id="your-event-type-id" data-astrocal-mode="inline"></div>
open(config: WidgetConfig): voidOpens the booking widget in inline or popup mode.
close(): voidCloses the popup widget if open. No-op if no popup is active.
destroy(target: string | HTMLElement): voidDestroys an inline widget mounted on a target element. Removes the Shadow DOM and cleans up all resources. No-op if no widget is mounted on the target.
autoInit(): voidScans the DOM for elements with data-astrocal-* attributes and mounts widgets automatically.
| Property | Type | Default | Description |
|---|---|---|---|
eventTypeId | string | required | Event type UUID to display |
apiUrl | string | "https://api.astrocal.dev" | API base URL |
mode | "inline" | "popup" | "popup" | Render mode |
target | string | HTMLElement | — | DOM element or CSS selector (inline mode) |
timezone | string | auto-detected | IANA timezone override |
theme | ThemeConfig | — | CSS custom property overrides |
colorScheme | "light" | "dark" | "auto" | "auto" | Color scheme |
demo | boolean | false | Enable demo mode (mock data, no API calls) |
onBookingCreated | (booking: BookingResult) => void | — | Booking success callback |
onError | (error: WidgetError) => void | — | Error callback |
onClose | () => void | — | Popup close callback |
| Property | CSS Custom Property | Description |
|---|---|---|
primaryColor | --astrocal-primary | Primary action color |
primaryHoverColor | --astrocal-primary-hover | Primary hover color |
headingColor | --astrocal-heading | Heading text color |
backgroundColor | --astrocal-bg | Widget background |
textColor | --astrocal-text | Body text color |
borderColor | --astrocal-border | Border color |
borderFocusColor | --astrocal-border-focus | Focused border color |
borderRadius | --astrocal-radius | Border radius |
fontFamily | --astrocal-font | Font family |
The package is safe to import in Node.js (e.g., Next.js, Nuxt). The autoInit() function is guarded and will not run on the server. However, open() and destroy() require a browser environment and will throw a clear error if called without a DOM. close() is a silent no-op on the server.
// Safe — no error on import
import { open } from "@astrocal/widget";
// Only call in browser context
if (typeof window !== "undefined") {
open({ eventTypeId: "..." });
}
Full documentation at docs.astrocal.dev.
MIT
FAQs
Embeddable booking widget for Astrocal — drop-in scheduling UI for any website or app
The npm package @astrocal/widget receives a total of 168 weekly downloads. As such, @astrocal/widget popularity was classified as not popular.
We found that @astrocal/widget demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
The campaign amassed more than 75,000 installs by targeting Russian-speaking users seeking access to blocked services.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.