@birdapi/velinstyle 1.2.1 → 1.2.2

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.
Files changed (67) hide show
  1. package/README.de.md +134 -11
  2. package/README.md +139 -16
  3. package/cli/__fixtures__/atelier-library/showcases/01-login/app.css +1 -0
  4. package/cli/__fixtures__/atelier-library/showcases/01-login/app.js +2 -0
  5. package/cli/__fixtures__/atelier-library/showcases/01-login/index.html +5 -0
  6. package/cli/__fixtures__/atelier-library/showcases/04-pricing/app.css +1 -0
  7. package/cli/__fixtures__/atelier-library/showcases/04-pricing/app.js +2 -0
  8. package/cli/__fixtures__/atelier-library/showcases/04-pricing/index.html +5 -0
  9. package/cli/__fixtures__/atelier-library/showcases/36-calendar/app.css +1 -0
  10. package/cli/__fixtures__/atelier-library/showcases/36-calendar/app.js +2 -0
  11. package/cli/__fixtures__/atelier-library/showcases/36-calendar/index.html +5 -0
  12. package/cli/atelier-catalog.json +1267 -0
  13. package/cli/atelier-formats.js +159 -0
  14. package/cli/atelier.js +382 -0
  15. package/cli/blueprints/empty-state.html +3 -5
  16. package/cli/cli-manifest.json +23 -10
  17. package/cli/docgen/extract-cli.js +1 -1
  18. package/cli/index.js +149 -3
  19. package/cli/production/component-graph.json +166 -0
  20. package/cli/production/explain.js +52 -0
  21. package/cli/production/extract.js +238 -0
  22. package/cli/production/graph.js +102 -0
  23. package/cli/production/report.js +78 -0
  24. package/cli/production/run.js +312 -0
  25. package/cli/production/trim-css.js +177 -0
  26. package/cli/production/trim-fonts.js +23 -0
  27. package/cli/production/trim-icons.js +38 -0
  28. package/cli/production/trim-js.js +48 -0
  29. package/cli/production/trim-motion.js +22 -0
  30. package/cli/production/trim-themes.js +50 -0
  31. package/cli/production/watch.js +38 -0
  32. package/cli/review.js +48 -1
  33. package/cli/scripts/write-atelier-fixtures.mjs +33 -0
  34. package/components/index.js +3 -0
  35. package/components/runtime/component-loaders.js +3 -0
  36. package/components/velin-drawer.js +43 -4
  37. package/components/velin-empty-state.js +83 -0
  38. package/components/velin-modal.js +76 -15
  39. package/components/velin-otp-input.js +220 -0
  40. package/components/velin-password-strength.js +147 -0
  41. package/components/velin-sheet.js +49 -4
  42. package/core/a11y/component-contracts.json +23 -4
  43. package/core/meta/knowledge/components.json +75 -3
  44. package/dist/chunks/attributes-2ORR27KA.js +404 -0
  45. package/dist/chunks/chunk-Y6HN7HWX.js +116 -0
  46. package/dist/chunks/runtime-entry.js +1 -1
  47. package/dist/chunks/velin-drawer-A7Q7EBOS.js +162 -0
  48. package/dist/chunks/velin-empty-state-3NTUH2RF.js +81 -0
  49. package/dist/chunks/velin-modal-3MV4FYBK.js +231 -0
  50. package/dist/chunks/velin-otp-input-PSK42MM6.js +207 -0
  51. package/dist/chunks/velin-password-strength-TAXMLSED.js +136 -0
  52. package/dist/chunks/velin-sheet-N2VVYXFP.js +157 -0
  53. package/dist/llms.txt +3 -3
  54. package/dist/search-index.json +68 -5
  55. package/dist/velin-agent.json +283 -20
  56. package/dist/velinstyle-components.iife.js +2716 -2138
  57. package/dist/velinstyle-components.js +2772 -2190
  58. package/dist/velinstyle-components.min.js +254 -112
  59. package/dist/velinstyle.css +54 -6
  60. package/dist/velinstyle.d.ts +3 -0
  61. package/dist/velinstyle.min.css +1 -1
  62. package/package.json +143 -143
  63. package/packages/velinstyle-skills/catalog.json +1 -1
  64. package/src/components/data-table.css +19 -0
  65. package/src/components/empty-auth.css +33 -0
  66. package/src/components/table.css +16 -6
  67. package/src/velinstyle.css +1 -0
