@birdapi/velinstyle 1.2.0 → 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 (89) hide show
  1. package/README.de.md +150 -24
  2. package/README.md +155 -33
  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-attributes.js +2 -0
  18. package/cli/docgen/extract-cli.js +1 -1
  19. package/cli/index.js +181 -6
  20. package/cli/production/component-graph.json +166 -0
  21. package/cli/production/explain.js +52 -0
  22. package/cli/production/extract.js +238 -0
  23. package/cli/production/graph.js +102 -0
  24. package/cli/production/report.js +78 -0
  25. package/cli/production/run.js +312 -0
  26. package/cli/production/trim-css.js +177 -0
  27. package/cli/production/trim-fonts.js +23 -0
  28. package/cli/production/trim-icons.js +38 -0
  29. package/cli/production/trim-js.js +48 -0
  30. package/cli/production/trim-motion.js +22 -0
  31. package/cli/production/trim-themes.js +50 -0
  32. package/cli/production/watch.js +38 -0
  33. package/cli/review.js +48 -1
  34. package/cli/scripts/write-atelier-fixtures.mjs +33 -0
  35. package/cli/transparency.js +221 -0
  36. package/components/index.js +3 -0
  37. package/components/runtime/component-loaders.js +3 -0
  38. package/components/velin-drawer.js +43 -4
  39. package/components/velin-empty-state.js +83 -0
  40. package/components/velin-modal.js +76 -15
  41. package/components/velin-otp-input.js +220 -0
  42. package/components/velin-password-strength.js +147 -0
  43. package/components/velin-sheet.js +49 -4
  44. package/core/a11y/component-contracts.json +23 -4
  45. package/core/attributes/registry.js +14 -0
  46. package/core/meta/knowledge/components.json +75 -3
  47. package/core/meta/schema.js +10 -0
  48. package/core/transparency/attach.js +74 -0
  49. package/core/transparency/claims.js +97 -0
  50. package/core/transparency/doctor.js +142 -0
  51. package/core/transparency/engine.js +75 -0
  52. package/core/transparency/export.js +98 -0
  53. package/core/transparency/index.js +30 -0
  54. package/core/transparency/migrate.js +130 -0
  55. package/core/transparency/normalize.js +125 -0
  56. package/core/transparency/policy.js +105 -0
  57. package/core/transparency/providers.js +235 -0
  58. package/core/transparency/registry.js +104 -0
  59. package/core/transparency/renderer.js +111 -0
  60. package/core/transparency/reporter.js +113 -0
  61. package/core/transparency/validator.js +112 -0
  62. package/dist/chunks/attach-H2ZSEAE6.js +365 -0
  63. package/dist/chunks/attributes-2ORR27KA.js +404 -0
  64. package/dist/chunks/attributes-DZCXX2RZ.js +404 -0
  65. package/dist/chunks/chunk-CQMTCEI6.js +113 -0
  66. package/dist/chunks/chunk-Y6HN7HWX.js +116 -0
  67. package/dist/chunks/runtime-entry.js +1 -1
  68. package/dist/chunks/velin-drawer-A7Q7EBOS.js +162 -0
  69. package/dist/chunks/velin-empty-state-3NTUH2RF.js +81 -0
  70. package/dist/chunks/velin-modal-3MV4FYBK.js +231 -0
  71. package/dist/chunks/velin-otp-input-PSK42MM6.js +207 -0
  72. package/dist/chunks/velin-password-strength-TAXMLSED.js +136 -0
  73. package/dist/chunks/velin-sheet-N2VVYXFP.js +157 -0
  74. package/dist/llms.txt +5 -4
  75. package/dist/search-index.json +94 -5
  76. package/dist/velin-agent.json +290 -23
  77. package/dist/velinstyle-components.iife.js +3189 -2202
  78. package/dist/velinstyle-components.js +3187 -2196
  79. package/dist/velinstyle-components.min.js +261 -119
  80. package/dist/velinstyle.css +214 -6
  81. package/dist/velinstyle.d.ts +3 -0
  82. package/dist/velinstyle.min.css +1 -1
  83. package/package.json +143 -142
  84. package/packages/velinstyle-skills/catalog.json +1 -1
  85. package/src/components/data-table.css +19 -0
  86. package/src/components/empty-auth.css +33 -0
  87. package/src/components/table.css +16 -6
  88. package/src/components/transparency.css +138 -0
  89. package/src/velinstyle.css +2 -0
