@birdapi/velinstyle 1.2.0 → 1.2.1

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 (39) hide show
  1. package/README.de.md +22 -19
  2. package/README.md +24 -25
  3. package/cli/cli-manifest.json +1 -1
  4. package/cli/docgen/extract-attributes.js +2 -0
  5. package/cli/index.js +32 -3
  6. package/cli/transparency.js +221 -0
  7. package/core/a11y/component-contracts.json +1 -1
  8. package/core/attributes/registry.js +14 -0
  9. package/core/meta/schema.js +10 -0
  10. package/core/transparency/attach.js +74 -0
  11. package/core/transparency/claims.js +97 -0
  12. package/core/transparency/doctor.js +142 -0
  13. package/core/transparency/engine.js +75 -0
  14. package/core/transparency/export.js +98 -0
  15. package/core/transparency/index.js +30 -0
  16. package/core/transparency/migrate.js +130 -0
  17. package/core/transparency/normalize.js +125 -0
  18. package/core/transparency/policy.js +105 -0
  19. package/core/transparency/providers.js +235 -0
  20. package/core/transparency/registry.js +104 -0
  21. package/core/transparency/renderer.js +111 -0
  22. package/core/transparency/reporter.js +113 -0
  23. package/core/transparency/validator.js +112 -0
  24. package/dist/chunks/attach-H2ZSEAE6.js +365 -0
  25. package/dist/chunks/attributes-DZCXX2RZ.js +404 -0
  26. package/dist/chunks/chunk-CQMTCEI6.js +113 -0
  27. package/dist/chunks/runtime-entry.js +1 -1
  28. package/dist/llms.txt +3 -2
  29. package/dist/search-index.json +28 -2
  30. package/dist/velin-agent.json +10 -6
  31. package/dist/velinstyle-components.iife.js +411 -2
  32. package/dist/velinstyle-components.js +411 -2
  33. package/dist/velinstyle-components.min.js +113 -113
  34. package/dist/velinstyle.css +160 -0
  35. package/dist/velinstyle.min.css +1 -1
  36. package/package.json +2 -1
  37. package/packages/velinstyle-skills/catalog.json +1 -1
  38. package/src/components/transparency.css +138 -0
  39. package/src/velinstyle.css +1 -0