@@ -0,0 +1,157 @@
1
+ import {
2
+ SHADOW_A11Y_STYLES
3
+ } from "./chunk-F7OLHTGX.js";
4
+ import {
5
+ clearBackgroundInert,
6
+ getFocusableElements,
7
+ restoreFocus,
8
+ saveFocus,
9
+ setBackgroundInert,
10
+ trapFocus
11
+ } from "./chunk-42VVPW6N.js";
12
+
13
+ // components/velin-sheet.js
14
+ var styles = `
15
+ ${SHADOW_A11Y_STYLES}
16
+ :host { display: contents; }
17
+ .overlay {
18
+ position: fixed; inset: 0; z-index: var(--velin-z-overlay, 400);
19
+ background: var(--velin-color-overlay, rgba(0,0,0,0.4));
20
+ opacity: 0; visibility: hidden;
21
+ transition: opacity 200ms ease, visibility 200ms ease;
22
+ }
23
+ :host([open]) .overlay { opacity: 1; visibility: visible; }
24
+ .sheet {
25
+ position: fixed; inset-inline: 0; inset-block-end: 0;
26
+ z-index: var(--velin-z-modal, 500);
27
+ max-block-size: min(85vh, 32rem);
28
+ background: var(--velin-color-surface-bright, #fff);
29
+ border-radius: var(--velin-radius-lg, 0.75rem) var(--velin-radius-lg, 0.75rem) 0 0;
30
+ box-shadow: var(--velin-shadow-xl, 0 -4px 24px rgba(0,0,0,0.12));
31
+ display: flex; flex-direction: column;
32
+ transform: translateY(100%);
33
+ transition: transform 250ms ease;
34
+ padding-block-end: env(safe-area-inset-bottom, 0px);
35
+ }
36
+ :host([open]) .sheet { transform: translateY(0); }
37
+ .header {
38
+ display: flex; align-items: center; justify-content: space-between;
39
+ padding: var(--velin-space-4, 1rem) var(--velin-space-5, 1.25rem);
40
+ border-bottom: 1px solid var(--velin-color-border, #ddd);
41
+ }
42
+ .title { font-size: var(--velin-text-lg, 1.25rem); font-weight: 600; margin: 0; }
43
+ .close-btn {
44
+ min-width: 2.75rem; min-height: 2.75rem; display: inline-flex; align-items: center; justify-content: center;
45
+ background: none; border: none; border-radius: var(--velin-radius-md, 0.5rem); cursor: pointer;
46
+ color: var(--velin-color-text-muted, #666); font-size: 1.5rem; line-height: 1;
47
+ }
48
+ .close-btn:hover { background: var(--velin-color-surface-dim, #eee); color: var(--velin-color-text, #111); }
49
+ .body { flex: 1; overflow-y: auto; padding: var(--velin-space-5, 1.25rem); }
50
+ @media (prefers-reduced-motion: reduce) { .overlay, .sheet { transition: none; } }
51
+ `;
52
+ var VelinSheet = class extends HTMLElement {
53
+ static get observedAttributes() {
54
+ return ["open", "title", "label"];
55
+ }
56
+ constructor() {
57
+ super();
58
+ this.attachShadow({ mode: "open", delegatesFocus: true });
59
+ this._prev = null;
60
+ this._onKey = this._onKey.bind(this);
61
+ this._onTitleSlot = this._onTitleSlot.bind(this);
62
+ }
63
+ connectedCallback() {
64
+ if (this.shadowRoot.querySelector(".sheet")) return;
65
+ const titleId = "velin-sheet-title";
66
+ this.shadowRoot.innerHTML = `
67
+ <style>${styles}</style>
68
+ <div class="overlay" part="overlay"></div>
69
+ <div class="sheet" role="dialog" aria-modal="true" aria-labelledby="${titleId}" part="sheet">
70
+ <div class="header" part="header">
71
+ <h2 class="title" id="${titleId}" part="title">
72
+ <slot name="title"></slot>
73
+ <span class="title-fallback"></span>
74
+ </h2>
75
+ <button class="close-btn" aria-label="Close" part="close">&#215;</button>
76
+ </div>
77
+ <div class="body" part="body"><slot></slot></div>
78
+ </div>
79
+ `;
80
+ this.shadowRoot.querySelector(".close-btn").addEventListener("click", () => this.close());
81
+ this.shadowRoot.querySelector(".overlay").addEventListener("click", () => this.close());
82
+ this.shadowRoot.querySelector('slot[name="title"]').addEventListener("slotchange", this._onTitleSlot);
83
+ this._syncTitle();
84
+ if (this.hasAttribute("open")) this._open();
85
+ }
86
+ attributeChangedCallback(name) {
87
+ if (name === "open") this.hasAttribute("open") ? this._open() : this._close();
88
+ if (name === "title" || name === "label") this._syncTitle();
89
+ }
90
+ open() {
91
+ this.setAttribute("open", "");
92
+ }
93
+ close() {
94
+ this.removeAttribute("open");
95
+ this.dispatchEvent(new CustomEvent("velin-close", { bubbles: true }));
96
+ }
97
+ _syncTitle() {
98
+ const fallback = this.shadowRoot?.querySelector(".title-fallback");
99
+ if (!fallback) return;
100
+ fallback.textContent = this.getAttribute("title") || this.getAttribute("label") || "";
101
+ }
102
+ _hasTitleSlot() {
103
+ const slot = this.shadowRoot?.querySelector('slot[name="title"]');
104
+ if (!slot) return false;
105
+ return slot.assignedNodes({ flatten: true }).some((n) => {
106
+ if (n.nodeType === Node.TEXT_NODE) return Boolean(n.textContent.trim());
107
+ return n.nodeType === Node.ELEMENT_NODE;
108
+ });
109
+ }
110
+ _onTitleSlot() {
111
+ const dialog = this.shadowRoot?.querySelector('[role="dialog"]');
112
+ const fallback = this.shadowRoot?.querySelector(".title-fallback");
113
+ if (!dialog || !fallback) return;
114
+ if (this._hasTitleSlot()) {
115
+ fallback.hidden = true;
116
+ dialog.removeAttribute("aria-labelledby");
117
+ const slot = this.shadowRoot.querySelector('slot[name="title"]');
118
+ const label = slot.assignedNodes({ flatten: true }).map((n) => n.textContent || "").join(" ").trim();
119
+ if (label) dialog.setAttribute("aria-label", label);
120
+ } else {
121
+ fallback.hidden = false;
122
+ dialog.removeAttribute("aria-label");
123
+ dialog.setAttribute("aria-labelledby", "velin-sheet-title");
124
+ this._syncTitle();
125
+ }
126
+ }
127
+ _open() {
128
+ this._prev = saveFocus();
129
+ setBackgroundInert(this);
130
+ document.addEventListener("keydown", this._onKey);
131
+ requestAnimationFrame(() => {
132
+ const f = getFocusableElements(this.shadowRoot);
133
+ if (f.length) f[0].focus();
134
+ });
135
+ }
136
+ _close() {
137
+ document.removeEventListener("keydown", this._onKey);
138
+ clearBackgroundInert(this);
139
+ restoreFocus(this._prev);
140
+ }
141
+ _onKey(e) {
142
+ if (e.key === "Escape") {
143
+ this.close();
144
+ return;
145
+ }
146
+ trapFocus(this.shadowRoot, e);
147
+ }
148
+ disconnectedCallback() {
149
+ document.removeEventListener("keydown", this._onKey);
150
+ clearBackgroundInert(this);
151
+ }
152
+ };
153
+ customElements.define("velin-sheet", VelinSheet);
154
+ var velin_sheet_default = VelinSheet;
155
+ export {
156
+ velin_sheet_default as default
157
+ };
package/dist/llms.txt CHANGED
@@ -1,4 +1,4 @@
1
- # VelinStyle 1.2.1
1
+ # VelinStyle 1.2.2
2
2
 