@@ -0,0 +1,136 @@
1
+ import {
2
+ SHADOW_A11Y_STYLES
3
+ } from "./chunk-F7OLHTGX.js";
4
+
5
+ // components/velin-password-strength.js
6
+ function scorePassword(pw) {
7
+ const value = String(pw || "");
8
+ let score = 0;
9
+ if (value.length >= 8) score += 1;
10
+ if (value.length >= 12) score += 1;
11
+ if (/[A-Z]/.test(value) && /[a-z]/.test(value)) score += 1;
12
+ if (/\d/.test(value)) score += 1;
13
+ if (/[^A-Za-z0-9]/.test(value)) score += 1;
14
+ const labels = ["Too weak", "Weak", "Okay", "Strong", "Excellent", "Excellent"];
15
+ return {
16
+ score,
17
+ label: labels[score] || "Too weak",
18
+ pct: Math.min(100, score * 20)
19
+ };
20
+ }
21
+ var styles = `
22
+ ${SHADOW_A11Y_STYLES}
23
+ :host { display: block; }
24
+ .wrap { display: grid; gap: var(--velin-space-2, 0.5rem); }
25
+ .meter {
26
+ inline-size: 100%;
27
+ block-size: 0.5rem;
28
+ background: var(--velin-color-surface-dim, #eee);
29
+ border-radius: var(--velin-radius-full, 999px);
30
+ overflow: hidden;
31
+ }
32
+ .bar {
33
+ block-size: 100%;
34
+ inline-size: 0%;
35
+ border-radius: inherit;
36
+ background: var(--velin-color-danger, #dc2626);
37
+ transition: inline-size 160ms ease, background-color 160ms ease;
38
+ }
39
+ :host([data-score="2"]) .bar,
40
+ :host([data-score="3"]) .bar { background: var(--velin-color-warning, #f59e0b); }
41
+ :host([data-score="4"]) .bar,
42
+ :host([data-score="5"]) .bar { background: var(--velin-color-success, #16a34a); }
43
+ .label {
44
+ margin: 0;
45
+ font-size: var(--velin-text-sm, 0.875rem);
46
+ color: var(--velin-color-text-muted, #666);
47
+ }
48
+ @media (prefers-reduced-motion: reduce) {
49
+ .bar { transition: none; }
50
+ }
51
+ `;
52
+ var VelinPasswordStrength = class extends HTMLElement {
53
+ static get observedAttributes() {
54
+ return ["for", "value", "label"];
55
+ }
56
+ constructor() {
57
+ super();
58
+ this.attachShadow({ mode: "open" });
59
+ this._onTargetInput = this._onTargetInput.bind(this);
60
+ this._target = null;
61
+ }
62
+ connectedCallback() {
63
+ if (!this.shadowRoot.querySelector(".wrap")) {
64
+ this.shadowRoot.innerHTML = `
65
+ <style>${styles}</style>
66
+ <div class="wrap" part="wrap">
67
+ <div class="meter" part="meter" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
68
+ <div class="bar" part="bar"></div>
69
+ </div>
70
+ <p class="label" part="label" aria-live="polite"></p>
71
+ </div>
72
+ `;
73
+ }
74
+ this._bindTarget();
75
+ this._render(this._currentValue());
76
+ }
77
+ disconnectedCallback() {
78
+ this._unbindTarget();
79
+ }
80
+ attributeChangedCallback(name, oldVal, newVal) {
81
+ if (oldVal === newVal) return;
82
+ if (name === "for") {
83
+ this._bindTarget();
84
+ this._render(this._currentValue());
85
+ } else if (name === "value" || name === "label") {
86
+ this._render(this._currentValue());
87
+ }
88
+ }
89
+ _currentValue() {
90
+ if (this._target) return this._target.value || "";
91
+ return this.getAttribute("value") || "";
92
+ }
93
+ _unbindTarget() {
94
+ if (this._target) {
95
+ this._target.removeEventListener("input", this._onTargetInput);
96
+ this._target = null;
97
+ }
98
+ }
99
+ _bindTarget() {
100
+ this._unbindTarget();
101
+ const id = this.getAttribute("for");
102
+ if (!id || typeof document === "undefined") return;
103
+ const el = document.getElementById(id);
104
+ if (el && "value" in el) {
105
+ this._target = el;
106
+ this._target.addEventListener("input", this._onTargetInput);
107
+ }
108
+ }
109
+ _onTargetInput(e) {
110
+ this._render(e.target.value || "");
111
+ }
112
+ _render(pw) {
113
+ const result = scorePassword(pw);
114
+ const meter = this.shadowRoot?.querySelector(".meter");
115
+ const bar = this.shadowRoot?.querySelector(".bar");
116
+ const label = this.shadowRoot?.querySelector(".label");
117
+ if (!meter || !bar || !label) return;
118
+ bar.style.inlineSize = `${result.pct}%`;
119
+ meter.setAttribute("aria-valuenow", String(result.pct));
120
+ meter.setAttribute("aria-valuetext", result.label);
121
+ const prefix = this.getAttribute("label");
122
+ label.textContent = prefix ? `${prefix}: ${result.label}` : result.label;
123
+ this.setAttribute("data-score", String(result.score));
124
+ this.dispatchEvent(new CustomEvent("velin-strength", {
125
+ bubbles: true,
126
+ composed: true,
127
+ detail: result
128
+ }));
129
+ }
130
+ };
131
+ customElements.define("velin-password-strength", VelinPasswordStrength);
132
+ var velin_password_strength_default = VelinPasswordStrength;
133
+ export {
134
+ velin_password_strength_default as default,
135
+ scorePassword
136
+ };
@@ -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.0
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,9 +9,9 @@
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
14
- - HTML attributes: 27 `velin-*` bridges
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
+ - HTML attributes: 29 `velin-*` bridges
15
15
  - CLI: velinstyle (scan, scaffold, plan, review, docs generate, search index, meta)
