@imfusion/web-ui 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -0
- package/bin/install-skill.js +180 -0
- package/dist/assets/vendors/base-ui.d.ts +8 -0
- package/dist/breakpoints/index.d.ts +3 -0
- package/dist/breakpoints/min-width.d.ts +9 -0
- package/dist/breakpoints/registry.d.ts +19 -0
- package/dist/code-qBbqAHK-.js +190 -0
- package/dist/codegen/gen-breakpoints-css.d.ts +6 -0
- package/dist/codegen/gen-css-types.d.ts +1 -0
- package/dist/codegen/gen-token-css.d.ts +6 -0
- package/dist/codegen/run.d.ts +1 -0
- package/dist/components/app-shell/app-shell.d.ts +66 -0
- package/dist/components/app-shell/app-shell.meta.d.ts +2 -0
- package/dist/components/app-shell/index.d.ts +2 -0
- package/dist/components/button/button.d.ts +30 -0
- package/dist/components/button/button.meta.d.ts +2 -0
- package/dist/components/button/index.d.ts +2 -0
- package/dist/components/callout/callout.d.ts +42 -0
- package/dist/components/callout/callout.meta.d.ts +2 -0
- package/dist/components/callout/index.d.ts +2 -0
- package/dist/components/card/card.d.ts +64 -0
- package/dist/components/card/card.meta.d.ts +2 -0
- package/dist/components/card/index.d.ts +2 -0
- package/dist/components/checkbox/checkbox.d.ts +56 -0
- package/dist/components/checkbox/checkbox.meta.d.ts +2 -0
- package/dist/components/checkbox/index.d.ts +2 -0
- package/dist/components/chip/chip.cva.d.ts +12 -0
- package/dist/components/chip/chip.d.ts +11 -0
- package/dist/components/chip/chip.meta.d.ts +2 -0
- package/dist/components/chip/index.d.ts +2 -0
- package/dist/components/chip-link/chip-link.d.ts +17 -0
- package/dist/components/chip-link/chip-link.meta.d.ts +2 -0
- package/dist/components/chip-link/index.d.ts +2 -0
- package/dist/components/code/code.d.ts +60 -0
- package/dist/components/code/code.meta.d.ts +2 -0
- package/dist/components/code/index.d.ts +2 -0
- package/dist/components/collapsible/collapsible.d.ts +57 -0
- package/dist/components/collapsible/collapsible.meta.d.ts +2 -0
- package/dist/components/collapsible/index.d.ts +2 -0
- package/dist/components/copy-button/copy-button.d.ts +21 -0
- package/dist/components/copy-button/copy-button.meta.d.ts +2 -0
- package/dist/components/copy-button/index.d.ts +2 -0
- package/dist/components/drawer/drawer.d.ts +191 -0
- package/dist/components/drawer/drawer.meta.d.ts +2 -0
- package/dist/components/drawer/index.d.ts +2 -0
- package/dist/components/input/index.d.ts +2 -0
- package/dist/components/input/input.d.ts +25 -0
- package/dist/components/input/input.meta.d.ts +2 -0
- package/dist/components/logo/imfusion/imfusion.d.ts +16 -0
- package/dist/components/logo/imfusion/index.d.ts +1 -0
- package/dist/components/logo/index.d.ts +3 -0
- package/dist/components/logo/logo.d.ts +15 -0
- package/dist/components/logo/logo.meta.d.ts +2 -0
- package/dist/components/navigation-menu/index.d.ts +2 -0
- package/dist/components/navigation-menu/navigation-menu.d.ts +20 -0
- package/dist/components/navigation-menu/navigation-menu.meta.d.ts +2 -0
- package/dist/components/navigation-menu/subs/flyout-link.d.ts +24 -0
- package/dist/components/navigation-menu/subs/inline-submenu.d.ts +41 -0
- package/dist/components/navigation-menu/subs/link.d.ts +64 -0
- package/dist/components/navigation-menu/subs/overlay.d.ts +75 -0
- package/dist/components/navigation-menu/subs/shared.d.ts +20 -0
- package/dist/components/navigation-menu/subs/structure.d.ts +64 -0
- package/dist/components/navigation-menu/subs/trigger.d.ts +47 -0
- package/dist/components/popover/index.d.ts +2 -0
- package/dist/components/popover/popover.d.ts +181 -0
- package/dist/components/popover/popover.meta.d.ts +2 -0
- package/dist/components/row/index.d.ts +2 -0
- package/dist/components/row/row.d.ts +28 -0
- package/dist/components/row/row.meta.d.ts +2 -0
- package/dist/components/select/index.d.ts +2 -0
- package/dist/components/select/select.d.ts +278 -0
- package/dist/components/select/select.meta.d.ts +2 -0
- package/dist/components/separator/index.d.ts +2 -0
- package/dist/components/separator/separator.d.ts +15 -0
- package/dist/components/separator/separator.meta.d.ts +2 -0
- package/dist/components/slider/index.d.ts +2 -0
- package/dist/components/slider/slider.d.ts +111 -0
- package/dist/components/slider/slider.meta.d.ts +2 -0
- package/dist/components/spinner/index.d.ts +2 -0
- package/dist/components/spinner/spinner.d.ts +19 -0
- package/dist/components/spinner/spinner.geometry.d.ts +37 -0
- package/dist/components/spinner/spinner.meta.d.ts +2 -0
- package/dist/components/stack/index.d.ts +2 -0
- package/dist/components/stack/stack.d.ts +18 -0
- package/dist/components/stack/stack.meta.d.ts +2 -0
- package/dist/components/switch/index.d.ts +2 -0
- package/dist/components/switch/switch.d.ts +45 -0
- package/dist/components/switch/switch.meta.d.ts +2 -0
- package/dist/components/table/index.d.ts +2 -0
- package/dist/components/table/table.d.ts +66 -0
- package/dist/components/table/table.meta.d.ts +2 -0
- package/dist/components/tabs/index.d.ts +2 -0
- package/dist/components/tabs/tabs.d.ts +91 -0
- package/dist/components/tabs/tabs.meta.d.ts +2 -0
- package/dist/components/toggle/index.d.ts +2 -0
- package/dist/components/toggle/toggle.d.ts +31 -0
- package/dist/components/toggle/toggle.meta.d.ts +2 -0
- package/dist/components/toggle-group/index.d.ts +2 -0
- package/dist/components/toggle-group/toggle-group.d.ts +30 -0
- package/dist/components/toggle-group/toggle-group.meta.d.ts +2 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/tooltip/tooltip.d.ts +164 -0
- package/dist/components/tooltip/tooltip.meta.d.ts +2 -0
- package/dist/components/typo/index.d.ts +2 -0
- package/dist/components/typo/typo.d.ts +100 -0
- package/dist/components/typo/typo.meta.d.ts +2 -0
- package/dist/config.d.ts +8 -0
- package/dist/docgen/gen-docgen.d.ts +1 -0
- package/dist/docgen/gen-docgen.utils.d.ts +13 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/use-clipboard.d.ts +12 -0
- package/dist/hooks/use-color-scheme.d.ts +31 -0
- package/dist/hooks/use-media-query.d.ts +13 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +13103 -0
- package/dist/integrations/code-highlight/code-highlight.d.ts +21 -0
- package/dist/integrations/code-highlight/code-highlight.meta.d.ts +2 -0
- package/dist/integrations/code-highlight/highlighter.d.ts +6 -0
- package/dist/integrations/code-highlight/index.d.ts +3 -0
- package/dist/integrations/code-highlight.js +97 -0
- package/dist/integrations/image-display-options/image-display-options-view.d.ts +22 -0
- package/dist/integrations/image-display-options/image-display-options-view.utils.d.ts +40 -0
- package/dist/integrations/image-display-options/image-display-options.d.ts +29 -0
- package/dist/integrations/image-display-options/image-display-options.meta.d.ts +2 -0
- package/dist/integrations/image-display-options/index.d.ts +2 -0
- package/dist/integrations/image-display-options.js +319 -0
- package/dist/llms/gen-llms.d.ts +1 -0
- package/dist/meta-B8C51eyL.js +74 -0
- package/dist/provider/index.d.ts +1 -0
- package/dist/provider/web-ui-provider.d.ts +6 -0
- package/dist/style.css +2 -0
- package/dist/tabs-DqBFSqq6.js +3789 -0
- package/dist/tokens/apply.d.ts +55 -0
- package/dist/tokens/control-registry.d.ts +10 -0
- package/dist/tokens/token-registry.d.ts +13 -0
- package/dist/tokens/types.d.ts +71 -0
- package/dist/tokens/use-token-controls.d.ts +36 -0
- package/dist/types/docgen.d.ts +17 -0
- package/dist/types/meta.d.ts +108 -0
- package/dist/types/theme.d.ts +3 -0
- package/package.json +139 -0
- package/src/docgen/doc.gen.json +4695 -0
- package/src/llms/llms.gen.txt +176 -0
- package/src/llms/skills/imf-web-ui/SKILL.md +46 -0
- package/src/llms/skills/imf-web-ui-components/SKILL.md +100 -0
- package/src/llms/skills/imf-web-ui-frontend-patterns/SKILL.md +67 -0
- package/src/llms/skills/imf-web-ui-frontend-patterns/references/react-patterns.md +94 -0
- package/src/llms/skills/imf-web-ui-setup/SKILL.md +30 -0
- package/src/llms/skills/imf-web-ui-ux/SKILL.md +103 -0
- package/src/llms/skills/imf-web-ui-ux/references/forms.md +48 -0
- package/src/llms/skills/imf-web-ui-ux/references/usability-heuristics.md +29 -0
- package/src/llms/skills/imf-web-ui-ux/references/visual-design.md +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Web UI
|
|
2
|
+
|
|
3
|
+
`@imfusion/web-ui` — the official shared Web UI library for ImFusion web apps, built on Base UI (selected through the
|
|
4
|
+
company's Component Library ADR). It will be published to ImFusion's private npm registry for internal use (publishing isn't
|
|
5
|
+
wired up yet — the package is still `private`).
|
|
6
|
+
|
|
7
|
+
This repo is **AI-first**: it's designed to be worked on by driving an agent through a set of skills, and that's the
|
|
8
|
+
smoothest path — but hand-writing code is perfectly welcome too. (How the agent config is wired is described under
|
|
9
|
+
[Working with an AI agent](#working-with-an-ai-agent).)
|
|
10
|
+
|
|
11
|
+
Either way, the fastest way in is the **`/web-ui-dev-getting-started`** skill: a short interactive intro that figures out
|
|
12
|
+
what you want to do and points you at the right skill and docs, walking you through setup and the commands you'll need.
|
|
13
|
+
|
|
14
|
+
For the full workflow, see [`CONTRIBUTING.md`](CONTRIBUTING.md); for the runnable scripts, [`package.json`](package.json) is
|
|
15
|
+
the source of truth.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install # installs deps, then configures git (see notes below)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
> **Note — `npm install` also configures git** via the `prepare` script: sets `.githooks` as the hooks path, and enforces a
|
|
22
|
+
> rebase-only pull/merge strategy (`pull.rebase true`, `merge.ff only`). No manual git setup needed.
|
|
23
|
+
|
|
24
|
+
> **Note — install scripts are disabled** (`.npmrc` sets `ignore-scripts=true` for supply-chain security). Today's native
|
|
25
|
+
> deps (esbuild, fsevents) ship their platform binary as an optional dependency, so a fresh install works out of the box. If
|
|
26
|
+
> you add a package that relies on a native install hook (e.g. `sharp`, `node-gyp` builds), it won't run —
|
|
27
|
+
> `npm rebuild <pkg>` once after install, and note it here.
|
|
28
|
+
|
|
29
|
+
# Using the library
|
|
30
|
+
|
|
31
|
+
If you're consuming `@imfusion/web-ui` in a downstream app rather than working on it, **Storybook is your entry point** — it
|
|
32
|
+
carries the setup guides and a live, browsable catalog of every component and its props. It isn't hosted yet; run it locally
|
|
33
|
+
with `npm run dev` (or `npm run storybook`) and open the printed URL.
|
|
34
|
+
|
|
35
|
+
If an AI agent is working in that downstream app, run `npx web-ui-install-skills` (once `@imfusion/web-ui` is installed) to
|
|
36
|
+
give it the `imf-web-ui` skill family — setup, component lookup, UX guidance, and frontend patterns, with a small router
|
|
37
|
+
skill deciding which applies — no need for it to read this library's source. The skills ship inside the package at
|
|
38
|
+
`src/llms/skills/` (next to the generated llms index; deliberately _not_ in `.agents/skills/`, which holds this repo's own
|
|
39
|
+
development skills). See the **AI Agents** page in Storybook's User Guide for the full skill family and how it routes.
|
|
40
|
+
|
|
41
|
+
# Working with an AI agent
|
|
42
|
+
|
|
43
|
+
The agent config is tool-neutral by design, so the repo isn't tied to a single LLM client:
|
|
44
|
+
|
|
45
|
+
- **`AGENTS.md`** holds the instructions, following the cross-tool `AGENTS.md` convention that Cursor, Aider, Windsurf,
|
|
46
|
+
Copilot and others read directly.
|
|
47
|
+
- **`.agents/skills/`** holds the skills — the reusable, step-by-step workflows an agent runs.
|
|
48
|
+
|
|
49
|
+
Claude Code is the one client that looks for its own paths rather than these, so it's bridged with two symlinks:
|
|
50
|
+
`CLAUDE.md → AGENTS.md` and `.claude/skills → .agents/skills`. Edit through either path — it's the same file — but `.agents/`
|
|
51
|
+
and `AGENTS.md` are the canonical, git-tracked source.
|
|
52
|
+
|
|
53
|
+
# Architecture
|
|
54
|
+
|
|
55
|
+
The library's wrappers, types, and public API follow strict rules captured in
|
|
56
|
+
**[docs/architecture.md](docs/architecture.md)**. Read it before contributing — every wrapped component, hook, and public API
|
|
57
|
+
decision must satisfy these rules.
|
|
58
|
+
|
|
59
|
+
That's one of several developer docs — architecture, conventions, the color system, responsiveness, and story authoring.
|
|
60
|
+
Start from **[docs/README.md](docs/README.md)**, which lays out the full reading order.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Installs the consumer skill family (../src/llms/skills/imf-web-ui*/)
|
|
4
|
+
// into the consumer project's agent skill directories. Runs in the
|
|
5
|
+
// CONSUMER's environment, so it may only use this package's real runtime
|
|
6
|
+
// dependencies (@clack/prompts). Never wire this into a postinstall hook:
|
|
7
|
+
// ambient script execution on `npm install` is a live supply-chain attack
|
|
8
|
+
// vector — install stays an explicit, user-run command.
|
|
9
|
+
//
|
|
10
|
+
// The skills cross-reference each other, so they install as one bundle.
|
|
11
|
+
// When both targets are selected, .agents/skills/ holds the real copy and
|
|
12
|
+
// .claude/skills/ symlinks it (this repo's own convention) so the two
|
|
13
|
+
// can't drift apart.
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
cpSync,
|
|
17
|
+
existsSync,
|
|
18
|
+
lstatSync,
|
|
19
|
+
mkdirSync,
|
|
20
|
+
readdirSync,
|
|
21
|
+
readFileSync,
|
|
22
|
+
rmSync,
|
|
23
|
+
symlinkSync,
|
|
24
|
+
writeFileSync
|
|
25
|
+
} from "node:fs";
|
|
26
|
+
import { dirname, relative, resolve } from "node:path";
|
|
27
|
+
import { fileURLToPath } from "node:url";
|
|
28
|
+
import * as p from "@clack/prompts";
|
|
29
|
+
|
|
30
|
+
const SKILL_PREFIX = "imf-web-ui";
|
|
31
|
+
const VERSION_MARKER = ".imf-web-ui-skill-version.json";
|
|
32
|
+
|
|
33
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
34
|
+
// Source is relative to THIS SCRIPT's location (inside node_modules), not
|
|
35
|
+
// the consumer's cwd — the script is invoked from the consumer's project
|
|
36
|
+
// root, but the skills it copies ship alongside this file in the package.
|
|
37
|
+
const skillsRoot = resolve(here, "..", "src", "llms", "skills");
|
|
38
|
+
const packageJson = JSON.parse(readFileSync(resolve(here, "..", "package.json"), "utf-8"));
|
|
39
|
+
const currentVersion = packageJson.version;
|
|
40
|
+
|
|
41
|
+
// Destination is relative to the consumer's project root (cwd), since
|
|
42
|
+
// that's where their `.claude/` or `.agents/` directory lives.
|
|
43
|
+
const projectRoot = process.cwd();
|
|
44
|
+
|
|
45
|
+
const TARGETS = {
|
|
46
|
+
claude: { label: "Claude Code", root: resolve(projectRoot, ".claude", "skills") },
|
|
47
|
+
agents: { label: "Vendor-neutral (.agents/)", root: resolve(projectRoot, ".agents", "skills") }
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
function discoverSkills() {
|
|
51
|
+
if (!existsSync(skillsRoot)) return [];
|
|
52
|
+
return readdirSync(skillsRoot, { withFileTypes: true })
|
|
53
|
+
.filter(entry => entry.isDirectory() && entry.name.startsWith(SKILL_PREFIX))
|
|
54
|
+
.map(entry => entry.name)
|
|
55
|
+
.sort();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function displayPath(absPath) {
|
|
59
|
+
return `./${relative(projectRoot, absPath)}`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function readInstalledVersion(dir) {
|
|
63
|
+
const markerPath = resolve(dir, VERSION_MARKER);
|
|
64
|
+
if (!existsSync(markerPath)) return null;
|
|
65
|
+
try {
|
|
66
|
+
return JSON.parse(readFileSync(markerPath, "utf-8")).version ?? null;
|
|
67
|
+
} catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function writeRealCopy(sourceDir, destDir) {
|
|
73
|
+
mkdirSync(dirname(destDir), { recursive: true });
|
|
74
|
+
// force: true makes re-running after a version bump overwrite cleanly.
|
|
75
|
+
cpSync(sourceDir, destDir, { recursive: true, force: true });
|
|
76
|
+
writeFileSync(resolve(destDir, VERSION_MARKER), JSON.stringify({ version: currentVersion }, null, 2) + "\n");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function writeSymlink(linkPath, targetPath) {
|
|
80
|
+
mkdirSync(dirname(linkPath), { recursive: true });
|
|
81
|
+
// lstat (not existsSync, which follows symlinks) catches a broken/stale
|
|
82
|
+
// symlink left over from a prior run, not just a real file or directory.
|
|
83
|
+
if (lstatSync(linkPath, { throwIfNoEntry: false })) {
|
|
84
|
+
rmSync(linkPath, { recursive: true, force: true });
|
|
85
|
+
}
|
|
86
|
+
symlinkSync(relative(dirname(linkPath), targetPath), linkPath);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// --target claude|agents (repeatable) selects targets without the
|
|
90
|
+
// interactive prompt — for CI and scripted installs.
|
|
91
|
+
function parseTargetFlags(argv) {
|
|
92
|
+
const targets = [];
|
|
93
|
+
for (let i = 0; i < argv.length; i++) {
|
|
94
|
+
if (argv[i] !== "--target") continue;
|
|
95
|
+
const value = argv[i + 1];
|
|
96
|
+
if (!value || !(value in TARGETS)) {
|
|
97
|
+
console.error(`--target expects one of: ${Object.keys(TARGETS).join(", ")}`);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
targets.push(value);
|
|
101
|
+
i++;
|
|
102
|
+
}
|
|
103
|
+
return targets;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function main() {
|
|
107
|
+
const skills = discoverSkills();
|
|
108
|
+
const flagTargets = parseTargetFlags(process.argv.slice(2));
|
|
109
|
+
|
|
110
|
+
p.intro(`@imfusion/web-ui — install the ${SKILL_PREFIX} skills (${skills.length})`);
|
|
111
|
+
|
|
112
|
+
if (skills.length === 0) {
|
|
113
|
+
p.log.error(`No skills found at ${skillsRoot}. Reinstall @imfusion/web-ui and try again.`);
|
|
114
|
+
p.outro("Nothing installed.");
|
|
115
|
+
process.exitCode = 1;
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const existingVersions = Object.values(TARGETS)
|
|
120
|
+
.flatMap(({ root }) => skills.map(name => readInstalledVersion(resolve(root, name))))
|
|
121
|
+
.filter(Boolean);
|
|
122
|
+
if (existingVersions.length > 0 && existingVersions.every(v => v === currentVersion)) {
|
|
123
|
+
p.log.info(`Already up to date (v${currentVersion}). Re-running will overwrite with the same content.`);
|
|
124
|
+
} else if (existingVersions.some(v => v !== currentVersion)) {
|
|
125
|
+
const from = existingVersions.find(v => v !== currentVersion);
|
|
126
|
+
p.log.info(`Updating installed skills from v${from} to v${currentVersion}.`);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
p.log.message(`Skills in this bundle:\n${skills.map(name => ` - ${name}`).join("\n")}`);
|
|
130
|
+
|
|
131
|
+
let selected;
|
|
132
|
+
if (flagTargets.length > 0) {
|
|
133
|
+
selected = flagTargets;
|
|
134
|
+
p.log.info(`Targets from --target flags: ${selected.join(", ")}`);
|
|
135
|
+
} else {
|
|
136
|
+
selected = await p.multiselect({
|
|
137
|
+
message: "Install into which skill directory (or directories)?",
|
|
138
|
+
options: Object.entries(TARGETS).map(([key, { label, root }]) => ({
|
|
139
|
+
value: key,
|
|
140
|
+
label,
|
|
141
|
+
hint: displayPath(root)
|
|
142
|
+
})),
|
|
143
|
+
required: true
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
if (p.isCancel(selected)) {
|
|
147
|
+
p.cancel("Cancelled — nothing installed.");
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const both = selected.includes("claude") && selected.includes("agents");
|
|
153
|
+
|
|
154
|
+
for (const name of skills) {
|
|
155
|
+
const sourceDir = resolve(skillsRoot, name);
|
|
156
|
+
if (both) {
|
|
157
|
+
// .agents/ is the canonical real copy; .claude/ aliases it via symlink.
|
|
158
|
+
const realDir = resolve(TARGETS.agents.root, name);
|
|
159
|
+
writeRealCopy(sourceDir, realDir);
|
|
160
|
+
writeSymlink(resolve(TARGETS.claude.root, name), realDir);
|
|
161
|
+
} else {
|
|
162
|
+
for (const key of selected) {
|
|
163
|
+
writeRealCopy(sourceDir, resolve(TARGETS[key].root, name));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (both) {
|
|
169
|
+
p.log.success(`Vendor-neutral (.agents/) -> ${displayPath(TARGETS.agents.root)}/${SKILL_PREFIX}*`);
|
|
170
|
+
p.log.success(`Claude Code -> ${displayPath(TARGETS.claude.root)}/${SKILL_PREFIX}* (symlinks -> .agents/)`);
|
|
171
|
+
} else {
|
|
172
|
+
for (const key of selected) {
|
|
173
|
+
p.log.success(`${TARGETS[key].label} -> ${displayPath(TARGETS[key].root)}/${SKILL_PREFIX}*`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
p.outro(`Done — ${skills.length} skills installed.`);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
await main();
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base UI brandmark — compact glyph. Internal asset (not part of the public
|
|
3
|
+
* package API); consumed by the Storybook origin badge to flag adapted
|
|
4
|
+
* components. New upstreams (Mantine, …) get a sibling file here.
|
|
5
|
+
*/
|
|
6
|
+
export declare function BaseUILogo({ size }: {
|
|
7
|
+
size?: number;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BreakpointName } from './registry';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a registry breakpoint name to the plain media-query string
|
|
4
|
+
* `useMediaQuery` expects, e.g. `minWidth("md")` → `"(min-width: 768px)"`.
|
|
5
|
+
*
|
|
6
|
+
* Keeps JS-side viewport checks (e.g. a mobile burger toggle) reading from the
|
|
7
|
+
* same numeric source as the CSS-side `@custom-media` definitions.
|
|
8
|
+
*/
|
|
9
|
+
export declare function minWidth(name: BreakpointName): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Breakpoint registry — the single source of truth for every
|
|
3
|
+
* `@custom-media --imf-ui-*` definition AND the `minWidth()` JS helper.
|
|
4
|
+
* `styles/custom-media.gen.css` is generated from this list by the codegen
|
|
5
|
+
* runner (see `./gen-breakpoints-css.ts`), so CSS and JS can never drift.
|
|
6
|
+
*
|
|
7
|
+
* Values are min-width breakpoints (mobile-first). Component CSS consumes them
|
|
8
|
+
* via `@media (--imf-ui-{name})`; Lightning CSS substitutes the literal at
|
|
9
|
+
* build time (`drafts.customMedia`, enabled in `vite.config.ts` and
|
|
10
|
+
* `.storybook/main.ts`).
|
|
11
|
+
*/
|
|
12
|
+
export declare const BREAKPOINTS: {
|
|
13
|
+
readonly mobile: 375;
|
|
14
|
+
readonly sm: 640;
|
|
15
|
+
readonly md: 768;
|
|
16
|
+
readonly lg: 1024;
|
|
17
|
+
readonly xl: 1280;
|
|
18
|
+
};
|
|
19
|
+
export type BreakpointName = keyof typeof BREAKPOINTS;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { a as e, r as t, t as n } from "./meta-B8C51eyL.js";
|
|
2
|
+
import { createContext as r, createElement as i, forwardRef as a, useCallback as o, useContext as s, useEffect as c, useRef as l, useState as u } from "react";
|
|
3
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
4
|
+
//#region node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs
|
|
5
|
+
var p = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), m = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), h = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), g = (e) => {
|
|
6
|
+
let t = h(e);
|
|
7
|
+
return t.charAt(0).toUpperCase() + t.slice(1);
|
|
8
|
+
}, _ = {
|
|
9
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
10
|
+
width: 24,
|
|
11
|
+
height: 24,
|
|
12
|
+
viewBox: "0 0 24 24",
|
|
13
|
+
fill: "none",
|
|
14
|
+
stroke: "currentColor",
|
|
15
|
+
strokeWidth: 2,
|
|
16
|
+
strokeLinecap: "round",
|
|
17
|
+
strokeLinejoin: "round"
|
|
18
|
+
}, v = (e) => {
|
|
19
|
+
for (let t in e) if (t.startsWith("aria-") || t === "role" || t === "title") return !0;
|
|
20
|
+
return !1;
|
|
21
|
+
}, y = r({}), b = () => s(y), x = a(({ color: e, size: t, strokeWidth: n, absoluteStrokeWidth: r, className: a = "", children: o, iconNode: s, ...c }, l) => {
|
|
22
|
+
let { size: u = 24, strokeWidth: d = 2, absoluteStrokeWidth: f = !1, color: m = "currentColor", className: h = "" } = b() ?? {}, g = r ?? f ? Number(n ?? d) * 24 / Number(t ?? u) : n ?? d;
|
|
23
|
+
return i("svg", {
|
|
24
|
+
ref: l,
|
|
25
|
+
..._,
|
|
26
|
+
width: t ?? u ?? _.width,
|
|
27
|
+
height: t ?? u ?? _.height,
|
|
28
|
+
stroke: e ?? m,
|
|
29
|
+
strokeWidth: g,
|
|
30
|
+
className: p("lucide", h, a),
|
|
31
|
+
...!o && !v(c) && { "aria-hidden": "true" },
|
|
32
|
+
...c
|
|
33
|
+
}, [...s.map(([e, t]) => i(e, t)), ...Array.isArray(o) ? o : [o]]);
|
|
34
|
+
}), S = (e, t) => {
|
|
35
|
+
let n = a(({ className: n, ...r }, a) => i(x, {
|
|
36
|
+
ref: a,
|
|
37
|
+
iconNode: t,
|
|
38
|
+
className: p(`lucide-${m(g(e))}`, `lucide-${e}`, n),
|
|
39
|
+
...r
|
|
40
|
+
}));
|
|
41
|
+
return n.displayName = g(e), n;
|
|
42
|
+
}, C = S("arrow-right", [["path", {
|
|
43
|
+
d: "M5 12h14",
|
|
44
|
+
key: "1ays0h"
|
|
45
|
+
}], ["path", {
|
|
46
|
+
d: "m12 5 7 7-7 7",
|
|
47
|
+
key: "xquz4c"
|
|
48
|
+
}]]), w = S("arrow-up-right", [["path", {
|
|
49
|
+
d: "M7 7h10v10",
|
|
50
|
+
key: "1tivn9"
|
|
51
|
+
}], ["path", {
|
|
52
|
+
d: "M7 17 17 7",
|
|
53
|
+
key: "1vkiza"
|
|
54
|
+
}]]), T = S("check", [["path", {
|
|
55
|
+
d: "M20 6 9 17l-5-5",
|
|
56
|
+
key: "1gmf2c"
|
|
57
|
+
}]]), E = S("copy", [["rect", {
|
|
58
|
+
width: "14",
|
|
59
|
+
height: "14",
|
|
60
|
+
x: "8",
|
|
61
|
+
y: "8",
|
|
62
|
+
rx: "2",
|
|
63
|
+
ry: "2",
|
|
64
|
+
key: "17jyea"
|
|
65
|
+
}], ["path", {
|
|
66
|
+
d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",
|
|
67
|
+
key: "zix9uf"
|
|
68
|
+
}]]);
|
|
69
|
+
//#endregion
|
|
70
|
+
//#region src/hooks/use-clipboard.ts
|
|
71
|
+
function D({ timeout: e = 1500 } = {}) {
|
|
72
|
+
let [t, n] = u(!1), r = l(void 0);
|
|
73
|
+
return c(() => () => clearTimeout(r.current), []), {
|
|
74
|
+
copied: t,
|
|
75
|
+
copy: o((t) => {
|
|
76
|
+
navigator.clipboard.writeText(t).then(() => {
|
|
77
|
+
n(!0), clearTimeout(r.current), r.current = setTimeout(() => n(!1), e);
|
|
78
|
+
});
|
|
79
|
+
}, [e])
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
var O = {
|
|
83
|
+
block: "imf-ui-code-module-block",
|
|
84
|
+
copy: "imf-ui-code-module-copy",
|
|
85
|
+
icon: "imf-ui-code-module-icon",
|
|
86
|
+
inline: "imf-ui-code-module-inline",
|
|
87
|
+
inlineCopy: "imf-ui-code-module-inlineCopy",
|
|
88
|
+
inlineLink: "imf-ui-code-module-inlineLink",
|
|
89
|
+
language: "imf-ui-code-module-language",
|
|
90
|
+
pre: "imf-ui-code-module-pre",
|
|
91
|
+
separator: "imf-ui-code-module-separator"
|
|
92
|
+
}, k = /* @__PURE__ */ e({
|
|
93
|
+
Block: () => M,
|
|
94
|
+
Inline: () => A,
|
|
95
|
+
InlineLink: () => j
|
|
96
|
+
});
|
|
97
|
+
function A({ className: e, copyable: n = !1, highlighted: r, children: i, ...a }) {
|
|
98
|
+
let { copied: o, copy: s } = D(), c = o ? T : E;
|
|
99
|
+
return /* @__PURE__ */ f("code", {
|
|
100
|
+
...a,
|
|
101
|
+
"data-imf-ui-component": "Code.Inline",
|
|
102
|
+
className: t(O.inline, e),
|
|
103
|
+
children: [
|
|
104
|
+
r ?? i,
|
|
105
|
+
n && /* @__PURE__ */ d("span", { className: O.separator }),
|
|
106
|
+
n && /* @__PURE__ */ d("button", {
|
|
107
|
+
type: "button",
|
|
108
|
+
className: O.inlineCopy,
|
|
109
|
+
"data-copied": o || void 0,
|
|
110
|
+
"aria-label": o ? "Copied" : "Copy",
|
|
111
|
+
onClick: () => s(i),
|
|
112
|
+
children: /* @__PURE__ */ d(c, {
|
|
113
|
+
size: 12,
|
|
114
|
+
strokeWidth: 2,
|
|
115
|
+
"aria-hidden": !0
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
]
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
A.displayName = "Code.Inline";
|
|
122
|
+
function j({ className: e, kind: n = "external", children: r, ...i }) {
|
|
123
|
+
let a = n === "external" ? w : C;
|
|
124
|
+
return /* @__PURE__ */ f("a", {
|
|
125
|
+
...n === "external" ? {
|
|
126
|
+
target: "_blank",
|
|
127
|
+
rel: "noreferrer"
|
|
128
|
+
} : {},
|
|
129
|
+
...i,
|
|
130
|
+
"data-imf-ui-component": "Code.InlineLink",
|
|
131
|
+
"data-kind": n,
|
|
132
|
+
className: t(O.inline, O.inlineLink, e),
|
|
133
|
+
children: [
|
|
134
|
+
r,
|
|
135
|
+
/* @__PURE__ */ d("span", { className: O.separator }),
|
|
136
|
+
/* @__PURE__ */ d("span", {
|
|
137
|
+
className: O.icon,
|
|
138
|
+
"aria-hidden": !0,
|
|
139
|
+
children: /* @__PURE__ */ d(a, {
|
|
140
|
+
size: 12,
|
|
141
|
+
strokeWidth: 2
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
]
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
j.displayName = "Code.InlineLink";
|
|
148
|
+
function M({ className: e, language: n, hideCopy: r = !1, highlighted: i, children: a, ...o }) {
|
|
149
|
+
let { copied: s, copy: c } = D(), l = s ? T : E;
|
|
150
|
+
return /* @__PURE__ */ f("div", {
|
|
151
|
+
"data-imf-ui-component": "Code.Block",
|
|
152
|
+
className: t(O.block, e),
|
|
153
|
+
children: [
|
|
154
|
+
n != null && /* @__PURE__ */ d("span", {
|
|
155
|
+
className: O.language,
|
|
156
|
+
children: n
|
|
157
|
+
}),
|
|
158
|
+
!r && /* @__PURE__ */ d("button", {
|
|
159
|
+
type: "button",
|
|
160
|
+
className: O.copy,
|
|
161
|
+
"data-copied": s || void 0,
|
|
162
|
+
"aria-label": s ? "Copied" : "Copy",
|
|
163
|
+
onClick: () => c(a),
|
|
164
|
+
children: /* @__PURE__ */ d(l, {
|
|
165
|
+
size: 12,
|
|
166
|
+
strokeWidth: 2,
|
|
167
|
+
"aria-hidden": !0
|
|
168
|
+
})
|
|
169
|
+
}),
|
|
170
|
+
/* @__PURE__ */ d("pre", {
|
|
171
|
+
...o,
|
|
172
|
+
className: O.pre,
|
|
173
|
+
children: /* @__PURE__ */ d("code", { children: i ?? a })
|
|
174
|
+
})
|
|
175
|
+
]
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
M.displayName = "Code.Block";
|
|
179
|
+
//#endregion
|
|
180
|
+
//#region src/components/code/code.meta.ts
|
|
181
|
+
var N = {
|
|
182
|
+
name: "Code",
|
|
183
|
+
category: n.display,
|
|
184
|
+
status: "stable",
|
|
185
|
+
namespace: !0,
|
|
186
|
+
description: "Displays source code — Code.Inline for a fragment in running text, Code.Block for a fenced block with an optional language label and copy button. Also called a code snippet or code block.",
|
|
187
|
+
origin: "native"
|
|
188
|
+
};
|
|
189
|
+
//#endregion
|
|
190
|
+
export { k as a, T as c, S as d, j as i, w as l, M as n, D as o, A as r, E as s, N as t, C as u };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Token } from '../tokens/types';
|
|
2
|
+
/** Render `token-controls.gen.css` — every non-font token's `:root` declarations, in registry order. */
|
|
3
|
+
export declare function renderColorTokensCss(registry?: readonly Token[]): string;
|
|
4
|
+
/** Render `font-families.gen.css` — the `--imf-ui-font-family-*` tokens, base stacks and aliases. */
|
|
5
|
+
export declare function renderFontTokensCss(registry?: readonly Token[]): string;
|
|
6
|
+
export declare function writeTokenCss(): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
type RootProps = React.HTMLAttributes<HTMLDivElement>;
|
|
2
|
+
/**
|
|
3
|
+
* AppShell — application layout shell.
|
|
4
|
+
*
|
|
5
|
+
* The classic dashboard frame: a fixed header, collapsible navbar/aside
|
|
6
|
+
* sidebars, an optional footer, and a scrolling main content area. Also called
|
|
7
|
+
* an app layout, application frame, dashboard shell, or sidebar layout.
|
|
8
|
+
*
|
|
9
|
+
* Composed of seven sub-components used with dot-notation: `AppShell.Root` wraps
|
|
10
|
+
* `AppShell.Header`, `AppShell.Navbar`, `AppShell.Aside`, `AppShell.Footer`,
|
|
11
|
+
* `AppShell.Main`, and (inside a sidebar) `AppShell.Section`.
|
|
12
|
+
*
|
|
13
|
+
* Sizing is CSS-driven — override the `--imf-ui-appshell-*` custom properties
|
|
14
|
+
* rather than passing dimension props. Below the responsive breakpoints the
|
|
15
|
+
* navbar (`md`) and aside (`lg`) become sliding overlays toggled via the `open`
|
|
16
|
+
* prop; the consumer wires that to a burger button.
|
|
17
|
+
*
|
|
18
|
+
* Copied and adapted from Mantine's AppShell; no upstream runtime dependency.
|
|
19
|
+
* MIT licensed (see Mantine repo).
|
|
20
|
+
*
|
|
21
|
+
* @see https://mantine.dev/llms/core-app-shell.md
|
|
22
|
+
*/
|
|
23
|
+
declare function Root({ className, ...props }: RootProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
declare namespace Root {
|
|
25
|
+
var displayName: string;
|
|
26
|
+
}
|
|
27
|
+
type HeaderProps = React.HTMLAttributes<HTMLElement>;
|
|
28
|
+
declare function Header({ className, ...props }: HeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
declare namespace Header {
|
|
30
|
+
var displayName: string;
|
|
31
|
+
}
|
|
32
|
+
type NavbarProps = React.HTMLAttributes<HTMLElement> & {
|
|
33
|
+
/** Whether the mobile overlay is open. Ignored above the `md` breakpoint, where the navbar is always visible. */
|
|
34
|
+
open?: boolean;
|
|
35
|
+
};
|
|
36
|
+
declare function Navbar({ className, open, ...props }: NavbarProps): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
declare namespace Navbar {
|
|
38
|
+
var displayName: string;
|
|
39
|
+
}
|
|
40
|
+
type AsideProps = React.HTMLAttributes<HTMLElement> & {
|
|
41
|
+
/** Whether the mobile overlay is open. Ignored above the `lg` breakpoint, where the aside is always visible. */
|
|
42
|
+
open?: boolean;
|
|
43
|
+
};
|
|
44
|
+
declare function Aside({ className, open, ...props }: AsideProps): import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
declare namespace Aside {
|
|
46
|
+
var displayName: string;
|
|
47
|
+
}
|
|
48
|
+
type FooterProps = React.HTMLAttributes<HTMLElement>;
|
|
49
|
+
declare function Footer({ className, ...props }: FooterProps): import("react/jsx-runtime").JSX.Element;
|
|
50
|
+
declare namespace Footer {
|
|
51
|
+
var displayName: string;
|
|
52
|
+
}
|
|
53
|
+
type MainProps = React.HTMLAttributes<HTMLElement>;
|
|
54
|
+
declare function Main({ className, ...props }: MainProps): import("react/jsx-runtime").JSX.Element;
|
|
55
|
+
declare namespace Main {
|
|
56
|
+
var displayName: string;
|
|
57
|
+
}
|
|
58
|
+
type SectionProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
59
|
+
/** If set, the section expands to fill the remaining space in its sidebar. */
|
|
60
|
+
grow?: boolean;
|
|
61
|
+
};
|
|
62
|
+
declare function Section({ className, grow, ...props }: SectionProps): import("react/jsx-runtime").JSX.Element;
|
|
63
|
+
declare namespace Section {
|
|
64
|
+
var displayName: string;
|
|
65
|
+
}
|
|
66
|
+
export { Root, Header, Navbar, Aside, Footer, Main, Section };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Button as ButtonPrimitive } from '@base-ui/react/button';
|
|
2
|
+
import { VariantProps } from 'class-variance-authority';
|
|
3
|
+
declare const button: (props?: ({
|
|
4
|
+
variant?: "primary" | "secondary" | "positive" | "negative" | "outline" | "ghost" | null | undefined;
|
|
5
|
+
size?: "sm" | "md" | "lg" | "hero" | null | undefined;
|
|
6
|
+
chamfer?: boolean | null | undefined;
|
|
7
|
+
radius?: "sm" | "md" | "lg" | "none" | "round" | null | undefined;
|
|
8
|
+
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
9
|
+
type UpstreamButton = React.ComponentProps<typeof ButtonPrimitive>;
|
|
10
|
+
type Props = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "className" | "style"> & VariantProps<typeof button> & {
|
|
11
|
+
/** @default false */
|
|
12
|
+
focusableWhenDisabled?: boolean;
|
|
13
|
+
/** @default true */
|
|
14
|
+
nativeButton?: boolean;
|
|
15
|
+
/** Leading slot — typically a label. When present, the label aligns right and the icon pins left. */
|
|
16
|
+
startIcon?: React.ReactNode;
|
|
17
|
+
/** Trailing slot — typically an icon. When present, the label aligns left and the icon pins right. */
|
|
18
|
+
endIcon?: React.ReactNode;
|
|
19
|
+
className?: UpstreamButton["className"];
|
|
20
|
+
style?: UpstreamButton["style"];
|
|
21
|
+
render?: UpstreamButton["render"];
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Button component
|
|
25
|
+
*
|
|
26
|
+
* @doc https://base-ui.com/react/components/button
|
|
27
|
+
* @llm https://base-ui.com/react/components/button.md
|
|
28
|
+
*/
|
|
29
|
+
export declare function Button({ variant, size, chamfer, radius, className, startIcon, endIcon, children, ...props }: Props): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { VariantProps } from 'class-variance-authority';
|
|
2
|
+
declare const root: (props?: ({
|
|
3
|
+
variant?: "positive" | "negative" | "warning" | "info" | "accent-1" | "accent-2" | "accent-3" | null | undefined;
|
|
4
|
+
maxWidth?: "sm" | "md" | "lg" | "full" | null | undefined;
|
|
5
|
+
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
6
|
+
type RootProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof root>;
|
|
7
|
+
/**
|
|
8
|
+
* Callout.Root — the banner container. Sets the `variant` (which tints the
|
|
9
|
+
* surface and colours the icon and text) and lays out a leading `Callout.Icon`
|
|
10
|
+
* beside a text region of `Callout.Title` / `Callout.Description`. `maxWidth`
|
|
11
|
+
* caps the banner so it reads as a block region rather than stretching full
|
|
12
|
+
* container width. A persistent element in the content flow — not a transient
|
|
13
|
+
* Toast, not a modal Alert Dialog.
|
|
14
|
+
*/
|
|
15
|
+
declare function Root({ variant, maxWidth, className, children, ...props }: RootProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
declare namespace Root {
|
|
17
|
+
var displayName: string;
|
|
18
|
+
}
|
|
19
|
+
type IconProps = React.HTMLAttributes<HTMLSpanElement>;
|
|
20
|
+
/**
|
|
21
|
+
* Callout.Icon — the leading status glyph. With no children it renders the
|
|
22
|
+
* variant's default lucide icon; pass a custom icon as children to override.
|
|
23
|
+
* `aria-hidden` (the variant is conveyed by copy, not the glyph) and inherits
|
|
24
|
+
* the status colour via `currentColor`.
|
|
25
|
+
*/
|
|
26
|
+
declare function Icon({ className, children, ...props }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
declare namespace Icon {
|
|
28
|
+
var displayName: string;
|
|
29
|
+
}
|
|
30
|
+
type TitleProps = React.HTMLAttributes<HTMLDivElement>;
|
|
31
|
+
/** Callout.Title — an optional short heading, set in the semi-mono UPPERCASE technical voice. */
|
|
32
|
+
declare function Title({ className, ...props }: TitleProps): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
declare namespace Title {
|
|
34
|
+
var displayName: string;
|
|
35
|
+
}
|
|
36
|
+
type DescriptionProps = React.HTMLAttributes<HTMLDivElement>;
|
|
37
|
+
/** Callout.Description — the message body, set in the editorial (grotesk) body voice. */
|
|
38
|
+
declare function Description({ className, ...props }: DescriptionProps): import("react/jsx-runtime").JSX.Element;
|
|
39
|
+
declare namespace Description {
|
|
40
|
+
var displayName: string;
|
|
41
|
+
}
|
|
42
|
+
export { Root, Icon, Title, Description };
|