3
3
  > VelinStyle is a CSS framework with WCAG 2.2 AAA-oriented defaults, native JavaScript runtime, and Web Components.
4
4
  > Full machine context: https://velinstyle.info/dist/velin-agent.json
@@ -9,8 +9,8 @@
9
9
  - VelinStyle is a CSS framework with WCAG 2.2 AAA-oriented defaults, native JavaScript runtime, and Web Components.
10
10
  - Pipeline: Core Foundation → Design System → Knowledge Graph → Prompt Engine → Review Engine → AI Metadata
11
11
  - Maturity: CSS/Web Components/runtime = stable; plan/review, knowledge graph, page/section registry, agent metadata = beta/foundation (seed, expanding); Studio + Utility Engine generator = planned
12
- - Components: 40 canonical Web Components (`velin-*`); 42 lazy-loader entries
13
- - Knowledge graph: 17 component nodes, 17 page types, 12 sections, 3 design constraint packs
12
+ - Components: 43 canonical Web Components (`velin-*`); 45 lazy-loader entries
13
+ - Knowledge graph: 20 component nodes, 17 page types, 12 sections, 3 design constraint packs
14
14
  - HTML attributes: 29 `velin-*` bridges
15
15
  - CLI: velinstyle (scan, scaffold, plan, review, docs generate, search index, meta)
