decantr 0.9.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/AGENTS.md +868 -0
- package/CHANGELOG.md +255 -0
- package/CLAUDE.md +178 -0
- package/LICENSE +21 -0
- package/README.md +229 -0
- package/cli/art.js +127 -0
- package/cli/commands/a11y.js +61 -0
- package/cli/commands/audit.js +225 -0
- package/cli/commands/build.js +38 -0
- package/cli/commands/dev.js +18 -0
- package/cli/commands/doctor.js +197 -0
- package/cli/commands/figma-sync.js +48 -0
- package/cli/commands/figma-tokens.js +55 -0
- package/cli/commands/generate.js +26 -0
- package/cli/commands/init.js +116 -0
- package/cli/commands/lint.js +209 -0
- package/cli/commands/mcp.js +530 -0
- package/cli/commands/migrate.js +175 -0
- package/cli/commands/test.js +38 -0
- package/cli/commands/validate.js +354 -0
- package/cli/index.js +113 -0
- package/package.json +95 -0
- package/reference/atoms.md +517 -0
- package/reference/behaviors.md +384 -0
- package/reference/build-tooling.md +275 -0
- package/reference/color-guidelines.md +965 -0
- package/reference/component-lifecycle.md +137 -0
- package/reference/compound-spacing.md +95 -0
- package/reference/decantation-process.md +499 -0
- package/reference/dev-server-routes.md +93 -0
- package/reference/form-system.md +253 -0
- package/reference/i18n.md +336 -0
- package/reference/icons.md +576 -0
- package/reference/llm-primer.md +953 -0
- package/reference/plugins.md +252 -0
- package/reference/registry-consumption.md +76 -0
- package/reference/router.md +217 -0
- package/reference/shells.md +116 -0
- package/reference/spatial-guidelines.md +541 -0
- package/reference/ssr.md +234 -0
- package/reference/state-data.md +215 -0
- package/reference/state-patterns.md +166 -0
- package/reference/state.md +194 -0
- package/reference/style-system.md +110 -0
- package/reference/tokens.md +460 -0
- package/src/app.js +19 -0
- package/src/chart/_animate.js +266 -0
- package/src/chart/_base.js +109 -0
- package/src/chart/_data.js +209 -0
- package/src/chart/_format.js +106 -0
- package/src/chart/_interact.js +364 -0
- package/src/chart/_palette.js +105 -0
- package/src/chart/_renderer.js +52 -0
- package/src/chart/_scene.js +262 -0
- package/src/chart/_shared.js +371 -0
- package/src/chart/index.js +637 -0
- package/src/chart/layouts/_layout-base.js +328 -0
- package/src/chart/layouts/cartesian.js +148 -0
- package/src/chart/layouts/hierarchy.js +562 -0
- package/src/chart/layouts/polar.js +101 -0
- package/src/chart/renderers/canvas.js +179 -0
- package/src/chart/renderers/svg.js +256 -0
- package/src/chart/renderers/webgpu.js +715 -0
- package/src/chart/types/_type-base.js +26 -0
- package/src/chart/types/area.js +134 -0
- package/src/chart/types/bar.js +173 -0
- package/src/chart/types/box-plot.js +125 -0
- package/src/chart/types/bubble.js +63 -0
- package/src/chart/types/candlestick.js +115 -0
- package/src/chart/types/chord.js +85 -0
- package/src/chart/types/combination.js +108 -0
- package/src/chart/types/funnel.js +68 -0
- package/src/chart/types/gauge.js +163 -0
- package/src/chart/types/heatmap.js +98 -0
- package/src/chart/types/histogram.js +71 -0
- package/src/chart/types/line.js +111 -0
- package/src/chart/types/org-chart.js +93 -0
- package/src/chart/types/pie.js +81 -0
- package/src/chart/types/radar.js +96 -0
- package/src/chart/types/radial.js +68 -0
- package/src/chart/types/range-area.js +55 -0
- package/src/chart/types/range-bar.js +61 -0
- package/src/chart/types/sankey.js +73 -0
- package/src/chart/types/scatter.js +66 -0
- package/src/chart/types/sparkline.js +81 -0
- package/src/chart/types/sunburst.js +69 -0
- package/src/chart/types/swimlane.js +88 -0
- package/src/chart/types/treemap.js +62 -0
- package/src/chart/types/waterfall.js +100 -0
- package/src/components/_base.js +1658 -0
- package/src/components/_behaviors.js +1140 -0
- package/src/components/_primitives.js +534 -0
- package/src/components/_qr-encoder.js +539 -0
- package/src/components/accordion.js +207 -0
- package/src/components/affix.js +62 -0
- package/src/components/alert-dialog.js +75 -0
- package/src/components/alert.js +47 -0
- package/src/components/aspect-ratio.js +24 -0
- package/src/components/avatar-group.js +55 -0
- package/src/components/avatar.js +38 -0
- package/src/components/back-top.js +75 -0
- package/src/components/badge.js +74 -0
- package/src/components/banner.js +68 -0
- package/src/components/breadcrumb.js +162 -0
- package/src/components/button.js +115 -0
- package/src/components/calendar.js +131 -0
- package/src/components/card.js +192 -0
- package/src/components/carousel.js +98 -0
- package/src/components/cascader.js +261 -0
- package/src/components/checkbox.js +80 -0
- package/src/components/chip.js +81 -0
- package/src/components/code-block.js +82 -0
- package/src/components/collapsible.js +50 -0
- package/src/components/color-palette.js +438 -0
- package/src/components/color-picker.js +314 -0
- package/src/components/combobox.js +181 -0
- package/src/components/command.js +174 -0
- package/src/components/comment.js +206 -0
- package/src/components/context-menu.js +76 -0
- package/src/components/data-table.js +724 -0
- package/src/components/date-picker.js +217 -0
- package/src/components/date-range-picker.js +244 -0
- package/src/components/datetime-picker.js +271 -0
- package/src/components/descriptions.js +68 -0
- package/src/components/drawer.js +179 -0
- package/src/components/dropdown.js +88 -0
- package/src/components/empty.js +41 -0
- package/src/components/float-button.js +90 -0
- package/src/components/form.js +106 -0
- package/src/components/hover-card.js +49 -0
- package/src/components/icon.js +87 -0
- package/src/components/image.js +97 -0
- package/src/components/index.js +117 -0
- package/src/components/input-group.js +75 -0
- package/src/components/input-number.js +155 -0
- package/src/components/input-otp.js +178 -0
- package/src/components/input.js +91 -0
- package/src/components/kbd.js +36 -0
- package/src/components/label.js +25 -0
- package/src/components/list.js +118 -0
- package/src/components/masked-input.js +236 -0
- package/src/components/mentions.js +165 -0
- package/src/components/menu.js +259 -0
- package/src/components/message.js +80 -0
- package/src/components/modal.js +147 -0
- package/src/components/navigation-menu.js +166 -0
- package/src/components/notification.js +84 -0
- package/src/components/pagination.js +104 -0
- package/src/components/placeholder.js +132 -0
- package/src/components/popconfirm.js +70 -0
- package/src/components/popover.js +58 -0
- package/src/components/progress.js +61 -0
- package/src/components/qrcode.js +251 -0
- package/src/components/radiogroup.js +120 -0
- package/src/components/range-slider.js +176 -0
- package/src/components/rate.js +186 -0
- package/src/components/resizable.js +83 -0
- package/src/components/result.js +57 -0
- package/src/components/scroll-area.js +43 -0
- package/src/components/segmented.js +97 -0
- package/src/components/select.js +165 -0
- package/src/components/separator.js +31 -0
- package/src/components/shell.js +407 -0
- package/src/components/skeleton.js +39 -0
- package/src/components/slider.js +141 -0
- package/src/components/sortable-list.js +176 -0
- package/src/components/space.js +42 -0
- package/src/components/spinner.js +112 -0
- package/src/components/splitter.js +147 -0
- package/src/components/statistic.js +136 -0
- package/src/components/steps.js +99 -0
- package/src/components/switch.js +95 -0
- package/src/components/table.js +44 -0
- package/src/components/tabs.js +216 -0
- package/src/components/tag.js +115 -0
- package/src/components/textarea.js +82 -0
- package/src/components/time-picker.js +153 -0
- package/src/components/time-range-picker.js +170 -0
- package/src/components/timeline.js +226 -0
- package/src/components/toast.js +71 -0
- package/src/components/toggle.js +213 -0
- package/src/components/tooltip.js +57 -0
- package/src/components/tour.js +159 -0
- package/src/components/transfer.js +163 -0
- package/src/components/tree-select.js +274 -0
- package/src/components/tree.js +141 -0
- package/src/components/typography.js +136 -0
- package/src/components/upload.js +118 -0
- package/src/components/visually-hidden.js +20 -0
- package/src/components/watermark.js +124 -0
- package/src/core/index.js +539 -0
- package/src/core/lifecycle.js +69 -0
- package/src/css/atoms.js +651 -0
- package/src/css/components.js +940 -0
- package/src/css/derive.js +1296 -0
- package/src/css/index.js +265 -0
- package/src/css/runtime.js +268 -0
- package/src/css/styles/addons/bioluminescent.js +93 -0
- package/src/css/styles/addons/clay.js +70 -0
- package/src/css/styles/addons/clean.js +57 -0
- package/src/css/styles/addons/command-center.js +143 -0
- package/src/css/styles/addons/dopamine.js +83 -0
- package/src/css/styles/addons/editorial.js +80 -0
- package/src/css/styles/addons/glassmorphism.js +99 -0
- package/src/css/styles/addons/liquid-glass.js +105 -0
- package/src/css/styles/addons/prismatic.js +100 -0
- package/src/css/styles/addons/retro.js +63 -0
- package/src/css/styles/auradecantism.js +96 -0
- package/src/css/theme-registry.js +444 -0
- package/src/data/entity.js +281 -0
- package/src/data/index.js +13 -0
- package/src/data/persist.js +225 -0
- package/src/data/query.js +839 -0
- package/src/data/realtime.js +299 -0
- package/src/data/url.js +177 -0
- package/src/data/worker.js +134 -0
- package/src/explorer/archetypes.js +243 -0
- package/src/explorer/atoms.js +228 -0
- package/src/explorer/charts.js +497 -0
- package/src/explorer/components.js +129 -0
- package/src/explorer/foundations.js +949 -0
- package/src/explorer/icons.js +178 -0
- package/src/explorer/patterns.js +247 -0
- package/src/explorer/recipes.js +194 -0
- package/src/explorer/shared/pattern-examples.js +1337 -0
- package/src/explorer/shared/showcase-renderer.js +958 -0
- package/src/explorer/shared/spec-table.js +41 -0
- package/src/explorer/shared/usage-links.js +87 -0
- package/src/explorer/shell-config.js +10 -0
- package/src/explorer/shells.js +551 -0
- package/src/explorer/styles.js +161 -0
- package/src/explorer/tokens.js +262 -0
- package/src/explorer/tools.js +525 -0
- package/src/form/index.js +804 -0
- package/src/i18n/index.js +251 -0
- package/src/icons/essential.js +479 -0
- package/src/icons/index.js +53 -0
- package/src/plugins/index.js +282 -0
- package/src/registry/archetypes/content-site.json +71 -0
- package/src/registry/archetypes/docs-explorer.json +23 -0
- package/src/registry/archetypes/ecommerce.json +104 -0
- package/src/registry/archetypes/financial-dashboard.json +77 -0
- package/src/registry/archetypes/index.json +41 -0
- package/src/registry/archetypes/portfolio.json +82 -0
- package/src/registry/archetypes/recipe-community.json +159 -0
- package/src/registry/archetypes/saas-dashboard.json +86 -0
- package/src/registry/architect/cross-cutting.json +45 -0
- package/src/registry/architect/domains/ecommerce.json +294 -0
- package/src/registry/architect/domains/financial-services.json +302 -0
- package/src/registry/architect/index.json +26 -0
- package/src/registry/architect/traits.json +379 -0
- package/src/registry/atoms.json +16 -0
- package/src/registry/chart-showcase.json +160 -0
- package/src/registry/chart.json +136 -0
- package/src/registry/components.json +8616 -0
- package/src/registry/core.json +216 -0
- package/src/registry/css.json +319 -0
- package/src/registry/data.json +135 -0
- package/src/registry/foundations.json +11 -0
- package/src/registry/icons.json +463 -0
- package/src/registry/index.json +101 -0
- package/src/registry/patterns/activity-feed.json +37 -0
- package/src/registry/patterns/article-content.json +27 -0
- package/src/registry/patterns/auth-form.json +37 -0
- package/src/registry/patterns/author-card.json +20 -0
- package/src/registry/patterns/card-grid.json +127 -0
- package/src/registry/patterns/category-nav.json +26 -0
- package/src/registry/patterns/chart-grid.json +36 -0
- package/src/registry/patterns/chat-interface.json +37 -0
- package/src/registry/patterns/checklist-card.json +55 -0
- package/src/registry/patterns/comparison-panel.json +27 -0
- package/src/registry/patterns/component-showcase.json +24 -0
- package/src/registry/patterns/contact-form.json +31 -0
- package/src/registry/patterns/cta-section.json +20 -0
- package/src/registry/patterns/data-table.json +37 -0
- package/src/registry/patterns/detail-header.json +83 -0
- package/src/registry/patterns/detail-panel.json +27 -0
- package/src/registry/patterns/explorer-shell.json +22 -0
- package/src/registry/patterns/filter-bar.json +33 -0
- package/src/registry/patterns/filter-sidebar.json +27 -0
- package/src/registry/patterns/form-sections.json +110 -0
- package/src/registry/patterns/goal-tracker.json +27 -0
- package/src/registry/patterns/hero.json +107 -0
- package/src/registry/patterns/index.json +47 -0
- package/src/registry/patterns/kpi-grid.json +36 -0
- package/src/registry/patterns/media-gallery.json +20 -0
- package/src/registry/patterns/order-history.json +20 -0
- package/src/registry/patterns/pagination.json +19 -0
- package/src/registry/patterns/photo-to-recipe.json +36 -0
- package/src/registry/patterns/pipeline-tracker.json +28 -0
- package/src/registry/patterns/post-list.json +27 -0
- package/src/registry/patterns/pricing-table.json +32 -0
- package/src/registry/patterns/scorecard.json +28 -0
- package/src/registry/patterns/search-bar.json +20 -0
- package/src/registry/patterns/specimen-grid.json +19 -0
- package/src/registry/patterns/stat-card.json +55 -0
- package/src/registry/patterns/stats-bar.json +55 -0
- package/src/registry/patterns/steps-card.json +55 -0
- package/src/registry/patterns/table-of-contents.json +19 -0
- package/src/registry/patterns/testimonials.json +21 -0
- package/src/registry/patterns/timeline.json +27 -0
- package/src/registry/patterns/token-inspector.json +21 -0
- package/src/registry/patterns/wizard.json +27 -0
- package/src/registry/recipe-auradecantism.json +69 -0
- package/src/registry/recipe-clean.json +65 -0
- package/src/registry/recipe-command-center.json +78 -0
- package/src/registry/router.json +73 -0
- package/src/registry/schema/README.md +197 -0
- package/src/registry/skeletons.json +259 -0
- package/src/registry/state.json +137 -0
- package/src/registry/tokens.json +40 -0
- package/src/router/hash.js +17 -0
- package/src/router/history.js +18 -0
- package/src/router/index.js +598 -0
- package/src/ssr/index.js +922 -0
- package/src/state/arrays.js +181 -0
- package/src/state/devtools.js +647 -0
- package/src/state/index.js +498 -0
- package/src/state/middleware.js +288 -0
- package/src/state/scheduler.js +206 -0
- package/src/state/store.js +300 -0
- package/src/tags/index.js +19 -0
- package/src/tannins/auth.js +396 -0
- package/src/test/dom.js +352 -0
- package/src/test/index.js +62 -0
- package/src/test/state.js +306 -0
- package/tools/a11y-audit.js +487 -0
- package/tools/analyzer.js +315 -0
- package/tools/audit.js +706 -0
- package/tools/builder.js +1422 -0
- package/tools/css-extract.js +188 -0
- package/tools/dev-server.js +316 -0
- package/tools/dts-gen.js +1260 -0
- package/tools/figma-components.js +329 -0
- package/tools/figma-patterns.js +516 -0
- package/tools/figma-plugin/code.js +453 -0
- package/tools/figma-plugin/manifest.json +14 -0
- package/tools/figma-plugin/ui.html +268 -0
- package/tools/figma-render.js +293 -0
- package/tools/figma-tokens.js +712 -0
- package/tools/figma-upload.js +318 -0
- package/tools/generate.js +738 -0
- package/tools/icons.js +133 -0
- package/tools/init-templates.js +265 -0
- package/tools/install-hooks.sh +5 -0
- package/tools/migrations/0.5.0.js +53 -0
- package/tools/migrations/0.6.0.js +95 -0
- package/tools/minify.js +170 -0
- package/tools/pre-commit +4 -0
- package/tools/registry.js +662 -0
- package/tools/reset-playground.js +61 -0
- package/tools/starter-templates/content-site/app.js +49 -0
- package/tools/starter-templates/content-site/essence.js +19 -0
- package/tools/starter-templates/content-site/pages.js +31 -0
- package/tools/starter-templates/ecommerce/app.js +50 -0
- package/tools/starter-templates/ecommerce/essence.js +19 -0
- package/tools/starter-templates/ecommerce/pages.js +31 -0
- package/tools/starter-templates/landing-page/app.js +38 -0
- package/tools/starter-templates/landing-page/essence.js +18 -0
- package/tools/starter-templates/landing-page/pages.js +21 -0
- package/tools/starter-templates/portfolio/app.js +45 -0
- package/tools/starter-templates/portfolio/essence.js +19 -0
- package/tools/starter-templates/portfolio/pages.js +33 -0
- package/tools/starter-templates/saas-dashboard/app.js +70 -0
- package/tools/starter-templates/saas-dashboard/essence.js +19 -0
- package/tools/starter-templates/saas-dashboard/pages.js +31 -0
- package/tools/verify-pack.js +203 -0
- package/types/chart.d.ts +77 -0
- package/types/components.d.ts +587 -0
- package/types/core.d.ts +89 -0
- package/types/css.d.ts +149 -0
- package/types/data.d.ts +238 -0
- package/types/form.d.ts +164 -0
- package/types/i18n.d.ts +51 -0
- package/types/icons.d.ts +27 -0
- package/types/index.d.ts +13 -0
- package/types/router.d.ts +116 -0
- package/types/ssr.d.ts +102 -0
- package/types/state.d.ts +83 -0
- package/types/tags.d.ts +62 -0
- package/types/tannins.d.ts +63 -0
- package/types/test.d.ts +48 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icon data registry — internal API for icon path lookup.
|
|
3
|
+
* Essential icons (~50) are always available.
|
|
4
|
+
* Additional icons added via registerIcon() or bulk-imported via tools/icons.js.
|
|
5
|
+
*/
|
|
6
|
+
import { ESSENTIAL } from './essential.js';
|
|
7
|
+
|
|
8
|
+
const icons = new Map(Object.entries(ESSENTIAL));
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Get SVG inner content for an icon by name.
|
|
12
|
+
* @param {string} name - Icon name (kebab-case)
|
|
13
|
+
* @returns {string|null}
|
|
14
|
+
*/
|
|
15
|
+
export function getIconPath(name) {
|
|
16
|
+
return icons.get(name) || null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Register a custom icon (or override an existing one).
|
|
21
|
+
* @param {string} name - Icon name
|
|
22
|
+
* @param {string} pathData - SVG inner content (e.g. '<path d="..."/>')
|
|
23
|
+
*/
|
|
24
|
+
export function registerIcon(name, pathData) {
|
|
25
|
+
icons.set(name, pathData);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Register multiple icons at once.
|
|
30
|
+
* @param {Object<string, string>} iconMap - { name: svgInnerContent }
|
|
31
|
+
*/
|
|
32
|
+
export function registerIcons(iconMap) {
|
|
33
|
+
for (const [k, v] of Object.entries(iconMap)) {
|
|
34
|
+
icons.set(k, v);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Check if an icon is available.
|
|
40
|
+
* @param {string} name
|
|
41
|
+
* @returns {boolean}
|
|
42
|
+
*/
|
|
43
|
+
export function hasIcon(name) {
|
|
44
|
+
return icons.has(name);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Get all currently available icon names.
|
|
49
|
+
* @returns {string[]}
|
|
50
|
+
*/
|
|
51
|
+
export function getIconNames() {
|
|
52
|
+
return [...icons.keys()];
|
|
53
|
+
}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decantr Plugin System
|
|
3
|
+
*
|
|
4
|
+
* Allows users to extend Decantr without forking. Plugins can register
|
|
5
|
+
* styles, patterns, recipes, and hook into build/dev/generate lifecycle.
|
|
6
|
+
*
|
|
7
|
+
* Plugin format in decantr.config.json:
|
|
8
|
+
* "plugins": [
|
|
9
|
+
* "@acme/decantr-plugin-auth",
|
|
10
|
+
* ["./plugins/custom-style.js", { "theme": "corporate" }]
|
|
11
|
+
* ]
|
|
12
|
+
*
|
|
13
|
+
* Each plugin exports a default function:
|
|
14
|
+
* export default function(api, options) { ... }
|
|
15
|
+
*
|
|
16
|
+
* Zero third-party dependencies (the Decantr Way).
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { resolve, isAbsolute } from 'node:path';
|
|
20
|
+
import { pathToFileURL } from 'node:url';
|
|
21
|
+
|
|
22
|
+
// ============================================================
|
|
23
|
+
// Internal state
|
|
24
|
+
// ============================================================
|
|
25
|
+
|
|
26
|
+
/** @type {Array<{ name: string, hooks: Map<string, Function[]> }>} */
|
|
27
|
+
const loadedPlugins = [];
|
|
28
|
+
|
|
29
|
+
/** Registry extensions contributed by plugins */
|
|
30
|
+
const extensions = {
|
|
31
|
+
/** @type {Map<string, object>} */
|
|
32
|
+
styles: new Map(),
|
|
33
|
+
/** @type {Map<string, object>} */
|
|
34
|
+
patterns: new Map(),
|
|
35
|
+
/** @type {Map<string, object>} */
|
|
36
|
+
recipes: new Map(),
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/** Valid hook names — kept small and explicit */
|
|
40
|
+
const VALID_HOOKS = new Set([
|
|
41
|
+
'onBuild',
|
|
42
|
+
'onDev',
|
|
43
|
+
'onGenerate',
|
|
44
|
+
'registerStyle',
|
|
45
|
+
'registerPattern',
|
|
46
|
+
'registerRecipe',
|
|
47
|
+
]);
|
|
48
|
+
|
|
49
|
+
// ============================================================
|
|
50
|
+
// Plugin API (passed to each plugin function)
|
|
51
|
+
// ============================================================
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Creates a sandboxed API object for a single plugin.
|
|
55
|
+
* @param {string} pluginName
|
|
56
|
+
* @param {Map<string, Function[]>} hooks
|
|
57
|
+
* @returns {object}
|
|
58
|
+
*/
|
|
59
|
+
function createPluginAPI(pluginName, hooks) {
|
|
60
|
+
return {
|
|
61
|
+
/**
|
|
62
|
+
* Register a lifecycle hook.
|
|
63
|
+
* @param {'onBuild'|'onDev'|'onGenerate'} hookName
|
|
64
|
+
* @param {Function} fn
|
|
65
|
+
*/
|
|
66
|
+
onBuild(fn) {
|
|
67
|
+
if (typeof fn !== 'function') throw new Error(`[decantr:plugin:${pluginName}] onBuild handler must be a function`);
|
|
68
|
+
if (!hooks.has('onBuild')) hooks.set('onBuild', []);
|
|
69
|
+
hooks.get('onBuild').push(fn);
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
onDev(fn) {
|
|
73
|
+
if (typeof fn !== 'function') throw new Error(`[decantr:plugin:${pluginName}] onDev handler must be a function`);
|
|
74
|
+
if (!hooks.has('onDev')) hooks.set('onDev', []);
|
|
75
|
+
hooks.get('onDev').push(fn);
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
onGenerate(fn) {
|
|
79
|
+
if (typeof fn !== 'function') throw new Error(`[decantr:plugin:${pluginName}] onGenerate handler must be a function`);
|
|
80
|
+
if (!hooks.has('onGenerate')) hooks.set('onGenerate', []);
|
|
81
|
+
hooks.get('onGenerate').push(fn);
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Register a custom style (theme).
|
|
86
|
+
* @param {string} id - Style identifier (e.g. "corporate")
|
|
87
|
+
* @param {object} def - Style definition: { name, seed, personality?, overrides? }
|
|
88
|
+
*/
|
|
89
|
+
registerStyle(id, def) {
|
|
90
|
+
if (!id || typeof id !== 'string') throw new Error(`[decantr:plugin:${pluginName}] registerStyle requires a string id`);
|
|
91
|
+
if (!def || typeof def !== 'object') throw new Error(`[decantr:plugin:${pluginName}] registerStyle requires a definition object`);
|
|
92
|
+
if (!def.name) def.name = id;
|
|
93
|
+
if (!def.seed) throw new Error(`[decantr:plugin:${pluginName}] Style "${id}" must have seed colors`);
|
|
94
|
+
const style = { id, ...def };
|
|
95
|
+
extensions.styles.set(id, style);
|
|
96
|
+
|
|
97
|
+
// Also register via the hook mechanism so runHook('registerStyle') can propagate
|
|
98
|
+
if (!hooks.has('registerStyle')) hooks.set('registerStyle', []);
|
|
99
|
+
hooks.get('registerStyle').push(() => style);
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Register a custom pattern.
|
|
104
|
+
* @param {string} id - Pattern identifier (e.g. "ticket-board")
|
|
105
|
+
* @param {object} def - Pattern definition: { name, description?, blend?, atoms? }
|
|
106
|
+
*/
|
|
107
|
+
registerPattern(id, def) {
|
|
108
|
+
if (!id || typeof id !== 'string') throw new Error(`[decantr:plugin:${pluginName}] registerPattern requires a string id`);
|
|
109
|
+
if (!def || typeof def !== 'object') throw new Error(`[decantr:plugin:${pluginName}] registerPattern requires a definition object`);
|
|
110
|
+
if (!def.name) def.name = id;
|
|
111
|
+
extensions.patterns.set(id, { id, ...def });
|
|
112
|
+
|
|
113
|
+
if (!hooks.has('registerPattern')) hooks.set('registerPattern', []);
|
|
114
|
+
hooks.get('registerPattern').push(() => ({ id, ...def }));
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Register a custom recipe (visual language overlay).
|
|
119
|
+
* @param {string} id - Recipe identifier (e.g. "brutalist")
|
|
120
|
+
* @param {object} def - Recipe definition: { name, style, mode?, description?, decorators?, compositions? }
|
|
121
|
+
*/
|
|
122
|
+
registerRecipe(id, def) {
|
|
123
|
+
if (!id || typeof id !== 'string') throw new Error(`[decantr:plugin:${pluginName}] registerRecipe requires a string id`);
|
|
124
|
+
if (!def || typeof def !== 'object') throw new Error(`[decantr:plugin:${pluginName}] registerRecipe requires a definition object`);
|
|
125
|
+
if (!def.name) def.name = id;
|
|
126
|
+
extensions.recipes.set(id, { id, ...def });
|
|
127
|
+
|
|
128
|
+
if (!hooks.has('registerRecipe')) hooks.set('registerRecipe', []);
|
|
129
|
+
hooks.get('registerRecipe').push(() => ({ id, ...def }));
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// ============================================================
|
|
135
|
+
// Public API
|
|
136
|
+
// ============================================================
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Load all plugins declared in config.plugins.
|
|
140
|
+
*
|
|
141
|
+
* Each entry is either:
|
|
142
|
+
* - A string (bare module specifier or relative path)
|
|
143
|
+
* - A [specifier, options] tuple
|
|
144
|
+
*
|
|
145
|
+
* @param {object} config - The full decantr.config.json object
|
|
146
|
+
* @param {object} [opts]
|
|
147
|
+
* @param {string} [opts.cwd] - Working directory for resolving relative paths
|
|
148
|
+
* @returns {Promise<void>}
|
|
149
|
+
*/
|
|
150
|
+
export async function loadPlugins(config, opts = {}) {
|
|
151
|
+
const cwd = opts.cwd || process.cwd();
|
|
152
|
+
const entries = config?.plugins;
|
|
153
|
+
|
|
154
|
+
if (!entries || !Array.isArray(entries) || entries.length === 0) return;
|
|
155
|
+
|
|
156
|
+
for (const entry of entries) {
|
|
157
|
+
let specifier, options;
|
|
158
|
+
|
|
159
|
+
if (typeof entry === 'string') {
|
|
160
|
+
specifier = entry;
|
|
161
|
+
options = {};
|
|
162
|
+
} else if (Array.isArray(entry) && entry.length >= 1) {
|
|
163
|
+
specifier = entry[0];
|
|
164
|
+
options = entry[1] || {};
|
|
165
|
+
} else {
|
|
166
|
+
console.warn(`[decantr] Invalid plugin entry — skipping: ${JSON.stringify(entry)}`);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (typeof specifier !== 'string') {
|
|
171
|
+
console.warn(`[decantr] Plugin specifier must be a string — skipping: ${JSON.stringify(entry)}`);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Derive a human-readable name
|
|
176
|
+
const pluginName = specifier.startsWith('.') ? specifier : specifier.replace(/^@[^/]+\//, '');
|
|
177
|
+
|
|
178
|
+
try {
|
|
179
|
+
// Resolve the module
|
|
180
|
+
let mod;
|
|
181
|
+
if (specifier.startsWith('.') || isAbsolute(specifier)) {
|
|
182
|
+
// Relative or absolute path — resolve against cwd
|
|
183
|
+
const fullPath = resolve(cwd, specifier);
|
|
184
|
+
mod = await import(pathToFileURL(fullPath).href);
|
|
185
|
+
} else {
|
|
186
|
+
// Bare specifier — let Node resolution handle it (node_modules)
|
|
187
|
+
mod = await import(specifier);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const pluginFn = mod.default || mod;
|
|
191
|
+
|
|
192
|
+
if (typeof pluginFn !== 'function') {
|
|
193
|
+
console.warn(`[decantr] Plugin "${pluginName}" does not export a function — skipping`);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Create isolated hooks map and API for this plugin
|
|
198
|
+
const hooks = new Map();
|
|
199
|
+
const api = createPluginAPI(pluginName, hooks);
|
|
200
|
+
|
|
201
|
+
// Execute the plugin setup function
|
|
202
|
+
await pluginFn(api, options);
|
|
203
|
+
|
|
204
|
+
loadedPlugins.push({ name: pluginName, hooks });
|
|
205
|
+
} catch (err) {
|
|
206
|
+
console.error(`[decantr] Failed to load plugin "${pluginName}": ${err.message}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Run a named hook across all loaded plugins, in registration order.
|
|
213
|
+
*
|
|
214
|
+
* @param {string} hookName - One of: onBuild, onDev, onGenerate, registerStyle, registerPattern, registerRecipe
|
|
215
|
+
* @param {object} [context] - Hook-specific context object passed to each handler
|
|
216
|
+
* @returns {Promise<any[]>} - Array of results from each hook handler
|
|
217
|
+
*/
|
|
218
|
+
export async function runHook(hookName, context = {}) {
|
|
219
|
+
if (!VALID_HOOKS.has(hookName)) {
|
|
220
|
+
throw new Error(`[decantr] Unknown plugin hook: "${hookName}". Valid hooks: ${[...VALID_HOOKS].join(', ')}`);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const results = [];
|
|
224
|
+
|
|
225
|
+
for (const plugin of loadedPlugins) {
|
|
226
|
+
const handlers = plugin.hooks.get(hookName);
|
|
227
|
+
if (!handlers) continue;
|
|
228
|
+
|
|
229
|
+
for (const handler of handlers) {
|
|
230
|
+
try {
|
|
231
|
+
const result = await handler(context);
|
|
232
|
+
if (result !== undefined) results.push(result);
|
|
233
|
+
} catch (err) {
|
|
234
|
+
console.error(`[decantr] Plugin "${plugin.name}" hook "${hookName}" threw: ${err.message}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return results;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Get all plugin-registered styles.
|
|
244
|
+
* @returns {Map<string, object>}
|
|
245
|
+
*/
|
|
246
|
+
export function getPluginStyles() {
|
|
247
|
+
return new Map(extensions.styles);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Get all plugin-registered patterns.
|
|
252
|
+
* @returns {Map<string, object>}
|
|
253
|
+
*/
|
|
254
|
+
export function getPluginPatterns() {
|
|
255
|
+
return new Map(extensions.patterns);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Get all plugin-registered recipes.
|
|
260
|
+
* @returns {Map<string, object>}
|
|
261
|
+
*/
|
|
262
|
+
export function getPluginRecipes() {
|
|
263
|
+
return new Map(extensions.recipes);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Get the list of loaded plugin names.
|
|
268
|
+
* @returns {string[]}
|
|
269
|
+
*/
|
|
270
|
+
export function getLoadedPlugins() {
|
|
271
|
+
return loadedPlugins.map(p => p.name);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Reset all plugin state. Primarily for testing.
|
|
276
|
+
*/
|
|
277
|
+
export function resetPlugins() {
|
|
278
|
+
loadedPlugins.length = 0;
|
|
279
|
+
extensions.styles.clear();
|
|
280
|
+
extensions.patterns.clear();
|
|
281
|
+
extensions.recipes.clear();
|
|
282
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://decantr.ai/schemas/archetype.v1.json",
|
|
3
|
+
"id": "content-site",
|
|
4
|
+
"name": "Content Site",
|
|
5
|
+
"description": "Blog, magazine, documentation, or knowledge base with articles, categories, and search.",
|
|
6
|
+
"pages": [
|
|
7
|
+
{
|
|
8
|
+
"id": "home",
|
|
9
|
+
"skeleton": "top-nav-main",
|
|
10
|
+
"patterns": ["hero", "post-list", "category-nav", "cta-section"],
|
|
11
|
+
"default_blend": [
|
|
12
|
+
"hero",
|
|
13
|
+
"category-nav",
|
|
14
|
+
"post-list",
|
|
15
|
+
"cta-section"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "category",
|
|
20
|
+
"skeleton": "top-nav-main",
|
|
21
|
+
"patterns": ["category-nav", "post-list", "pagination"],
|
|
22
|
+
"default_blend": [
|
|
23
|
+
"category-nav",
|
|
24
|
+
"post-list",
|
|
25
|
+
"pagination"
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "article",
|
|
30
|
+
"skeleton": "top-nav-main",
|
|
31
|
+
"patterns": ["article-content", "table-of-contents", "author-card", "post-list"],
|
|
32
|
+
"default_blend": [
|
|
33
|
+
{ "cols": ["article-content", "table-of-contents"], "span": { "article-content": 3 }, "at": "lg" },
|
|
34
|
+
"author-card",
|
|
35
|
+
"post-list"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "search",
|
|
40
|
+
"skeleton": "top-nav-main",
|
|
41
|
+
"patterns": ["search-bar", "post-list", "pagination"],
|
|
42
|
+
"default_blend": [
|
|
43
|
+
"search-bar",
|
|
44
|
+
"post-list",
|
|
45
|
+
"pagination"
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "about",
|
|
50
|
+
"skeleton": "top-nav-main",
|
|
51
|
+
"patterns": ["detail-header"],
|
|
52
|
+
"default_blend": [
|
|
53
|
+
"detail-header"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "contact",
|
|
58
|
+
"skeleton": "top-nav-main",
|
|
59
|
+
"patterns": ["contact-form"],
|
|
60
|
+
"default_blend": ["contact-form"]
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"tannins": ["search", "content-state", "categories", "analytics"],
|
|
64
|
+
"skeletons": {
|
|
65
|
+
"top-nav-main": "Horizontal navigation bar + full-width main content area"
|
|
66
|
+
},
|
|
67
|
+
"suggested_vintage": {
|
|
68
|
+
"styles": ["clean", "glassmorphism"],
|
|
69
|
+
"modes": ["light", "auto"]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://decantr.ai/schemas/archetype.v1.json",
|
|
3
|
+
"id": "docs-explorer",
|
|
4
|
+
"name": "Docs Explorer",
|
|
5
|
+
"description": "Interactive design-system and API documentation. 7-layer navigation (Foundations, Atoms, Tokens, Components, Patterns, Archetypes, Recipes) with registry-driven content, global search, live theming controls, and viewport simulation.",
|
|
6
|
+
"pages": [
|
|
7
|
+
{ "id": "components", "skeleton": "sidebar-main", "patterns": ["component-showcase"], "default_blend": ["component-showcase"] },
|
|
8
|
+
{ "id": "patterns", "skeleton": "sidebar-main", "patterns": ["detail-panel"], "default_blend": ["detail-panel"] },
|
|
9
|
+
{ "id": "archetypes", "skeleton": "sidebar-main", "patterns": ["detail-panel"], "default_blend": ["detail-panel"] },
|
|
10
|
+
{ "id": "recipes", "skeleton": "sidebar-main", "patterns": ["detail-panel"], "default_blend": ["detail-panel"] },
|
|
11
|
+
{ "id": "foundations", "skeleton": "sidebar-main", "patterns": ["detail-panel"], "default_blend": ["detail-panel"] },
|
|
12
|
+
{ "id": "atoms", "skeleton": "sidebar-main", "patterns": ["specimen-grid"], "default_blend": ["specimen-grid"] },
|
|
13
|
+
{ "id": "tokens", "skeleton": "sidebar-main", "patterns": ["token-inspector"], "default_blend": ["token-inspector"] }
|
|
14
|
+
],
|
|
15
|
+
"tannins": ["registry-data", "search", "theme-controls", "viewport-sim"],
|
|
16
|
+
"skeletons": {
|
|
17
|
+
"sidebar-main": "Explorer shell — persistent header with search trigger (Cmd+K), collapsible multi-layer sidebar with filter, scrollable main content, floating HUD for style/mode/shape/viewport switching"
|
|
18
|
+
},
|
|
19
|
+
"suggested_vintage": {
|
|
20
|
+
"styles": ["auradecantism", "clean", "command-center"],
|
|
21
|
+
"modes": ["dark", "auto"]
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://decantr.ai/schemas/archetype.v2.json",
|
|
3
|
+
"id": "ecommerce",
|
|
4
|
+
"name": "E-Commerce",
|
|
5
|
+
"description": "Online retail with product catalog, cart, checkout, and account management.",
|
|
6
|
+
"pages": [
|
|
7
|
+
{
|
|
8
|
+
"id": "home",
|
|
9
|
+
"skeleton": "top-nav-main",
|
|
10
|
+
"patterns": [
|
|
11
|
+
"hero",
|
|
12
|
+
{ "pattern": "card-grid", "preset": "product", "as": "product-grid" },
|
|
13
|
+
"category-nav",
|
|
14
|
+
"testimonials",
|
|
15
|
+
"cta-section"
|
|
16
|
+
],
|
|
17
|
+
"default_blend": [
|
|
18
|
+
"hero",
|
|
19
|
+
"category-nav",
|
|
20
|
+
{ "pattern": "card-grid", "preset": "product", "as": "product-grid" },
|
|
21
|
+
"testimonials",
|
|
22
|
+
"cta-section"
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "catalog",
|
|
27
|
+
"skeleton": "top-nav-main",
|
|
28
|
+
"patterns": [
|
|
29
|
+
"filter-sidebar",
|
|
30
|
+
{ "pattern": "card-grid", "preset": "product", "as": "product-grid" },
|
|
31
|
+
"filter-bar",
|
|
32
|
+
"pagination"
|
|
33
|
+
],
|
|
34
|
+
"default_blend": [
|
|
35
|
+
"filter-bar",
|
|
36
|
+
{ "cols": ["filter-sidebar", "product-grid"], "span": { "product-grid": 3 }, "at": "md" },
|
|
37
|
+
"pagination"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "product",
|
|
42
|
+
"skeleton": "top-nav-main",
|
|
43
|
+
"patterns": [
|
|
44
|
+
"media-gallery",
|
|
45
|
+
"detail-panel",
|
|
46
|
+
"testimonials",
|
|
47
|
+
{ "pattern": "card-grid", "preset": "product", "as": "product-grid" }
|
|
48
|
+
],
|
|
49
|
+
"default_blend": [
|
|
50
|
+
{ "cols": ["media-gallery", "detail-panel"], "at": "md" },
|
|
51
|
+
"testimonials",
|
|
52
|
+
{ "pattern": "card-grid", "preset": "product", "as": "product-grid" }
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "cart",
|
|
57
|
+
"skeleton": "top-nav-main",
|
|
58
|
+
"patterns": ["data-table", "pricing-table"],
|
|
59
|
+
"default_blend": [
|
|
60
|
+
{ "cols": ["data-table", "pricing-table"], "span": { "data-table": 2 }, "at": "md" }
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"id": "checkout",
|
|
65
|
+
"skeleton": "minimal-header",
|
|
66
|
+
"patterns": ["wizard"],
|
|
67
|
+
"default_blend": [
|
|
68
|
+
"wizard"
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "account",
|
|
73
|
+
"skeleton": "sidebar-main",
|
|
74
|
+
"patterns": ["form-sections", "order-history"],
|
|
75
|
+
"default_blend": [
|
|
76
|
+
"form-sections",
|
|
77
|
+
"order-history"
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "login",
|
|
82
|
+
"skeleton": "centered",
|
|
83
|
+
"patterns": ["auth-form"],
|
|
84
|
+
"default_blend": ["auth-form"]
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "register",
|
|
88
|
+
"skeleton": "centered",
|
|
89
|
+
"patterns": ["auth-form"],
|
|
90
|
+
"default_blend": ["auth-form"]
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
"tannins": ["auth", "cart-state", "search", "payments", "inventory", "wishlist"],
|
|
94
|
+
"skeletons": {
|
|
95
|
+
"top-nav-main": "Horizontal navigation bar + full-width main content area",
|
|
96
|
+
"sidebar-main": "Vertical sidebar navigation + main content area",
|
|
97
|
+
"minimal-header": "Slim header (logo + progress) + centered content",
|
|
98
|
+
"centered": "Centered card on background — for auth flows"
|
|
99
|
+
},
|
|
100
|
+
"suggested_vintage": {
|
|
101
|
+
"styles": ["clean", "glassmorphism", "auradecantism"],
|
|
102
|
+
"modes": ["light", "auto"]
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://decantr.ai/schemas/archetype.v1.json",
|
|
3
|
+
"id": "financial-dashboard",
|
|
4
|
+
"name": "Financial Dashboard",
|
|
5
|
+
"description": "Performance dashboard for financial services, lending, and banking. Portfolio overview with goal tracking, production monitoring, pipeline management, collections, and compliance.",
|
|
6
|
+
"extends": "saas-dashboard",
|
|
7
|
+
"pages": [
|
|
8
|
+
{
|
|
9
|
+
"id": "overview",
|
|
10
|
+
"skeleton": "sidebar-main",
|
|
11
|
+
"patterns": ["kpi-grid", "goal-tracker", "comparison-panel", "chart-grid"],
|
|
12
|
+
"default_blend": [
|
|
13
|
+
"kpi-grid",
|
|
14
|
+
{ "cols": ["goal-tracker", "comparison-panel"], "at": "lg" },
|
|
15
|
+
"chart-grid"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "production",
|
|
20
|
+
"skeleton": "sidebar-main",
|
|
21
|
+
"patterns": ["kpi-grid", "chart-grid", "data-table", "filter-bar"],
|
|
22
|
+
"default_blend": ["filter-bar", "kpi-grid", "chart-grid", "data-table"]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "pipeline",
|
|
26
|
+
"skeleton": "sidebar-main",
|
|
27
|
+
"patterns": ["pipeline-tracker", "filter-bar"],
|
|
28
|
+
"default_blend": ["filter-bar", "pipeline-tracker"]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "approvals",
|
|
32
|
+
"skeleton": "sidebar-main",
|
|
33
|
+
"patterns": ["chart-grid", "comparison-panel", "data-table", "filter-bar"],
|
|
34
|
+
"default_blend": [
|
|
35
|
+
"filter-bar",
|
|
36
|
+
{ "cols": ["chart-grid", "comparison-panel"], "at": "lg" },
|
|
37
|
+
"data-table"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "collections",
|
|
42
|
+
"skeleton": "sidebar-main",
|
|
43
|
+
"patterns": ["kpi-grid", "goal-tracker", "chart-grid", "data-table"],
|
|
44
|
+
"default_blend": ["kpi-grid", "goal-tracker", "chart-grid", "data-table"]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "outreach",
|
|
48
|
+
"skeleton": "sidebar-main",
|
|
49
|
+
"patterns": ["scorecard", "data-table", "activity-feed"],
|
|
50
|
+
"default_blend": ["scorecard", { "cols": ["data-table", "activity-feed"], "at": "lg" }]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "products",
|
|
54
|
+
"skeleton": "sidebar-main",
|
|
55
|
+
"patterns": ["data-table", "detail-panel"],
|
|
56
|
+
"default_blend": [{ "cols": ["data-table", "detail-panel"], "at": "md" }]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "scorecard",
|
|
60
|
+
"skeleton": "sidebar-main",
|
|
61
|
+
"patterns": ["scorecard", "goal-tracker"],
|
|
62
|
+
"default_blend": ["scorecard", "goal-tracker"]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "vendors",
|
|
66
|
+
"skeleton": "sidebar-main",
|
|
67
|
+
"patterns": ["data-table", "detail-panel", "form-sections"],
|
|
68
|
+
"default_blend": ["data-table", "detail-panel"]
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"tannins": ["portfolio-state", "pipeline-state", "compliance-state", "report-export"],
|
|
72
|
+
"skeletons": {},
|
|
73
|
+
"suggested_vintage": {
|
|
74
|
+
"styles": ["auradecantism", "command-center", "clean"],
|
|
75
|
+
"modes": ["dark", "auto"]
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://decantr.ai/schemas/archetypes.v1.json",
|
|
3
|
+
"description": "Domain archetypes for the Decantation Process. Each archetype pre-maps page patterns, tannins, skeleton layouts, and suggested visual identity for a domain. Archetypes may use \"extends\" to inherit pages, tannins, and skeletons from a parent archetype. Child pages override parent pages by id; tannins are concatenated and deduped; skeletons are shallow-merged. Circular inheritance and depth > 5 are rejected.",
|
|
4
|
+
"archetypes": {
|
|
5
|
+
"ecommerce": {
|
|
6
|
+
"name": "E-Commerce",
|
|
7
|
+
"description": "Online retail — product catalog, cart, checkout, account management",
|
|
8
|
+
"file": "ecommerce.json"
|
|
9
|
+
},
|
|
10
|
+
"saas-dashboard": {
|
|
11
|
+
"name": "SaaS Dashboard",
|
|
12
|
+
"description": "Analytics/admin dashboard — KPIs, data tables, charts, settings",
|
|
13
|
+
"file": "saas-dashboard.json"
|
|
14
|
+
},
|
|
15
|
+
"portfolio": {
|
|
16
|
+
"name": "Portfolio",
|
|
17
|
+
"description": "Personal or agency showcase — projects, about, contact, blog",
|
|
18
|
+
"file": "portfolio.json"
|
|
19
|
+
},
|
|
20
|
+
"content-site": {
|
|
21
|
+
"name": "Content Site",
|
|
22
|
+
"description": "Blog, magazine, or documentation — articles, categories, search",
|
|
23
|
+
"file": "content-site.json"
|
|
24
|
+
},
|
|
25
|
+
"docs-explorer": {
|
|
26
|
+
"name": "Docs Explorer",
|
|
27
|
+
"description": "Interactive API and design-system documentation — layered navigation, registry-driven content, search, live theming",
|
|
28
|
+
"file": "docs-explorer.json"
|
|
29
|
+
},
|
|
30
|
+
"financial-dashboard": {
|
|
31
|
+
"name": "Financial Dashboard",
|
|
32
|
+
"description": "Performance dashboard for financial services, lending, and banking — portfolio overview, pipeline, collections, compliance",
|
|
33
|
+
"file": "financial-dashboard.json"
|
|
34
|
+
},
|
|
35
|
+
"recipe-community": {
|
|
36
|
+
"name": "Recipe Community",
|
|
37
|
+
"description": "AI-powered recipe sharing platform — recipes, cookbooks, photo-to-recipe AI, chef chat, community feed",
|
|
38
|
+
"file": "recipe-community.json"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|