@@ -0,0 +1,404 @@
1
+ import {
2
+ disconnectInViewObserver,
3
+ observeInView
4
+ } from "./chunk-7MCGPHVC.js";
5
+ import {
6
+ lazyDefine
7
+ } from "./chunk-CQMTCEI6.js";
8
+
9
+ // core/motion/effects.js
10
+ var VISIBLE_CLASS = "velin-in-view";
11
+ var EFFECT_MAP = {
12
+ reveal: ["velin-animate-on-scroll"],
13
+ fade: ["velin-animate-on-scroll", "velin-animate-on-scroll--fade"],
14
+ slide: ["velin-animate-on-scroll", "velin-animate-on-scroll--slide-up"],
15
+ "slide-up": ["velin-animate-on-scroll", "velin-animate-on-scroll--slide-up"],
16
+ "slide-down": ["velin-animate-on-scroll", "velin-animate-on-scroll--slide-down"],
17
+ "slide-left": ["velin-animate-on-scroll", "velin-animate-on-scroll--slide-left"],
18
+ "slide-right": ["velin-animate-on-scroll", "velin-animate-on-scroll--slide-right"],
19
+ scale: ["velin-animate-on-scroll", "velin-animate-on-scroll--scale"],
20
+ parallax: ["velin-parallax"],
21
+ "parallax-slow": ["velin-parallax", "velin-parallax--slow"],
22
+ hover: ["velin-animate-hover"],
23
+ "hover-lift": ["velin-animate-hover"],
24
+ flip: ["velin-animate-scale-in"],
25
+ blur: ["velin-animate-fade-in"]
26
+ };
27
+ function applyEffects(el, attrs = {}) {
28
+ const classes = /* @__PURE__ */ new Set();
29
+ for (const [name, value] of Object.entries(attrs)) {
30
+ if (value === "false" || value === "off") continue;
31
+ const mapped = EFFECT_MAP[name];
32
+ if (mapped) mapped.forEach((c) => classes.add(c));
33
+ if (name === "slide" && value && value !== "true" && value !== "") {
34
+ const key = `slide-${value}`;
35
+ EFFECT_MAP[key]?.forEach((c) => classes.add(c));
36
+ }
37
+ }
38
+ classes.forEach((c) => el.classList.add(c));
39
+ if (!el.classList.contains("velin-animate-on-scroll") && attrs.reveal !== void 0) {
40
+ el.classList.add("velin-animate-on-scroll");
41
+ }
42
+ return [...classes];
43
+ }
44
+ function markVisible(el) {
45
+ el.classList.add(VISIBLE_CLASS);
46
+ el.dataset.velinVisible = "true";
47
+ }
48
+ function prefersReducedMotion() {
49
+ return typeof window !== "undefined" && window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
50
+ }
51
+
52
+ // core/motion/stagger.js
53
+ var STAGGER_ATTR = "velin-stagger";
54
+ function applyStagger(listEl, value = "true") {
55
+ const base = value === "true" || value === "" ? 60 : parseInt(value, 10) || 60;
56
+ const children = [...listEl.children];
57
+ children.forEach((child, i) => {
58
+ child.style.setProperty("--velin-stagger-delay", `${i * base}ms`);
59
+ child.classList.add("velin-stagger-item");
60
+ });
61
+ listEl.classList.add("velin-stagger");
62
+ }
63
+ function enhanceStagger(root = document) {
64
+ root.querySelectorAll(`[${STAGGER_ATTR}]`).forEach((el) => {
65
+ if (el.dataset.velinStaggerDone) return;
66
+ el.dataset.velinStaggerDone = "1";
67
+ applyStagger(el, el.getAttribute(STAGGER_ATTR) || "true");
68
+ });
69
+ }
70
+
71
+ // core/motion/scroll.js
72
+ function smoothScrollTo(target, options = {}) {
73
+ const reduced = typeof window !== "undefined" && window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
74
+ const el = typeof target === "string" ? document.querySelector(target) : target;
75
+ if (!el) return;
76
+ el.scrollIntoView({
77
+ behavior: reduced || options.instant ? "auto" : "smooth",
78
+ block: options.block || "start",
79
+ inline: options.inline || "nearest"
80
+ });
81
+ if (el.tabIndex < 0 && !el.hasAttribute("tabindex")) {
82
+ el.setAttribute("tabindex", "-1");
83
+ }
84
+ el.focus({ preventScroll: true });
85
+ }
86
+ function bindSmoothScroll(root = document) {
87
+ root.querySelectorAll("[velin-scroll]").forEach((link) => {
88
+ if (link.dataset.velinScrollBound) return;
89
+ link.dataset.velinScrollBound = "1";
90
+ link.addEventListener("click", (e) => {
91
+ const href = link.getAttribute("href");
92
+ if (!href || !href.startsWith("#")) return;
93
+ const target = document.querySelector(href);
94
+ if (!target) return;
95
+ e.preventDefault();
96
+ smoothScrollTo(target);
97
+ });
98
+ });
99
+ }
100
+
101
+ // core/motion/index.js
102
+ var MOTION_ATTRS = ["velin-reveal", "velin-fade", "velin-slide", "velin-scale", "velin-parallax", "velin-hover"];
103
+ var teardownFns = [];
104
+ function initMotion(options = {}) {
105
+ const root = options.root || (typeof document !== "undefined" ? document : null);
106
+ if (!root) return () => {
107
+ };
108
+ const selector = options.selector || [
109
+ "[velin-reveal]",
110
+ "[velin-fade]",
111
+ "[velin-slide]",
112
+ "[velin-scale]",
113
+ "[velin-parallax]",
114
+ "[velin-hover]",
115
+ ".velin-animate-on-scroll"
116
+ ].join(",");
117
+ const elements = root.querySelectorAll(selector);
118
+ const reduced = prefersReducedMotion();
119
+ for (const el of elements) {
120
+ if (el.dataset.velinMotionInit) continue;
121
+ el.dataset.velinMotionInit = "1";
122
+ const attrs = {};
123
+ for (const name of MOTION_ATTRS) {
124
+ if (el.hasAttribute(name)) attrs[name.replace("velin-", "")] = el.getAttribute(name) || "true";
125
+ }
126
+ applyEffects(el, attrs);
127
+ if (reduced) {
128
+ markVisible(el);
129
+ continue;
130
+ }
131
+ const stop = observeInView(el, (node) => markVisible(node));
132
+ teardownFns.push(stop);
133
+ }
134
+ enhanceStagger(root);
135
+ bindSmoothScroll(root);
136
+ return () => {
137
+ teardownFns.forEach((fn) => fn());
138
+ teardownFns = [];
139
+ disconnectInViewObserver();
140
+ };
141
+ }
142
+
143
+ // core/attributes/registry.js
144
+ var registry = /* @__PURE__ */ new Map();
145
+ function registerAttribute(name, handler) {
146
+ registry.set(name, handler);
147
+ }
148
+ function getAttributeHandler(name) {
149
+ return registry.get(name);
150
+ }
151
+ function bridgeComponent(el, tag, attrs = {}) {
152
+ el.setAttribute("data-velin-component", tag);
153
+ for (const [k, v] of Object.entries(attrs)) {
154
+ if (v != null) el.setAttribute(k, v);
155
+ }
156
+ return lazyDefine(tag);
157
+ }
158
+ function registerBuiltins() {
159
+ registerAttribute("velin-modal", {
160
+ enhance(el) {
161
+ bridgeComponent(el, "velin-modal", { open: el.getAttribute("velin-modal") || "" });
162
+ }
163
+ });
164
+ registerAttribute("velin-tabs", { enhance: (el) => bridgeComponent(el, "velin-tabs") });
165
+ registerAttribute("velin-accordion", { enhance: (el) => bridgeComponent(el, "velin-accordion") });
166
+ registerAttribute("velin-tooltip", {
167
+ enhance(el) {
168
+ const tip = el.getAttribute("velin-tooltip") || el.getAttribute("title") || "";
169
+ if (tip && el.hasAttribute("title")) el.removeAttribute("title");
170
+ if (el.tagName === "VELIN-TOOLTIP" || el.tagName === "VELIN-TOOLTIP-WC") {
171
+ el.setAttribute("content", tip);
172
+ return lazyDefine("velin-tooltip");
173
+ }
174
+ const wc = document.createElement("velin-tooltip");
175
+ wc.setAttribute("content", tip);
176
+ const parent = el.parentElement;
177
+ if (parent) {
178
+ parent.insertBefore(wc, el);
179
+ wc.appendChild(el);
180
+ }
181
+ return lazyDefine("velin-tooltip");
182
+ }
183
+ });
184
+ registerAttribute("velin-copy", {
185
+ enhance(el) {
186
+ const text = el.getAttribute("velin-copy") || el.textContent?.trim() || "";
187
+ if (!el.querySelector("velin-copy")) {
188
+ const wc = document.createElement("velin-copy");
189
+ wc.setAttribute("value", text);
190
+ if (el.tagName === "BUTTON") {
191
+ wc.append(...el.childNodes);
192
+ el.replaceWith(wc);
193
+ return lazyDefine("velin-copy");
194
+ }
195
+ el.appendChild(wc);
196
+ }
197
+ return lazyDefine("velin-copy");
198
+ }
199
+ });
200
+ registerAttribute("velin-counter", {
201
+ enhance(el) {
202
+ bridgeComponent(el, "velin-counter", {
203
+ value: el.getAttribute("velin-counter") || "0"
204
+ });
205
+ }
206
+ });
207
+ registerAttribute("velin-notify", {
208
+ async enhance(el) {
209
+ await lazyDefine("velin-toast");
210
+ el.addEventListener("click", () => {
211
+ const msg = el.getAttribute("velin-notify") || el.textContent || "";
212
+ document.dispatchEvent(
213
+ new CustomEvent("velin-toast-show", { detail: { message: msg, variant: el.dataset.variant || "info" } })
214
+ );
215
+ });
216
+ }
217
+ });
218
+ registerAttribute("velin-theme", {
219
+ enhance(el) {
220
+ const theme = el.getAttribute("velin-theme") || "toggle";
221
+ if (theme === "toggle") {
222
+ if (!el.querySelector("velin-theme-toggle")) {
223
+ el.appendChild(document.createElement("velin-theme-toggle"));
224
+ }
225
+ return lazyDefine("velin-theme-toggle");
226
+ }
227
+ document.documentElement.setAttribute("data-velin-theme", theme);
228
+ }
229
+ });
230
+ registerAttribute("velin-scroll-top", {
231
+ enhance(el) {
232
+ const raw = el.getAttribute("velin-scroll-top");
233
+ const threshold = raw && raw !== "true" ? raw : "300";
234
+ if (el.tagName === "VELIN-SCROLL-TOP") {
235
+ if (raw && raw !== "true") el.setAttribute("threshold", threshold);
236
+ return lazyDefine("velin-scroll-top");
237
+ }
238
+ let wc = document.querySelector("velin-scroll-top");
239
+ if (!wc) {
240
+ wc = document.createElement("velin-scroll-top");
241
+ wc.setAttribute("threshold", threshold);
242
+ (el === document.body || el === document.documentElement ? document.body : el).appendChild(wc);
243
+ }
244
+ return lazyDefine("velin-scroll-top");
245
+ }
246
+ });
247
+ registerAttribute("velin-progress", {
248
+ enhance(el) {
249
+ const ring = el.hasAttribute("ring");
250
+ if (ring) return bridgeComponent(el, "velin-progress-ring");
251
+ el.classList.add("velin-progress");
252
+ const val = parseInt(el.getAttribute("velin-progress") || "0", 10);
253
+ el.setAttribute("role", "progressbar");
254
+ el.setAttribute("aria-valuenow", String(val));
255
+ el.style.setProperty("--velin-progress", `${Math.min(100, val)}%`);
256
+ }
257
+ });
258
+ registerAttribute("velin-search", {
259
+ async enhance(el) {
260
+ if (el.tagName !== "VELIN-SEARCH") {
261
+ const host = document.createElement("velin-search");
262
+ host.setAttribute("index", el.getAttribute("data-search-index") || "/search-index.json");
263
+ el.replaceWith(host);
264
+ host.appendChild(el);
265
+ }
266
+ return lazyDefine("velin-search");
267
+ }
268
+ });
269
+ registerAttribute("velin-lazy", {
270
+ enhance(el) {
271
+ if (el.tagName === "IMG") {
272
+ el.loading = "lazy";
273
+ el.decoding = "async";
274
+ if (el.hasAttribute("velin-skeleton") || el.dataset.velinSkeleton) {
275
+ el.classList.add("velin-skeleton", "velin-skeleton--image");
276
+ el.addEventListener("load", () => el.classList.remove("velin-skeleton", "velin-skeleton--image"), { once: true });
277
+ }
278
+ }
279
+ }
280
+ });
281
+ registerAttribute("velin-skeleton", {
282
+ enhance(el) {
283
+ const variant = el.getAttribute("velin-skeleton") || "text";
284
+ el.classList.add("velin-skeleton", `velin-skeleton--${variant}`);
285
+ const hasText = Boolean(el.textContent?.trim()) && el.children.length > 0;
286
+ if (!hasText && !el.textContent?.trim()) {
287
+ el.setAttribute("aria-hidden", "true");
288
+ }
289
+ }
290
+ });
291
+ registerAttribute("velin-loading", {
292
+ enhance(el) {
293
+ el.classList.add("velin-spinner");
294
+ el.setAttribute("aria-busy", "true");
295
+ el.setAttribute("role", "status");
296
+ if (!el.getAttribute("aria-label")?.trim()) {
297
+ el.setAttribute("aria-label", "Loading");
298
+ }
299
+ }
300
+ });
301
+ registerAttribute("velin-grid", {
302
+ enhance(el) {
303
+ const cols = el.getAttribute("velin-grid") || "auto";
304
+ el.classList.add("velin-grid");
305
+ if (cols !== "auto") el.style.setProperty("--velin-grid-cols", cols);
306
+ }
307
+ });
308
+ registerAttribute("velin-anchor", {
309
+ enhance(el) {
310
+ if (!el.id && el.getAttribute("velin-anchor")) el.id = el.getAttribute("velin-anchor");
311
+ el.setAttribute("tabindex", "-1");
312
+ }
313
+ });
314
+ registerAttribute("velin-code", {
315
+ async enhance(el) {
316
+ const lang = el.getAttribute("velin-code") || el.getAttribute("language") || el.getAttribute("data-language") || "";
317
+ el.classList.add("velin-code-block");
318
+ if (lang && lang !== "true") {
319
+ el.dataset.language = lang;
320
+ if (!el.getAttribute("language")) el.setAttribute("language", lang);
321
+ }
322
+ if (!el.querySelector("[data-velin-copy]")) {
323
+ const btn = document.createElement("button");
324
+ btn.type = "button";
325
+ btn.className = "velin-code-block__copy velin-btn velin-btn--sm";
326
+ btn.textContent = "Copy";
327
+ btn.setAttribute("data-velin-copy", "");
328
+ btn.setAttribute("velin-copy", el.querySelector("code")?.textContent || el.textContent || "");
329
+ el.style.position = "relative";
330
+ el.appendChild(btn);
331
+ }
332
+ await lazyDefine("velin-copy");
333
+ const { initHighlight, highlightElement } = await import("./highlight-M2ELQNYK.js");
334
+ const immediate = el.getAttribute("data-velin-highlight") === "immediate" || typeof matchMedia !== "undefined" && matchMedia("(prefers-reduced-motion: reduce)").matches;
335
+ if (immediate) {
336
+ await highlightElement(el);
337
+ } else {
338
+ initHighlight(el, { root: el });
339
+ }
340
+ }
341
+ });
342
+ registerAttribute("velin-quote", {
343
+ enhance(el) {
344
+ if (el.tagName === "BLOCKQUOTE" || el.tagName === "Q") {
345
+ el.classList.add("velin-quote");
346
+ }
347
+ }
348
+ });
349
+ registerAttribute("velin-highlight", {
350
+ enhance(el) {
351
+ el.classList.add("velin-highlight");
352
+ }
353
+ });
354
+ registerAttribute("velin-transparency", {
355
+ async enhance(el) {
356
+ const { attach } = await import("./attach-H2ZSEAE6.js");
357
+ attach(el);
358
+ }
359
+ });
360
+ registerAttribute("velin-disclosure", {
361
+ async enhance(el) {
362
+ const { attach } = await import("./attach-H2ZSEAE6.js");
363
+ if (!el.hasAttribute("velin-transparency")) el.setAttribute("velin-transparency", "");
364
+ attach(el);
365
+ }
366
+ });
367
+ for (const motion of ["velin-reveal", "velin-fade", "velin-slide", "velin-scale", "velin-parallax", "velin-hover", "velin-stagger", "velin-scroll"]) {
368
+ registerAttribute(motion, { enhance() {
369
+ } });
370
+ }
371
+ }
372
+ registerBuiltins();
373
+ var enhanced = /* @__PURE__ */ new WeakSet();
374
+ async function bootAttributes(root = document) {
375
+ const selector = [...registry.keys()].map((a) => `[${a}]`).join(",");
376
+ const elements = root.querySelectorAll(selector);
377
+ for (const el of elements) {
378
+ if (enhanced.has(el)) continue;
379
+ for (const attr of registry.keys()) {
380
+ if (!el.hasAttribute(attr)) continue;
381
+ const handler = registry.get(attr);
382
+ if (handler?.enhance) await handler.enhance(el);
383
+ }
384
+ enhanced.add(el);
385
+ }
386
+ initMotion({ root });
387
+ if (typeof HTMLElement !== "undefined") {
388
+ const { bindDeclarativeSearch } = await import("./velin-search-L3UG6NDQ.js");
389
+ bindDeclarativeSearch(root);
390
+ if (!document.querySelector("velin-announcer")) {
391
+ const { getAnnouncer } = await import("./a11y-utils-IRC7LOPF.js");
392
+ getAnnouncer();
393
+ }
394
+ }
395
+ }
396
+ function listRegisteredAttributes() {
397
+ return [...registry.keys()];
398
+ }
399
+ export {
400
+ bootAttributes,
401
+ getAttributeHandler,
402
+ listRegisteredAttributes,
403
+ registerAttribute
404
+ };
@@ -0,0 +1,113 @@
1
+ // components/runtime/component-loaders.js
2
+ var COMPONENT_LOADERS = {
3
+ "velin-accordion": () => import("./velin-accordion-WSY6BMLA.js"),
4
+ "velin-announcer": () => import("./velin-announcer-PVTXXCWR.js"),
5
+ "velin-bottom-nav": () => import("./velin-bottom-nav-N5F4UO2I.js"),
6
+ "velin-calendar": () => import("./velin-calendar-XC7JRDSH.js"),
7
+ "velin-carousel": () => import("./velin-carousel-ZTBANFQQ.js"),
8
+ "velin-code-block": () => import("./velin-code-block-ZGWG7JI5.js"),
9
+ "velin-collapse": () => import("./velin-collapse-5XYBUIID.js"),
10
+ "velin-combobox": () => import("./velin-combobox-56V2ZWT5.js"),
11
+ "velin-command": () => import("./velin-command-ZJSLPK7B.js"),
12
+ "velin-copy": () => import("./velin-copy-XDQSV2XU.js"),
13
+ "velin-countdown": () => import("./velin-countdown-V4Z5MA63.js"),
14
+ "velin-counter": () => import("./velin-counter-L5FYJF7A.js"),
15
+ "velin-data-table": () => import("./velin-data-table-UVR42UUM.js"),
16
+ "velin-dialog": () => import("./velin-dialog-3YK2RPRV.js"),
17
+ "velin-drawer": () => import("./velin-drawer-CCM6S25D.js"),
18
+ "velin-dropdown": () => import("./velin-dropdown-PLUIFA5M.js"),
19
+ "velin-email": () => import("./velin-email-TNFONXPW.js"),
20
+ "velin-file-dropzone": () => import("./velin-file-dropzone-QRGF2JNA.js"),
21
+ "velin-form-summary": () => import("./velin-form-summary-XRQ7COQH.js"),
22
+ "velin-icon": () => import("./velin-icon-A6NCXGUK.js"),
23
+ "velin-lightbox": () => import("./velin-lightbox-P725FLTY.js"),
24
+ "velin-live-dot": () => import("./velin-live-dot-RJHX2DGY.js"),
25
+ "velin-menubar": () => import("./velin-menubar-6I2LM5HL.js"),
26
+ "velin-modal": () => import("./velin-modal-ICTMGRSU.js"),
27
+ "velin-persist": () => import("./velin-persist-DFPL3QP4.js"),
28
+ "velin-popover": () => import("./velin-popover-WZG2GHBL.js"),
29
+ "velin-progress-ring": () => import("./velin-progress-ring-E4YRLZHH.js"),
30
+ "velin-rating": () => import("./velin-rating-QBBYRRBU.js"),
31
+ "velin-scroll-top": () => import("./velin-scroll-top-OHYVVHHY.js"),
32
+ "velin-scrollspy": () => import("./velin-scrollspy-OKCT4FDV.js"),
33
+ "velin-search": () => import("./velin-search-L3UG6NDQ.js"),
34
+ "velin-secure-field": () => import("./velin-secure-field-DGYMP7OK.js"),
35
+ "velin-segmented-control": () => import("./velin-segmented-control-P74GJPAR.js"),
36
+ "velin-sheet": () => import("./velin-sheet-X7RXIWKV.js"),
37
+ "velin-sparkline": () => import("./velin-sparkline-XVTFC6GE.js"),
38
+ "velin-stepper": () => import("./velin-stepper-4YQJUHPC.js"),
39
+ "velin-stepper-wc": () => import("./velin-stepper-4YQJUHPC.js"),
40
+ "velin-tabs": () => import("./velin-tabs-5UQ5ZVMV.js"),
41
+ "velin-theme-toggle": () => import("./velin-theme-toggle-32J2CBNC.js"),
42
+ "velin-toast": () => import("./velin-toast-UG5LWTG2.js"),
43
+ "velin-tooltip": () => import("./velin-tooltip-ZDH5SDLU.js"),
44
+ "velin-tooltip-wc": () => import("./velin-tooltip-ZDH5SDLU.js")
45
+ };
46
+
47
+ // components/runtime/index.js
48
+ var registry = /* @__PURE__ */ new Map();
49
+ var VELIN_TAG_RE = /^velin-[a-z0-9-]+$/;
50
+ function whenDefined(tagName) {
51
+ if (typeof customElements === "undefined") {
52
+ return Promise.reject(new Error("customElements not available"));
53
+ }
54
+ return customElements.whenDefined(tagName);
55
+ }
56
+ async function lazyDefine(tagName) {
57
+ const loader = COMPONENT_LOADERS[tagName];
58
+ if (!loader) {
59
+ throw new Error(`Unknown Velin component: ${tagName}`);
60
+ }
61
+ if (registry.has(tagName)) return registry.get(tagName);
62
+ const p = loader().then((mod) => {
63
+ const Cls = mod.default;
64
+ if (Cls && !customElements.get(tagName)) {
65
+ customElements.define(tagName, Cls);
66
+ }
67
+ return Cls;
68
+ });
69
+ registry.set(tagName, p);
70
+ return p;
71
+ }
72
+ async function register(tagNames) {
73
+ return Promise.all(tagNames.map((t) => lazyDefine(t)));
74
+ }
75
+ function collectTagsFromDOM(root) {
76
+ const tags = /* @__PURE__ */ new Set();
77
+ root.querySelectorAll("[data-velin-component]").forEach((el) => {
78
+ const name = el.getAttribute("data-velin-component");
79
+ if (name) tags.add(name.startsWith("velin-") ? name : `velin-${name}`);
80
+ });
81
+ for (const el of root.querySelectorAll("*")) {
82
+ const tag = el.tagName?.toLowerCase();
83
+ if (tag && VELIN_TAG_RE.test(tag) && COMPONENT_LOADERS[tag]) {
84
+ tags.add(tag);
85
+ }
86
+ }
87
+ return tags;
88
+ }
89
+ async function bootFromDOM(root = document, options = {}) {
90
+ const tags = options.tags?.length ? new Set(options.tags) : collectTagsFromDOM(root);
91
+ const wcPromise = register([...tags]);
92
+ if (options.attributes) {
93
+ const { bootAttributes } = await import("./attributes-DZCXX2RZ.js");
94
+ await bootAttributes(root);
95
+ }
96
+ if (options.highlight) {
97
+ const { initHighlight } = await import("./highlight-M2ELQNYK.js");
98
+ initHighlight(root);
99
+ }
100
+ if (options.haptic) {
101
+ const { VelinHapticObserver } = await import("./velin-haptic-4QQTM3RK.js");
102
+ new VelinHapticObserver().start(root instanceof Document ? root.body : root);
103
+ }
104
+ return wcPromise;
105
+ }
106
+
107
+ export {
108
+ COMPONENT_LOADERS,
109
+ whenDefined,
110
+ lazyDefine,
111
+ register,
112
+ bootFromDOM
113
+ };
@@ -4,7 +4,7 @@ import {
4
4
  lazyDefine,
5
5
  register,
6
6
  whenDefined
7
- } from "./chunk-TUGIPKW5.js";
7
+ } from "./chunk-CQMTCEI6.js";
8
8
  export {
9
9
  COMPONENT_LOADERS,
10
10
  bootFromDOM,
package/dist/llms.txt CHANGED
@@ -1,4 +1,4 @@
1
- # VelinStyle 1.2.0
1
+ # VelinStyle 1.2.1
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
@@ -11,7 +11,7 @@
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
12
  - Components: 40 canonical Web Components (`velin-*`); 42 lazy-loader entries
13
13
  - Knowledge graph: 17 component nodes, 17 page types, 12 sections, 3 design constraint packs
14
- - HTML attributes: 27 `velin-*` bridges
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-02T07:30:23.643Z",
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.1. Run velinstyle --help for full usage.",
61
61
  "url": "docs/generated/cli/commands.html",
62
62
  "category": "api",
63
63
  "keywords": [
@@ -1200,6 +1200,19 @@
1200
1200
  ],
1201
1201
  "weight": 1.3
1202
1202
  },
