
Security News
US Government Forces Anthropic to Pull Claude Fable Days After Launch
Anthropic says the directive cited national security concerns over a narrow jailbreak, but offered no specific technical details.
drill-widgets
Advanced tools
Easily embed powerful workflow building and running capabilities into your web applications with Lit-based web components. Includes HTML export for server-side PDF generation.
Easily embed powerful workflow building and running capabilities into your web applications!
Drill Widgets provides Lit-based web components that let you:
Perfect for onboarding flows, request processes, checklists, approvals, and any task requiring structured, sequential steps.
npm install drill-widgets
If you're integrating Drill Widgets for the first time, follow this sequence:
npm install drill-widgetscreateBuilder(...)Workflow) to your backendInstance from that WorkflowcreateRunner(...)onInstanceUpdated and return { success: boolean, error?: string }import { createBuilder, type Workflow } from "drill-widgets";
const referenceWorkflow: Workflow | undefined = await api.getWorkflow("shared-block-library");
createBuilder("builder-root", {
stepsWithPhasesSupport: true, // optional
supportPriorStepAccess: true, // optional
referenceWorkflow, // optional read-only source for Reuse block suggestions
onWorkflowCreated: async (workflow) => {
await api.saveWorkflow(workflow);
},
});
import { createRunner, type Instance } from "drill-widgets";
const instance: Instance = await api.getInstance("inst-123");
createRunner("runner-root", {
instance,
mode: "default",
currentUser: { targetId: "user-1", email: "user-1@example.com" },
onInstanceUpdated: async (detail) => {
const ok = await api.saveInstanceProgress(detail.instanceId!, detail);
return ok ? { success: true } : { success: false, error: "Save failed" };
},
});
Heads-up:
step.descriptionis now treated as authoring metadata. Runner and print HTML export display the step title, but do not render the step description text to end users.
onSuggestedNotifications(records) for downstream notification orchestrationnextInstancesUponCompletion(detail) to offer direct links to the user's other pending workflow instances after completiononSignatureCaptured(detail) for signature storageonFileUploaded(detail) for file upload plumbingAI-assigned steps (assignment.category: "ai", assignment.type: "ai_model") are currently experimental.
For production usage today, prefer human assignment categories (individual / role).
StepAssignment supports richer launch-time targeting semantics for role/org-unit filtering and optional multi-assignee behavior.
Split between template-time vs launch-time assignment choice
individual/subject, individual/creator, individual/specific_user.instance_assignee_select, instance_role_assignee_select.Role-based filtering can include multiple roles
eligibleRoleIDs as a set.Org-unit filtering can include multiple units
eligibleOrgUnitIDs as a set.Role/org-unit filters can be combined with AND/OR
filter.logicalCombination.operatorValue: "AND" | "OR".Optional multi-assignee mode
permitMultipleAssignees: true allows many assignees for a step.Optional automatic assignment from filters
assignAnyMatchingUsersAutomatically: true is meaningful only when:
permitMultipleAssignees === true, androles (or legacy alias groups).orgUnits (or legacy alias units).permitMultipleAssignees?: booleanassignAnyMatchingUsersAutomatically?: booleanfilter?: AssignmentFiltereligibleRoleIDs?: string[]eligibleOrgUnitIDs?: string[]eligibleUnitIDs?: string[] (deprecated alias)targetIDs?: string[]emails?: string[]AssignmentFilter supports logical combinations of role + org-unit criteria:
logicalCombination.operatorValue: "AND" | "OR"setCombination.operatorValue: "ANY"eligibleRoleIDseligibleOrgUnitIDs using typed selectors:
{ type: "org_unit_id", value: "<unit-id>" }{ type: "dynamic_org_unit", value: "initiator_org_unit" | "subject_org_unit" }Template-side example:
assignment: {
category: "role",
type: "instance_role_assignee_select",
permitMultipleAssignees: true,
assignAnyMatchingUsersAutomatically: true,
filter: {
logicalCombination: {
operatorValue: "OR",
setCombinations: [
{
operatorValue: "ANY",
eligibleRoleIDs: ["crew-lead", "supervisor"],
eligibleOrgUnitIDs: [{ type: "org_unit_id", value: "north-yard" }],
},
{
operatorValue: "ANY",
eligibleRoleIDs: ["auditor"],
eligibleOrgUnitIDs: [{ type: "dynamic_org_unit", value: "subject_org_unit" }],
},
],
},
},
}
Resolved instance-side data may include multiple assignees:
assignment: {
category: "role",
type: "instance_role_assignee_select",
targetIDs: ["user-1", "user-2"],
emails: ["u1@example.com", "u2@example.com"],
}
For checkbox questions with multiple options (checkbox groups), condition authoring now uses option-membership operators instead of boolean equality.
Equals / Does not equal.Includes any of (includes_any_of)Does not include any of (does_not_include_any_of)In Builder, Value for checkbox-group conditions is a multi-select over checkbox option names.
Backend/schema guidance:
includes_any_of/does_not_include_any_of to be arrays of selected option labels.eq/neq logic for single-checkbox questions remains valid.in/not_in values are still accepted for backward compatibility.createBuilder and createRunner.builder-widget):
stepsWithPhasesSupport toggle in createBuilder (copy) suffixsupportPriorStepAccessreferenceWorkflow support to enrich Reuse suggestions from a read-only source workflowrunner-widget):
Instance object snapshotonInstanceUpdated, onSignatureCaptured, onFileUploaded, onSuggestedNotifications) for saving progress and final results<builder-widget>) used to create Workflow templates with a focused, clean interface.<runner-widget>) used to execute an Instance, presenting the steps and elements to the user.stepsWithPhasesSupportWhen enabled in createBuilder, the Builder UI exposes Steps with Phases controls. The saved workflow JSON can include:
workflow.usePhases: booleanstep.waitForPrevious: boolean (per step, default true)createBuilder("workflow-builder", {
workflow,
stepsWithPhasesSupport: true,
onWorkflowCreated: (wf) => saveWorkflowTemplate(wf),
});
referenceWorkflow (for Reuse block enrichment)Builder always shows a Reuse block control in each step section footer.
referenceWorkflow steps/elements (read-only)createBuilder("workflow-builder", {
workflow,
referenceWorkflow: reusableBlockLibraryWorkflow, // optional
onWorkflowCreated: (wf) => saveWorkflowTemplate(wf),
});
Builder always supports authoring step-level conditional visibility using rules.
always, never, or conditionalstep.metadata.ruleswhen (all / any) with operators such as eq, neq, includes_any_of, does_not_include_any_of, gt, gte, lt, lte (legacy in/not_in is still supported)createBuilder("workflow-builder", {
workflow,
onWorkflowCreated: (wf) => saveWorkflowTemplate(wf),
});
supportPriorStepAccessWhen supportPriorStepAccess is enabled, Builder exposes Prior Step Access controls on non-first steps.
all: true means users can reference any eligible prior/concurrent step in-context.all: false + stepIdsToRead means references are limited to the selected step IDs.stepIdsToRead.Example:
createBuilder("workflow-builder", {
workflow,
supportPriorStepAccess: true,
onWorkflowCreated: (wf) => saveWorkflowTemplate(wf),
});
Step JSON shape:
step: {
id: "step-3",
priorStepAccess: {
all: false,
stepIdsToRead: ["step-1", "step-2"],
},
}
Workflow β InstanceFor Runner behavior to remain correct, the instance snapshot must preserve these fields from the workflow:
usePhasesid, order, title, assignment, waitForPreviouspriorStepAccess (all, stepIdsToRead) when Prior Step Access is enabledvisibility (especially when: "conditional")metadata.rules (step-target visibility.set, required.set, etc.)id, order, type, base config (label, required, options, etc.)visibilitymetadata.rulesIf step.visibility or step.metadata.rules are dropped during transformation, conditional-step logic in Runner can regress (for example, missed skip/unneeded behavior).
When a workflow is saved from Builder with phase support enabled:
usePhases: true means the runner uses phase-based progression.waitForPrevious: false is parallel within its phase.waitForPrevious: true starts a new phase boundary.Note that with waitForPrevious being optional and true by default, step progression is entirely serial by default, for backward compatibility.
onSuggestedNotificationsRunner can emit suggested notification records after step completion:
createRunner("workflow-runner", {
instance,
mode: "default",
onSuggestedNotifications: async (records) => {
// send suggestions to your API or queue
await saveSuggestedNotifications(records);
},
});
Each record includes:
instanceIduserEmailuserIdstepIdmayBecomeMootIfUserCompletesOnlinehasBecomeMootNote that if there is more than one step in a phase, supporting parallel execution of those steps, the list of suggested notifications will include one record per step with someone to notify. It's possible that in a 4-step phase, 2 of the steps can have the same user assigned, but the Runner does not attempt to consolidate those notifications.
Also note that the flags around mootness are intended to help avoid extraneous notifications that might otherwise be sent to users who have progressed from one step to another in the UI. A possibly moot notification is one that will ideally be sent only if the user doesn't complete the step during the session in which that step was first encountered in the UI. If a possibly moot suggestion is followed by a has-become-moot suggestion, then the user has completed that step and doesn't need the notification. You may consider possibly moot notifications as a recommendation to send sometime soon but not immediately, proceeding with it if there are no further instructions to the contrary.
Instance.status now supports "revisions_needed" in addition to "draft", "active", "completed", and "canceled".
For app UX, treat "revisions_needed" as active work still in progress (not completed).
Use this to reflect workflows that require assignee follow-up revisions.
Step response records support revision-specific fields:
needsRevision?: booleanrevisionNotes?: stringThese live on InstanceStepElement / QuestionResponse entries and allow per-block revision guidance.
Workflow payload?At minimum:
const workflow = {
id: "wf-1",
name: "Example Workflow",
steps: [
{
id: "step-1",
order: 1,
title: "Step 1",
elements: [],
assignment: { category: "individual", type: "specific_user" },
status: "pending",
},
],
};
Instance payload?At minimum:
const instance = {
id: "inst-1",
workflowId: "wf-1",
name: "Example Instance",
status: "active",
steps: workflow.steps,
completedSteps: [],
};
onInstanceUpdated run, and what must it return?onInstanceUpdated is used when Runner persists step progress/submission. It must resolve to:
{ success: boolean; error?: string }
If your callback does not return this shape, Runner treats it as an error.
Type definitions use Date for fields such as dueDate and answeredAt. If your backend sends ISO strings, convert them to Date objects before passing data into widgets.
onSuggestedNotifications records?Recommended approach:
mayBecomeMootIfUserCompletesOnline: true briefly.hasBecomeMoot: true for the same user/step context, suppress/cancel that notification.Provide nextInstancesUponCompletion in createRunner(...).
When the current assigned-step submission or full workflow submission completes, Runner can show a post-submission panel with direct links to other pending workflow instances assigned to that same user.
Typical usage:
createRunner("workflow-runner", {
instance,
mode: "default",
nextInstancesUponCompletion: async (detail) => {
return await api.getNextPendingInstancesForUser({
instanceId: detail.instanceId,
workflowId: detail.workflowId,
completionType: detail.completionType,
});
},
});
Runner expects an array of objects shaped like:
[
{
stepName: "Review and Sign",
instanceName: "Vendor Packet",
createdDate: "2026-06-01T12:00:00.000Z",
dueDate: "2026-06-03T12:00:00.000Z",
url: "https://app.example.com/drills/run/inst-456",
},
];
Notes:
url is optional. If omitted, Runner shows the destination step name as text without a link.revisions_needed?Recommended UX:
Builder only includes reusable question blocks from:
referenceWorkflow (read-only)Names are shown once (distinct, AβZ). If there is a name collision between active and reference workflows, the active workflow version is used when inserting. If there's a name collision within a workflow, the earlier one is used.
The Runner widget supports distinct modes for different use cases:
Purpose: Standard workflow execution with full functionality.
Configuration:
createRunner("runner-container", {
instance: instanceData, // Required: Instance object
mode: "default", // Optional: Default if not specified
// ... other options
});
Features:
Use Cases:
In default mode, users can now click on any step in the sidebar for full workflow transparency:
Assigned Steps (Full Mode):
Unassigned Steps (Read-Only Mode):
Next Button Behavior:
This provides complete workflow transparency while maintaining assignment boundaries and data integrity.
Purpose: Interactive preview of workflow templates without data persistence.
Configuration:
createRunner("runner-container", {
workflow: workflowData, // Required: Workflow object (not Instance)
mode: "preview", // Required: Must be explicitly set
// ... other options
});
Features:
Use Cases:
Purpose: Administrative access for workflow management with unrestricted navigation and step-by-step saving.
Configuration:
createRunner("runner-container", {
instance: instanceData, // Required: Instance object
mode: "admin", // Required: Must be explicitly set
currentUser: userData, // Required: User with admin access
// ... other options
});
Features:
Use Cases:
Purpose: Read-only viewing of completed workflow data with pre-filled responses displayed as non-editable content.
Configuration:
createRunner("runner-container", {
instance: completedInstanceData, // Required: Instance with responses
mode: "view-only", // Required: Must be explicitly set
currentUser: userData, // Optional: For display purposes
// ... other options
});
Features:
Use Cases:
Purpose: Print-optimized display of completed workflow data with all steps shown on one continuous page.
Configuration:
createRunner("runner-container", {
instance: completedInstanceData, // Required: Instance with responses
mode: "print", // Required: Must be explicitly set
currentUser: userData, // Optional: For display purposes
// ... other options
});
Features:
File Display Enhancement:
Use Cases:
| Feature | Default Mode | Preview Mode | Admin Mode | View-Only Mode | Print Mode |
|---|---|---|---|---|---|
| Data Source | Instance object | Workflow object | Instance object | Instance object (with responses) | Instance object (with responses) |
| Data Persistence | β localStorage | β None | β localStorage | β None | β None |
| Validation | β Required fields | β Disabled | β Required fields | β N/A (read-only) | β N/A (read-only) |
| Step Navigation | π Smart (assigned: restricted, unassigned: view-only) | β Free (any step) | β Free (any step) | β Free (any step) | β Single page view |
| Input Editing | π Conditional (assigned: enabled, unassigned: disabled) | β Enabled | β Enabled | β Disabled (read-only) | β Disabled (read-only) |
| Callbacks | β All callbacks fire (assigned steps only) | β Disabled | β All callbacks fire | β Disabled | β Disabled |
| Navigation Buttons | π Conditional (visible for assigned steps only) | β Hidden | β Save button visible | β Hidden | β Hidden |
| Assignment Checks | β Enforced | β Bypassed | β Bypassed | β Bypassed | β Bypassed |
| Post-Submission Access | β Blocked | β Always available | β Always available | β Always available | β Always available |
| File/Signature Display | Form inputs | Form inputs | Form inputs | π Clickable links | π Detailed info display |
| Layout | Sidebar + single step | Sidebar + single step | Sidebar + single step | Sidebar + single step | π All steps on one page |
| Primary Use Case | Production execution | Template preview | Admin management | Completed data viewing | Document printing |
| Type | Description | Features |
|---|---|---|
text_input | Single-line text input | Placeholder text, validation |
textarea | Multi-line text area | Resizable, placeholder text |
select | Dropdown selection | Multiple options, placeholder |
number | Numeric input | Number validation |
radio | Radio button group | Multiple options, single selection |
checkbox | Checkbox input | Single checkbox or checkbox group |
date | Date picker | Date validation |
file_upload | File upload | File selection, 5MB limit, client callback |
signature | Digital signature pad | SVG output, responsive canvas, callback on next/submit |
| Type | Description | Features |
|---|---|---|
text | Plain text content | Simple text display |
markdown | Markdown content | Headers, lists, formatting |
html | HTML content | Custom HTML rendering |
divider | Visual separator | Optional caption |
image | Image display | URL, alt text, caption |
video | Video display | URL, caption |
file | File display | URL, caption |
git clone <your-repo-url> && cd drill-widgetsnpm installThis project supports two distinct modes for different use cases:
For active development with hot reload and fast iteration:
npm run dev
For testing the built library as it would be distributed:
npm run build
npm run preview
| Aspect | Development (npm run dev) | Production (npm run preview) |
|---|---|---|
| Loading | ES modules from /src/ | UMD bundle from /dist/ |
| Speed | Fast startup, HMR | Slower startup, no HMR |
| Files | Source TypeScript files | Compiled JavaScript bundle |
| Debugging | Source maps, readable code | Minified bundle |
| Use Cases | Development, debugging | Final testing, demos |
Both modes include a demo with:
The build process includes a custom script that:
tsc compiles source filesvite build creates the UMD bundlescripts/build-html.js converts the HTML to use the UMD bundlenpm install drill-widgets
import { createBuilder, createRunner, type Workflow } from "drill-widgets";
const reusableBlockLibraryWorkflow: Workflow | undefined =
await fetchWorkflowFromBackend("workflow-shared-library");
// Initialize Builder
createBuilder("workflow-builder", {
workflow: existingWorkflow, // optional, for edit mode
stepsWithPhasesSupport: true, // enable Steps with Phases UI
supportPriorStepAccess: true, // enable Prior Step Access controls
referenceWorkflow: reusableBlockLibraryWorkflow, // optional read-only source
onWorkflowCreated: (workflowData) => {
console.log("Workflow template created:", workflowData);
saveWorkflowTemplate(workflowData);
},
onWorkflowUpdated: (workflowData) => {
console.log("Workflow template updated:", workflowData);
updateWorkflowTemplate(workflowData);
},
onWorkflowDeleted: (workflowId) => {
console.log("Workflow template deleted:", workflowId);
deleteWorkflowTemplate(workflowId);
},
});
// Initialize Runner (Default Mode)
const instanceData = await fetchInstanceFromBackend("instance-id-123");
if (instanceData && instanceData.steps) {
createRunner("workflow-runner", {
instance: instanceData,
mode: "default", // Optional: Default if not specified
onInstanceUpdated: (detail) => {
console.log("Progress Update:", detail);
// Save progress data (for both step updates and final submission)
saveInstanceProgress(detail.instanceId, detail);
// Check if this is the final submission (no current step)
if (!detail.currentStep) {
console.log("Workflow Complete!");
}
},
onSignatureCaptured: (detail) => {
console.log("Signature captured:", detail.questionId);
console.log("Instance ID:", detail.instanceId);
console.log("Step ID:", detail.stepId);
console.log("SVG Data:", detail.svgData);
console.log("Data URL:", detail.dataURL);
// Save signature data to your backend
// Note: This callback is triggered when user clicks "Next" or "Submit"
saveSignatureData(detail.instanceId, detail.questionId, detail.svgData, detail.dataURL);
},
onFileUploaded: (detail) => {
console.log("File uploaded:", detail.questionId);
console.log("Instance ID:", detail.instanceId);
console.log("Step ID:", detail.stepId);
console.log("File name:", detail.fileName);
console.log("File size:", detail.fileSize);
console.log("File type:", detail.fileType);
console.log("File object:", detail.file);
// Handle file upload to your backend/storage
// Note: This callback is triggered immediately when a file is selected
handleFileUpload(detail.instanceId, detail.questionId, detail.file);
},
onSuggestedNotifications: async (records) => {
console.log("Suggested notifications:", records);
await saveSuggestedNotifications(records);
},
});
}
// Initialize Runner (Preview Mode)
const workflowData = await fetchWorkflowFromBackend("workflow-id-456");
if (workflowData && workflowData.steps) {
createRunner("workflow-preview", {
workflow: workflowData, // Note: workflow, not instance
mode: "preview", // Required for preview mode
});
}
The Runner widget supports a loading state that can be used with any mode to show a loading indicator and disable user interaction while data is being processed or fetched.
Configuration:
const runnerWidget = createRunner("runner-container", {
instance: instanceData,
mode: "default",
isLoading: true, // Shows loading spinner and disables step navigation
currentUser: userData,
onInstanceUpdated: (detail) => {
console.log("Progress:", detail);
},
});
// Update loading state dynamically
runnerWidget.isLoading = false; // Hide loading spinner and re-enable navigation
Features:
Use Cases:
In view-only mode, file uploads and signatures are displayed as clickable links instead of form inputs. This allows users to view and download the actual files and signatures that were submitted:
In print mode, file uploads and signatures are displayed with detailed information instead of interactive elements, making them perfect for printed documents:
File Upload Display:
Signature Display:
Example Print Mode File Display:
π File: contract_agreement.pdf
π Size: 2.3 MB
π Type: PDF Document
π
Modified: 12/15/2024, 2:30:15 PM
// Example: Instance with file upload and signature responses
const completedInstanceData = {
id: "inst-123",
workflowId: "wf-onboarding",
name: "John Doe Onboarding",
status: "completed",
steps: [
{
id: "step-1",
title: "Document Upload",
responses: [
{
elementId: "resume-upload",
value: "https://storage.example.com/files/john-doe-resume.pdf", // File URL
answeredAt: new Date("2024-01-15T10:30:00Z"),
},
{
elementId: "signature-pad",
value: "https://storage.example.com/signatures/john-doe-sig.svg", // Signature URL directly in value
answeredAt: new Date("2024-01-15T10:35:00Z"),
},
],
elements: [
{
id: "resume-upload",
type: "file_upload",
label: "Upload Resume",
required: true,
},
{
id: "signature-pad",
type: "signature",
label: "Digital Signature",
required: true,
},
],
},
],
completedSteps: ["step-1"],
};
// When rendered in view-only mode:
// - File upload shows: "π filename.pdf" (clickable link that opens file in new tab)
// - Signature shows: embedded signature image (same as print mode)
Drill Widgets includes a powerful HTML export utility that generates print-ready HTML from workflow instances. This is perfect for server-side PDF generation, email reports, and documentation.
The generateInstanceHTML() function takes a workflow Instance object and produces complete HTML that matches the appearance of the runner widget's print mode exactly. By default, it renders only the workflow steps and elements (just like print mode). Optionally, you can add metadata headers with instance information.
import { generateInstanceHTML } from "drill-widgets";
const result = generateInstanceHTML(myInstance);
console.log(result.html); // Complete HTML string ready for PDF generation
const result = generateInstanceHTML(myInstance, {
title: "Employee Onboarding Report",
showTimestamps: true, // Add metadata header (not in print mode)
customCSS: `
.print-layout {
font-family: 'Times New Roman', serif;
}
`,
});
const puppeteer = require("puppeteer");
async function generatePDF(instance) {
const result = generateInstanceHTML(instance, {
title: "Workflow Report",
showTimestamps: true,
});
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setContent(result.html, { waitUntil: "networkidle0" });
await page.pdf({
path: "./report.pdf",
format: "A4",
printBackground: true,
margin: { top: "20mm", right: "20mm", bottom: "20mm", left: "20mm" },
});
await browser.close();
}
const express = require("express");
const { generateInstanceHTML } = require("drill-widgets");
app.get("/report/:instanceId", async (req, res) => {
const instance = await getInstanceFromDatabase(req.params.instanceId);
const result = generateInstanceHTML(instance, {
title: `Report: ${instance.name}`,
showTimestamps: true,
});
res.setHeader("Content-Type", "text/html");
res.send(result.html);
});
interface HTMLExportOptions {
title?: string; // Custom document title (default: instance.name)
includeStyles?: boolean; // Include embedded CSS (default: true)
customCSS?: string; // Additional CSS to inject
showTimestamps?: boolean; // Show instance metadata header (default: false)
}
interface HTMLExportResult {
html: string; // Complete HTML document
title: string; // Document title used
generatedAt: Date; // Generation timestamp
}
Drill Widgets includes comprehensive TypeScript definitions for full type safety and developer experience.
When you install drill-widgets from npm, the TypeScript declaration files are automatically included:
npm install drill-widgets
import {
createBuilder,
createRunner,
type Workflow,
type Instance,
type Step,
type StepElement,
type QuestionElement,
type ContentElement,
} from "drill-widgets";
// Use the types for type safety
const myWorkflow: Workflow = {
id: "my-workflow",
name: "My Workflow",
steps: [],
};
const myInstance: Instance = {
id: "my-instance",
workflowId: "my-workflow",
name: "My Instance",
status: "active",
steps: [],
completedSteps: [],
};
import type {
Workflow,
Instance,
Step,
StepElement,
QuestionElement,
ContentElement,
QuestionResponse,
StepAssignment,
BuilderConfig,
RunnerConfig,
} from "drill-widgets";
import type {
Workflow,
Instance,
StepElement,
QuestionElement,
ContentElement,
BuilderConfig,
RunnerConfig,
} from "drill-widgets/types";
| Type | Description |
|---|---|
Workflow | Complete workflow template definition |
Instance | Workflow instance with data and progress |
Step | Individual workflow step |
StepElement | Union of all possible step elements |
QuestionElement | Form question element |
ContentElement | Content/display element |
QuestionResponse | User's answer to a question |
InstanceStepElement | Step response entry with revision metadata (needsRevision, revisionNotes) |
StepAssignment | Assignment target + optional role/unit filters + optional multi-assignee data |
StepStatus | Current status of a step |
WorkflowInstanceStatus | Overall instance status, including revisions_needed |
BuilderConfig | Configuration for the builder widget |
RunnerConfig | Configuration for the runner widget |
Visibility | Element visibility rules |
VisibilityRule | Individual visibility condition |
Note: The
Questiontype is deprecated and only included for legacy support. UseQuestionElementfor all new development.
For JavaScript projects, you can still get type hints using JSDoc:
/**
* @typedef {import('drill-widgets').Workflow} Workflow
* @typedef {import('drill-widgets').Instance} Instance
*/
/**
* @param {Workflow} workflow
* @param {Instance} instance
*/
function processWorkflow(workflow, instance) {
// Full intellisense and type checking here
console.log(workflow.name);
console.log(instance.status);
}
drill-widgets/
βββ src/
β βββ models.ts # TypeScript interfaces
β βββ lib.ts # Main library API
β βββ builder-widget.ts # Workflow template builder component
β βββ runner-widget.ts # Workflow runner component
β βββ styles/ # Organized CSS styles for components
β β βββ base-styles.ts
β β βββ form-styles.ts
β β βββ section-styles.ts
β β βββ step-styles.ts
β β βββ modal-styles.ts
β β βββ index.ts
β βββ main.ts # Entry point for development
βββ scripts/
β βββ build-html.js # Build script for production HTML
βββ dist/ # Generated files (after build)
β βββ drill-widgets.umd.js
β βββ index.html
βββ index.html # Development HTML (ES modules)
βββ vite.config.js # Vite configuration
βββ package.json
# Start development server with hot reload
npm run dev
# Build the production bundle
npm run build
# Preview the production build
npm run preview
# Run tests (placeholder)
npm test
npm run dev, not npm run previewnpm run build before npm run previewnpx tsc --noEmitLet Drill Widgets streamline your application's workflows!
FAQs
Easily embed powerful workflow building and running capabilities into your web applications with Lit-based web components. Includes HTML export for server-side PDF generation.
The npm package drill-widgets receives a total of 272 weekly downloads. As such, drill-widgets popularity was classified as not popular.
We found that drill-widgets demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.Β It has 2 open source maintainers 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.

Security News
Anthropic says the directive cited national security concerns over a narrow jailbreak, but offered no specific technical details.

Security News
A network of 152 Chrome live wallpaper extensions hid ad tracking and made extension-driven traffic look like Google search clicks.

Company News
Socketβs first CISO brings deep experience securing high-growth SaaS companies as open source supply chain threats accelerate.