16
16
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-08-02T07:30:23.643Z",
3
+ "generatedAt": "2026-08-04T10:26:08.731Z",
4
4
  "entries": [
5
5
  {
6
6
  "id": "examples:samples/a11y-patterns.html",
@@ -57,7 +57,7 @@
57
57
  {
58
58
  "id": "api:commands",
59
59
  "title": "CLI commands",
60
- "excerpt": "VelinStyle CLI v1.2.1. Run velinstyle --help for full usage.",
60
+ "excerpt": "VelinStyle CLI v1.2.2. Run velinstyle --help for full usage.",
61
61
  "url": "docs/generated/cli/commands.html",
62
62
  "category": "api",
63
63
  "keywords": [
@@ -79,6 +79,18 @@
79
79
  ],
80
80
  "weight": 1.1
81
81
  },
82
+ {
83
+ "id": "api:atelier",
84
+ "title": "CLI: atelier",
85
+ "excerpt": "Pull curated Atelier Library showcase by number/id; blade/vue/react = wrappers only",
86
+ "url": "docs/generated/cli/commands.html#atelier",
87
+ "category": "api",
88
+ "keywords": [
89
+ "cli",
90
+ "atelier"
91
+ ],
92
+ "weight": 1.1
93
+ },
82
94
  {
83
95
  "id": "api:blueprint",
84
96
  "title": "CLI: blueprint",
@@ -94,7 +106,7 @@
94
106
  {
95
107
  "id": "api:build",
96
108
  "title": "CLI: build",
97
- "excerpt": "Build custom CSS with selected layers from config",
109
+ "excerpt": "Build custom CSS with selected layers from config, or production output with --production",
98
110
  "url": "docs/generated/cli/commands.html#build",
99
111
  "category": "api",
100
112
  "keywords": [
@@ -214,7 +226,7 @@
214
226
  {
215
227
  "id": "api:plan",
216
228
  "title": "CLI: plan",
217
- "excerpt": "Emit page plan JSON from a prompt (no HTML)",
229
+ "excerpt": "Emit page plan JSON from a prompt or --atelier Library ids (beta)",
218
230
  "url": "docs/generated/cli/commands.html#plan",
219
231
  "category": "api",
220
232
  "keywords": [
@@ -235,6 +247,18 @@
235
247
  ],
236
248
  "weight": 1.1
237
249
  },
250
+ {
251
+ "id": "api:production",
252
+ "title": "CLI: production",
253
+ "excerpt": "Content-aware production builder (CSS/JS/themes/icons/fonts/motion + report)",
254
+ "url": "docs/generated/cli/commands.html#production",
255
+ "category": "api",
256
+ "keywords": [
257
+ "cli",
258
+ "production"
259
+ ],
260
+ "weight": 1.1
261
+ },
238
262
  {
239
263
  "id": "api:review",
240
264
  "title": "CLI: review",
@@ -250,7 +274,7 @@
250
274
  {
251
275
  "id": "api:scaffold",
252
276
  "title": "CLI: scaffold",
253
- "excerpt": "Plan-first page HTML or recipe fragment from natural language",
277
+ "excerpt": "Plan-first page HTML, recipe fragment, or Atelier Library compose (--atelier, beta)",
254
278
  "url": "docs/generated/cli/commands.html#scaffold",
255
279
  "category": "api",
256
280
  "keywords": [
@@ -1252,6 +1276,19 @@
1252
1276
  ],
1253
1277
  "weight": 1.3
1254
1278
  },
1279
+ {
1280
+ "id": "components:velin-empty-state",
1281
+ "title": "velin-empty-state",
1282
+ "excerpt": "Source: components/velin-empty-state.js",
1283
+ "url": "docs/generated/components/velin-empty-state.html",
1284
+ "category": "components",
1285
+ "keywords": [
1286
+ "velin-empty-state",
1287
+ "components",
1288
+ "velin-empty-state"
1289
+ ],
1290
+ "weight": 1.3
1291
+ },
1255
1292
  {
1256
1293
  "id": "docs:velin-fade",
1257
1294
  "title": "velin-fade",
@@ -1473,6 +1510,19 @@
1473
1510
  ],
1474
1511
  "weight": 1.2
1475
1512
  },
1513
+ {
1514
+ "id": "components:velin-otp-input",
1515
+ "title": "velin-otp-input",
1516
+ "excerpt": "Source: components/velin-otp-input.js",
1517
+ "url": "docs/generated/components/velin-otp-input.html",
1518
+ "category": "components",
1519
+ "keywords": [
1520
+ "velin-otp-input",
1521
+ "components",
1522
+ "velin-otp-input"
1523
+ ],
1524
+ "weight": 1.3
1525
+ },
1476
1526
  {
1477
1527
  "id": "docs:velin-parallax",
1478
1528
  "title": "velin-parallax",
@@ -1486,6 +1536,19 @@
1486
1536
  ],
1487
1537
  "weight": 1.2
1488
1538
  },
1539
+ {
1540
+ "id": "components:velin-password-strength",
1541
+ "title": "velin-password-strength",
1542
+ "excerpt": "Source: components/velin-password-strength.js",
1543
+ "url": "docs/generated/components/velin-password-strength.html",
1544
+ "category": "components",
1545
+ "keywords": [
1546
+ "velin-password-strength",
1547
+ "components",
1548
+ "velin-password-strength"
1549
+ ],
1550
+ "weight": 1.3
1551
+ },
1489
1552
  {
1490
1553
  "id": "components:velin-persist",
1491
1554
  "title": "velin-persist",