1203
+ {
1204
+ "id": "docs:velin-disclosure",
1205
+ "title": "velin-disclosure",
1206
+ "excerpt": "Alias for velin-transparency.",
1207
+ "url": "docs/generated/attributes/velin-disclosure.html",
1208
+ "category": "docs",
1209
+ "keywords": [
1210
+ "velin-disclosure",
1211
+ "docs",
1212
+ "velin-disclosure"
1213
+ ],
1214
+ "weight": 1.2
1215
+ },
1203
1216
  {
1204
1217
  "id": "components:velin-drawer",
1205
1218
  "title": "velin-drawer",
@@ -1863,6 +1876,19 @@
1863
1876
  ],
1864
1877
  "weight": 1.2
1865
1878
  },
1879
+ {
1880
+ "id": "docs:velin-transparency",
1881
+ "title": "velin-transparency",
1882
+ "excerpt": "Velin Transparency Framework host — attaches disclosure + provenance mark (Renderer).",
1883
+ "url": "docs/generated/attributes/velin-transparency.html",
1884
+ "category": "docs",
1885
+ "keywords": [
1886
+ "velin-transparency",
1887
+ "docs",
1888
+ "velin-transparency"
1889
+ ],
1890
+ "weight": 1.2
1891
+ },
1866
1892
  {
1867
1893
  "id": "examples:samples/velin-search.html",
1868
1894
  "title": "VelinSearch",
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "mime": "application/vnd.velinstyle.meta+json",
4
- "generatedAt": "2026-08-01T07:28:51.397Z",
4
+ "generatedAt": "2026-08-02T07:30:26.797Z",
5
5
  "framework": {
6
6
  "name": "@birdapi/velinstyle",
7
- "version": "1.2.0",
7
+ "version": "1.2.1",
8
8
  "homepage": "https://velinstyle.info",
9
9
  "repository": "https://github.com/SkyliteDesign/velinstyle.git",
10
10
  "tagline": "VelinStyle is a CSS framework with WCAG 2.2 AAA-oriented defaults, native JavaScript runtime, and Web Components.",
@@ -23,6 +23,7 @@
23
23
  "./attributes",
24
24
  "./highlight",
25
25
  "./meta",
26
+ "./transparency",
26
27
  "./a11y",
27
28
  "./skills-registry"
28
29
  ],
@@ -3922,6 +3923,7 @@
3922
3923
  "velin-code",
3923
3924
  "velin-copy",
3924
3925
  "velin-counter",
3926
+ "velin-disclosure",
3925
3927
  "velin-fade",
3926
3928
  "velin-grid",
3927
3929
  "velin-highlight",
@@ -3943,9 +3945,10 @@
3943
3945
  "velin-stagger",
3944
3946
  "velin-tabs",
3945
3947
  "velin-theme",
3946
- "velin-tooltip"
3948
+ "velin-tooltip",
3949
+ "velin-transparency"
3947
3950
  ],
3948
- "count": 27
3951
+ "count": 29
3949
3952
  },
3950
3953
  "cli": {
3951
3954
  "commands": [
@@ -4620,7 +4623,7 @@
4620
4623
  },
4621
4624
  "searchIndex": {
4622
4625
  "path": "dist/search-index.json",
4623
- "entryCount": 151
4626
+ "entryCount": 153
4624
4627
  },
4625
4628
  "documentation": {
4626
4629
  "generated": "docs/generated/",
@@ -4650,6 +4653,7 @@
4650
4653
  "Prefer registry-first skills (`velinstyle skills`) and workflow graphs (`velinstyle workflow`) before inventing custom pipelines.",
4651
4654
  "Honor skill status, confidence, compatibility, and onlyIf predicates when automating.",
4652
4655
  "Do not put secrets, API keys, or raw emails in velin-meta or page meta.",
4653
- "Resolve doc links against docs root (/docs/), not the current page folder."
4656
+ "Resolve doc links against docs root (/docs/), not the current page folder.",
4657
+ "Prefer Velin Transparency Framework (velin-transparency + provenance) for AI/trust/compliance labeling; run `velinstyle transparency doctor`."
4654
4658
  ]
4655
4659
  }