16
16
 
17
17
  ## Agent briefing
@@ -32,6 +32,7 @@
32
32
  - Honor skill status, confidence, compatibility, and onlyIf predicates when automating.
33
33
  - Do not put secrets, API keys, or raw emails in velin-meta or page meta.
34
34
  - Resolve doc links against docs root (/docs/), not the current page folder.
35
+ - Prefer Velin Transparency Framework (velin-transparency + provenance) for AI/trust/compliance labeling; run `velinstyle transparency doctor`.
35
36
 
36
37
  ## Key guides
37
38
  - [Velin-Meta](https://velinstyle.info/docs/guides/velin-meta.html)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-08-01T07:28:49.364Z",
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.0. 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": [
@@ -1200,6 +1224,19 @@
1200
1224
  ],
1201
1225
  "weight": 1.3
1202
1226
  },
1227
+ {
1228
+ "id": "docs:velin-disclosure",
1229
+ "title": "velin-disclosure",
1230
+ "excerpt": "Alias for velin-transparency.",
1231
+ "url": "docs/generated/attributes/velin-disclosure.html",
1232
+ "category": "docs",
1233
+ "keywords": [
1234
+ "velin-disclosure",
1235
+ "docs",
1236
+ "velin-disclosure"
1237
+ ],
1238
+ "weight": 1.2
1239
+ },
1203
1240
  {
1204
1241
  "id": "components:velin-drawer",
1205
1242
  "title": "velin-drawer",
@@ -1239,6 +1276,19 @@
1239
1276
  ],
1240
1277
  "weight": 1.3
1241
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
+ },
1242
1292
  {
1243
1293
  "id": "docs:velin-fade",
1244
1294
  "title": "velin-fade",
@@ -1460,6 +1510,19 @@
1460
1510
  ],
1461
1511
  "weight": 1.2
1462
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
+ },
1463
1526
  {
1464
1527
  "id": "docs:velin-parallax",
1465
1528
  "title": "velin-parallax",
@@ -1473,6 +1536,19 @@
1473
1536
  ],
1474
1537
  "weight": 1.2
1475
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
+ },
1476
1552
  {
1477
1553
  "id": "components:velin-persist",
1478
1554
  "title": "velin-persist",
@@ -1863,6 +1939,19 @@
1863
1939
  ],
1864
1940
  "weight": 1.2
1865
1941
  },
1942
+ {
1943
+ "id": "docs:velin-transparency",
1944
+ "title": "velin-transparency",
1945
+ "excerpt": "Velin Transparency Framework host — attaches disclosure + provenance mark (Renderer).",
1946
+ "url": "docs/generated/attributes/velin-transparency.html",
1947
+ "category": "docs",
1948
+ "keywords": [
1949
+ "velin-transparency",
1950
+ "docs",
1951
+ "velin-transparency"
1952
+ ],
1953
+ "weight": 1.2
1954
+ },
1866
1955
  {
1867
1956
  "id": "examples:samples/velin-search.html",
1868
1957
  "title": "VelinSearch",