Loading...
Loading...
When using npm package `@duskmoon-dev/core`, this skill shows how to install, configure, and use the CSS component library
npx skill4agent add gsmlg-dev/code-agent duskmoon-dev-core@duskmoon-dev/core# Bun
bun add @duskmoon-dev/core tailwindcss@^4.0.0
# npm
npm install @duskmoon-dev/core tailwindcss@^4.0.0
# pnpm
pnpm add @duskmoon-dev/core tailwindcss@^4.0.0@import "tailwindcss";
@import "@duskmoon-dev/core";@import "tailwindcss";
@plugin "@duskmoon-dev/core/plugin";@pluginbg-primarytext-on-surfacedata-theme<html data-theme="sunshine"> <!-- Light theme -->
<html data-theme="moonlight"> <!-- Dark theme -->btnbtn-primarybtn-secondarybtn-tertiarybtn-outlinebtn-ghostbtn-textbtn-loadingcircle-menucircle-menu-togglercircle-menu-listcircle-menu-itemcircle-menu-labelcircle-menu-primarycircle-menu-secondarycircle-menu-tertiarycircle-menu-infocircle-menu-successcircle-menu-warningcircle-menu-errorcircle-menu-smcircle-menu-lgfile-uploadfile-upload-dropzonefile-upload-primaryfile-upload-compactfile-upload-buttonfile-upload-smfile-upload-lgfile-upload-ghosttoggle-btntoggle-btn-activetoggle-btn-primarytoggle-btn-ghosttoggle-btn-smtoggle-btn-lgtoggle-grouptoggle-segmentedtoggle-chiptoggle-filledtoggle-outlinedinputinput-primaryinput-secondaryinput-errortextareatextarea-primarytextarea-resize-nonetextarea-resize-verticalselectselect-primaryselect-filledselect-outlinedcascadercascadercascader-panelcascader-menucheckboxcheckbox-primarycheckbox-indeterminatecheckbox-groupradioradio-primaryradio-groupradio-group-horizontalswitchswitch-primaryswitch-secondaryslidersegment-controlsegment-controlsegment-control-itemautocompletedatepickertime-inputtime-inputtime-input-pickerfile-uploadratingotp-inputotp-inputotp-input-fieldpin-inputpin-inputpin-input-maskedmulti-selectmulti-selectmulti-select-tagtree-selecttree-selecttree-select-nodeform-groupform-groupform-labelhelper-textfieldsettheme-controllertheme-controllertheme-controller-dropdowntheme-controller-itemtheme-controller-labelcardcard-bodycard-titlebadgebadge-primarybadge-dotavataravatar-lgavatar-status-onlinechipchip-primarychip-removabletabletable-hovertable-stripedlistlist-itemlist-item-interactivetimelineskeletonskeleton-textskeleton-circleskeleton-rectskeleton-waveskeleton-avatarskeleton-buttonskeleton-cardskeleton-groupcode-blockcode-headercode-titlecode-languagecode-contentcode-block-compactcode-block-borderlessalertalert-successalert-erroralert-warningalert-infodialogdialog-backdropdialog-mdmodaltoasttoast-successtoast-showsnackbarprogressprogress-primaryprogress-indeterminateskeletonskeleton-textskeleton-circletooltiptooltip-toptooltip-bottombreadcrumbsbreadcrumb-itembreadcrumb-item-activebreadcrumb-item-disabledbreadcrumb-linkbreadcrumb-separatorbreadcrumb-iconbreadcrumb-homebreadcrumb-home-iconbreadcrumb-ellipsisbreadcrumbs-containedbreadcrumbs-smbreadcrumbs-lgbreadcrumbs-nowrapnavbarnavbar-surface-container-highnavbar-startnavbar-centernavbar-endtabstabtab-activetabs-boxedtabs-liftedtab-smtab-lgtab-xsmenumenu-itemmenu-titlemenu-horizontalmenu-verticaldrawerdrawer-leftdrawer-opennested-menunested-menunested-menu-titlenested-menu-borderednested-menu-compactpaginationpagination-itempagination-item-activepagination-item-disabledpagination-prevpagination-nextpagination-ellipsispagination-compactpagination-responsivepagination-infopagination-inputpagination-item-active-primarypagination-item-active-secondarypagination-item-active-tertiarybottom-navbottom-nav-itemstepperstepper-step-activestepper-step-completeddividerdivider-dasheddivider-verticalappbarappbar-topappbar-bottommarkdown-bodygrid-cols-auto-fill-*grid-cols-auto-fill-48grid-cols-auto-fill-64grid-cols-auto-fit-*grid-cols-auto-fit-48grid-cols-auto-fit-64sr-onlynot-sr-onlyaccordionaccordion-item-openbottomsheetbottom-sheet-showpopoverpopover-toppopover-showcollapse<button class="btn btn-primary">Primary</button>
<button class="btn btn-secondary btn-outline">Outlined</button>
<button class="btn btn-tertiary btn-ghost">Ghost</button>
<button class="btn btn-primary btn-loading">Loading...</button><div class="card">
<div class="card-body">
<h2 class="card-title">Title</h2>
<p>Content</p>
</div>
</div><input type="text" class="input" placeholder="Default" />
<input type="text" class="input input-primary" placeholder="Primary" />
<input type="text" class="input input-error" placeholder="Error" /><div class="alert alert-success">Success message</div>
<div class="alert alert-error">Error message</div>
<div class="alert alert-warning">Warning message</div>
<div class="alert alert-info">Info message</div><nav class="navbar navbar-surface-container-high">
<div class="navbar-start">
<a class="navbar-brand">Logo</a>
</div>
<div class="navbar-center">
<a class="navbar-item navbar-item-active">Home</a>
<a class="navbar-item">About</a>
</div>
</nav><div class="tabs">
<button class="tab tab-active">Tab 1</button>
<button class="tab">Tab 2</button>
</div><div class="dialog-backdrop dialog-backdrop-show">
<div class="dialog dialog-md">
<div class="dialog-header">
<h2 class="dialog-title">Title</h2>
</div>
<div class="dialog-body">Content</div>
<div class="dialog-actions">
<button class="btn btn-text">Cancel</button>
<button class="btn btn-filled">Confirm</button>
</div>
</div>
</div><ul class="nested-menu nested-menu-bordered">
<li class="nested-menu-title">Getting Started</li>
<li><a href="/install">Installation</a></li>
<li><a href="/config" class="active">Configuration</a></li>
<li>
<details open>
<summary>Components</summary>
<ul>
<li><a href="/button">Button</a></li>
<li><a href="/card">Card</a></li>
</ul>
</details>
</li>
</ul><!-- Inline switch mode -->
<div class="theme-controller">
<input type="radio" name="theme" value="sunshine" class="theme-controller-item" checked />
<label class="theme-controller-label">Light</label>
<input type="radio" name="theme" value="moonlight" class="theme-controller-item" />
<label class="theme-controller-label">Dark</label>
</div>
<!-- Dropdown mode -->
<details class="theme-controller-dropdown">
<summary class="theme-controller-trigger">Theme</summary>
<div class="theme-controller-menu">
<input type="radio" name="theme" value="sunshine" class="theme-controller-item" checked />
<label class="theme-controller-label">Sunshine</label>
<input type="radio" name="theme" value="moonlight" class="theme-controller-item" />
<label class="theme-controller-label">Moonlight</label>
</div>
</details><!-- Single toggle -->
<button class="toggle-btn toggle-btn-active">Bold</button>
<!-- Toggle group -->
<div class="toggle-group">
<button class="toggle-btn toggle-btn-active">Left</button>
<button class="toggle-btn">Center</button>
<button class="toggle-btn">Right</button>
</div><!-- Auto-fill: Fixed column size, empty space on right -->
<div class="grid grid-cols-auto-fill-48 gap-4">
<div class="card">Item 1</div>
<div class="card">Item 2</div>
<div class="card">Item 3</div>
</div>
<!-- Auto-fit: Columns stretch to fill container -->
<div class="grid grid-cols-auto-fit-64 gap-4">
<div class="card">Item 1</div>
<div class="card">Item 2</div>
</div><!-- Backgrounds -->
<div class="bg-primary">Primary</div>
<div class="bg-secondary">Secondary</div>
<div class="bg-tertiary">Tertiary</div>
<div class="bg-surface-container">Surface</div>
<!-- Text -->
<p class="text-primary">Primary</p>
<p class="text-on-surface">On surface</p>
<p class="text-on-surface-variant">Muted</p>
<!-- Semantic -->
<div class="bg-success text-success-content">Success</div>
<div class="bg-error text-error-content">Error</div>.custom {
background-color: var(--color-primary);
color: var(--color-primary-content);
border-color: var(--color-outline);
}// Switch to dark theme
document.documentElement.dataset.theme = 'moonlight';
// Switch to light theme
document.documentElement.dataset.theme = 'sunshine';/* In your CSS file */
@import "tailwindcss";
@import "@duskmoon-dev/core";/* CSS imports */
@import "@duskmoon-dev/core/components/button";
@import "@duskmoon-dev/core/components/card";
@import "@duskmoon-dev/core/components/input";
@import "@duskmoon-dev/core/components/alert";// Import component styles in JS/TS
import '@duskmoon-dev/core/components/button';
import '@duskmoon-dev/core/components/card';
import '@duskmoon-dev/core/components/input';/* Import specific themes */
@import "@duskmoon-dev/core/themes/sunshine";
@import "@duskmoon-dev/core/themes/moonlight";| Import Path | Component |
|---|---|
| Accordion |
| Alert |
| App Bar |
| Autocomplete |
| Avatar |
| Badge |
| Bottom Navigation |
| Bottom Sheet |
| Button |
| Card |
| Cascader |
| Checkbox |
| Chip |
| Circle Menu |
| Code Block |
| Collapse |
| Date Picker |
| Dialog |
| Divider |
| Drawer |
| File Upload |
| Form |
| Form Group |
| Input |
| List |
| Markdown Body |
| Modal |
| Multi-Select |
| Navigation (Navbar/Tabs/Menu) |
| Nested Menu |
| OTP Input |
| PIN Input |
| Popover |
| Progress |
| Radio |
| Rating |
| Segment Control |
| Select |
| Skeleton |
| Slider |
| Snackbar |
| Stepper |
| Switch |
| Table |
| Textarea |
| Theme Controller |
| Time Input |
| Timeline |
| Toast |
| Toggle |
| Tooltip |
| Tree Select |
css// Import the css named export
import { css as buttonCSS } from '@duskmoon-dev/core/components/button';
import { css as cardCSS } from '@duskmoon-dev/core/components/card';
import { css as inputCSS } from '@duskmoon-dev/core/components/input';import { css as buttonCSS } from '@duskmoon-dev/core/components/button';
// Strip @layer wrapper for Shadow DOM compatibility
const coreStyles = buttonCSS.replace(/@layer\s+components\s*\{/, '').replace(/\}\s*$/, '');
class MyButton extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
// Add styles to shadow DOM
const style = document.createElement('style');
style.textContent = coreStyles;
this.shadowRoot.appendChild(style);
}
}@layer components { }@layer