@kanonak-protocol/sdk 3.27.1 → 3.27.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.
@@ -0,0 +1,180 @@
1
+ import{a as P}from"./chunk-NIGFQYVA.js";import{a as j}from"./chunk-R2V7IXWN.js";import{c as S,d as l,g as m,j as d,k as y,l as k}from"./chunk-W6T7MOKY.js";var L={publisher:"kanonak.org",package_:"derivation",name:"look"},U={publisher:"kanonak.org",package_:"derivation",name:"tokens"},R={publisher:"kanonak.org",package_:"core-rdf",name:"Resource"},C={publisher:"kanonak.org",package_:"core-rdf",name:"label"},N={publisher:"kanonak.org",package_:"core-rdf",name:"comment"},z={publisher:"kanonak.org",package_:"look",name:"Hero"},A={publisher:"kanonak.org",package_:"look",name:"PropertyList"},q={publisher:"kanonak.org",package_:"look",name:"BadgeRow"},W={publisher:"kanonak.org",package_:"look",name:"ChipRow"},G={publisher:"kanonak.org",package_:"look",name:"ReferenceList"},O={publisher:"kanonak.org",package_:"look",name:"bands"},Y={publisher:"kanonak.org",package_:"look",name:"title"},J={publisher:"kanonak.org",package_:"look",name:"eyebrow"},Q={publisher:"kanonak.org",package_:"look",name:"subtitle"},T={publisher:"kanonak.org",package_:"look",name:"badges"},K={publisher:"kanonak.org",package_:"look",name:"source"},X={publisher:"kanonak.org",package_:"look",name:"chips"},B={publisher:"kanonak.org",package_:"look",name:"entries"},Z={publisher:"kanonak.org",package_:"look",name:"urlForm"},F=class{constructor(e){this.catalog=e}catalog;findCascadedLook(e){let n=new Set,t=I(e);for(;t.length>0;){let a=t.shift(),r=_(a.subject);if(n.has(r))continue;n.add(r);let o=b(this.catalog,a.subject);if(!o)continue;let i=V(o);if(i)return{declaration:i,sourceClass:{publisher:a.subject.publisher,package_:a.subject.package_,name:a.subject.name}};for(let c of E(o))t.push(c)}if(!n.has(_(R))){let a=b(this.catalog,R);if(a){let r=V(a);if(r)return{declaration:r,sourceClass:{...R}}}}}findCascadedTokens(e){let n=new Map;for(let[r,o]of $(e))n.has(r)||n.set(r,o);let t=new Set,a=I(e);for(;a.length>0;){let r=a.shift(),o=_(r.subject);if(t.has(o))continue;t.add(o);let i=b(this.catalog,r.subject);if(i){for(let[c,f]of $(i))n.has(c)||n.set(c,f);for(let c of E(i))a.push(c)}}if(!t.has(_(R))){let r=b(this.catalog,R);if(r)for(let[o,i]of $(r))n.has(o)||n.set(o,i)}return n}renderStylesheet(e){let n=this.findCascadedTokens(e),t=[];for(let[r,o]of n)t.push(` --kan-${r}: ${o};`);return`${t.length>0?`:root {
2
+ ${t.join(`
3
+ `)}
4
+ }`:":root { /* no tokens resolved */ }"}
5
+ ${ae}`}renderHtml(e){let n=this.findCascadedLook(e);if(!n)return`<!-- LookRenderer: no derivation.look found for ${e.namespace}/${e.name} -->`;let t=ee(n.declaration);if(t.length===0)return"<!-- LookRenderer: look declaration has no bands -->";let a=te(e),r=[];for(let o of t)r.push(this.renderBand(o,e,a));return r.join(`
6
+ `)}renderDocument(e){let n=this.renderHtml(e),t=this.readPropertyValueText(e,C)??e.name,a=`${e.name}.css`,r=this.hasSvgDerivation(e)?`<figure class="kan-figure"><img src="${u(e.name)}.svg" alt=""></figure>
7
+ `:"";return`<!doctype html>
8
+ <html lang="en">
9
+ <head>
10
+ <meta charset="utf-8">
11
+ <meta name="viewport" content="width=device-width, initial-scale=1">
12
+ <title>${u(t)}</title>
13
+ <link rel="stylesheet" href="${u(a)}">
14
+ </head>
15
+ <body>
16
+ <main class="kan-main">
17
+ ${r}${n}
18
+ </main>
19
+ </body>
20
+ </html>
21
+ `}hasSvgDerivation(e){let n=new Set,t=I(e);for(;t.length>0;){let a=t.shift(),r=_(a.subject);if(n.has(r))continue;n.add(r);let o=b(this.catalog,a.subject);if(o){for(let i of o.statement)if(i instanceof k&&g(i,"kanonak.org","derivation","derivations")){for(let c of i.object??[])if(c instanceof j)for(let f of c.statement){if(!(f instanceof d)||!g(f,"kanonak.org","derivation","format")||!(f.object instanceof l))continue;let p=f.object.subject;if(p.publisher==="kanonak.org"&&p.package_==="formats"&&p.name==="svg")return!0}}for(let i of E(o))t.push(i)}}return!1}renderBand(e,n,t){let a=ne(e);return a?v(a,z)?this.renderHero(e,n,t):v(a,A)?this.renderPropertyList(e,n,t):v(a,q)?this.renderBadgeRow(e,n,t):v(a,W)?this.renderChipRow(e,n,t):v(a,G)?this.renderReferenceList(e,n,t):`<!-- LookRenderer: unsupported band ${a.publisher}/${a.package_}/${a.name} -->`:"<!-- LookRenderer: band has no rdf:type -->"}renderHero(e,n,t){let a=['<header class="kan-hero">'],r=h(e,J);if(r){let p=this.readPropertyValueText(n,r);p&&a.push(`<span class="kan-hero-eyebrow">${u(p)}</span>`)}let o=h(e,Y),i="";o&&(i=this.readPropertyValueText(n,o)??""),i||(i=n.name),a.push(`<h1 class="kan-hero-title">${u(i)}</h1>`);let c=h(e,Q);if(c){let p=this.readPropertyValueText(n,c);p&&a.push(`<p class="kan-hero-subtitle">${u(p)}</p>`)}let f=h(e,T);if(f){let p=this.readPropertyValueReferences(n,f);if(p.length>0){let D=p.map(M=>this.renderBadge(M,T,t)).join("");a.push(`<div class="kan-hero-badges">${D}</div>`)}}return a.push("</header>"),a.join(`
22
+ `)}renderPropertyList(e,n,t){let a=h(e,K);if(!a)return"<!-- LookRenderer: PropertyList missing look.source -->";let r=this.readLabelForUri(a)??a.name,o=x(n,a),i=this.gatherValueItems(o),c=i.length>0?i.map(f=>`<li>${this.renderInlineValue(f,K,t)}</li>`).join(""):'<li class="kan-empty">(no values)</li>';return['<section class="kan-property-list">',`<h3 class="kan-property-list-title">${u(r)}</h3>`,`<ul class="kan-property-list-items">${c}</ul>`,"</section>"].join(`
23
+ `)}renderBadgeRow(e,n,t){let a=h(e,K);if(!a)return"<!-- LookRenderer: BadgeRow missing look.source -->";let r=this.readPropertyValueReferences(n,a);return r.length===0?"":`<div class="kan-badge-row">${r.map(i=>this.renderBadge(i,K,t)).join("")}</div>`}renderChipRow(e,n,t){let a=H(e,X);if(a.length===0)return"<!-- LookRenderer: ChipRow has no look.chips -->";let r=[];for(let o of a){let i=x(n,o);if(!i)continue;let c=this.readLabelForUri(o)??o.name,f=this.renderStatementInlineValue(i,o,t);f&&r.push(`<span class="kan-chip"><span class="kan-chip-key">${u(c)}</span> <span class="kan-chip-val">${f}</span></span>`)}return r.length===0?"":`<div class="kan-chip-row">${r.join("")}</div>`}renderReferenceList(e,n,t){let a=H(e,B);if(a.length===0)return"<!-- LookRenderer: ReferenceList has no look.entries -->";let r=[];for(let o of a){let i=this.readPropertyValueReferences(n,o);if(i.length===0)continue;let c=this.readLabelForUri(o)??o.name,f=i.map(p=>this.renderReferenceLink(p,B,t)).join(", ");r.push(`<dt>${u(c)}</dt><dd>${f}</dd>`)}return r.length===0?"":`<dl class="kan-reference-list">${r.join("")}</dl>`}readPropertyValueText(e,n){let t=x(e,n);if(t){if(t instanceof m)return t.object;if(t instanceof d){let a=t.object;return this.readLabelForUri({publisher:a.subject.publisher,package_:a.subject.package_,name:a.subject.name})??a.subject.name}if(t instanceof k)return(t.object??[]).map(r=>r instanceof l?this.readLabelForUri({publisher:r.subject.publisher,package_:r.subject.package_,name:r.subject.name})??r.subject.name:r instanceof j?r.name??"":String(r)).filter(r=>r).join(", ")}}readPropertyValueReferences(e,n){let t=x(e,n);if(!t)return[];if(t instanceof d)return[t.object];if(t instanceof k){let a=[];for(let r of t.object??[])r instanceof l&&a.push(r);return a}return[]}gatherValueItems(e){return e?e instanceof k?e.object??[]:e instanceof d?[e.object]:e instanceof y?[e.object]:e instanceof m?[e.object]:[]:[]}renderInlineValue(e,n,t){return e instanceof l?this.renderReferenceLink(e,n,t):e instanceof j?u(e.name??"(embedded)"):typeof e=="string"?u(e):typeof e=="number"||typeof e=="boolean"?u(String(e)):""}renderStatementInlineValue(e,n,t){return e instanceof m?u(e.object):e instanceof d?this.renderReferenceLink(e.object,n,t):e instanceof k?(e.object??[]).map(r=>this.renderInlineValue(r,n,t)).filter(r=>r).join(", "):""}renderReferenceLink(e,n,t){let a=this.readLabelForUri({publisher:e.subject.publisher,package_:e.subject.package_,name:e.subject.name})??e.subject.name,r=this.urlForReference(e,n,t);return`<a class="kan-link" href="${u(r)}">${u(a)}</a>`}renderBadge(e,n,t){let a=this.readLabelForUri({publisher:e.subject.publisher,package_:e.subject.package_,name:e.subject.name})??e.subject.name,r=this.readCommentForUri({publisher:e.subject.publisher,package_:e.subject.package_,name:e.subject.name}),o=this.urlForReference(e,n,t),i=r?` title="${u(r)}"`:"";return`<a class="kan-badge" href="${u(o)}"${i}>${u(a)}</a>`}urlForReference(e,n,t){let a=n?this.getUrlFormForProperty(n):"=";return P.formatResourceUrl({publisher:e.subject.publisher,package_:e.subject.package_,...e.subject.version?{version:e.subject.version}:{},name:e.subject.name},a,{contextPublisher:t})}getUrlFormForProperty(e){let n=b(this.catalog,e);if(!n)return"=";let t=w(n,Z);return t==="*"||t==="^"||t==="~"||t==="="?t:"="}readLabelForUri(e){let n=b(this.catalog,e);if(n)return w(n,C)}readCommentForUri(e){let n=b(this.catalog,e);if(n)return w(n,N)}};function $(s){let e=new Map;for(let n of s.statement){if(!(n instanceof y)||!g(n,U.publisher,U.package_,U.name))continue;let t=n.object;for(let a of t.statement){if(!(a instanceof m))continue;let r=a.predicate?.subject?.name;if(!r)continue;let o=a.object;e.set(r,o)}return e}return e}function V(s){for(let e of s.statement)if(e instanceof y&&g(e,L.publisher,L.package_,L.name))return e.object}function ee(s){for(let e of s.statement){if(!(e instanceof k)||!g(e,O.publisher,O.package_,O.name))continue;let n=[];for(let t of e.object??[])t instanceof j&&n.push(t);return n}return[]}function ne(s){for(let e of s.statement)if(e instanceof d&&e.predicate?.subject?.name==="type"&&e.object instanceof l){let n=e.object.subject;return{publisher:n.publisher,package_:n.package_,name:n.name}}}function h(s,e){for(let n of s.statement)if(n instanceof d&&g(n,e.publisher,e.package_,e.name)&&n.object instanceof l){let t=n.object.subject;return{publisher:t.publisher,package_:t.package_,name:t.name}}}function H(s,e){for(let n of s.statement){if(!(n instanceof k)||!g(n,e.publisher,e.package_,e.name))continue;let t=[];for(let a of n.object??[])a instanceof l&&t.push({publisher:a.subject.publisher,package_:a.subject.package_,name:a.subject.name});return t}return[]}function x(s,e){for(let n of s.statement)if(g(n,e.publisher,e.package_,e.name))return n}function w(s,e){for(let n of s.statement)if(n instanceof m&&g(n,e.publisher,e.package_,e.name))return n.object}function I(s){let e=[];for(let n of s.statement)if(n instanceof d){if(n.predicate?.subject?.name!=="type")continue;n.object instanceof l&&e.push(n.object)}else if(n instanceof k){if(n.predicate?.subject?.name!=="type")continue;for(let t of n.object??[])t instanceof l&&e.push(t)}return e}function E(s){let e=[];for(let n of s.statement)if(n instanceof d){if(n.predicate?.subject?.name!=="subClassOf")continue;n.object instanceof l&&e.push(n.object)}else if(n instanceof k){if(n.predicate?.subject?.name!=="subClassOf")continue;for(let t of n.object??[])t instanceof l&&e.push(t)}return e}function b(s,e){let n="version"in e?e.version:void 0;if(n){let t=`${e.publisher}/${e.package_}@${n.major}.${n.minor}.${n.patch}`;for(let a of s)if(a instanceof S&&a.name===e.name&&a.namespace===t)return a}for(let t of s){if(!(t instanceof S)||t.name!==e.name)continue;if((t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))return t}}function g(s,e,n,t){let a=s.predicate?.subject;return a?a.publisher===e&&a.package_===n&&a.name===t:!1}function v(s,e){return s.publisher===e.publisher&&s.package_===e.package_&&s.name===e.name}function _(s){return`${s.publisher}/${s.package_}/${s.name}`}function te(s){let e=s.namespace||"",n=e.indexOf("/");return n>=0?e.substring(0,n):e}function u(s){return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}var ae=`
24
+ * { box-sizing: border-box; }
25
+ body {
26
+ background: var(--kan-bg);
27
+ color: var(--kan-text);
28
+ font-family: var(--kan-font-body);
29
+ line-height: var(--kan-line-height-body);
30
+ margin: 0;
31
+ }
32
+ a { color: var(--kan-accent); text-decoration: none; }
33
+ a:hover { color: var(--kan-accent-hover); text-decoration: underline; }
34
+
35
+ /* Hero band */
36
+ .kan-hero {
37
+ padding: 32px 0 24px;
38
+ border-bottom: 1px solid var(--kan-border);
39
+ margin-bottom: 32px;
40
+ }
41
+ .kan-hero-eyebrow {
42
+ font-family: var(--kan-font-mono);
43
+ font-size: 11px;
44
+ color: var(--kan-accent);
45
+ letter-spacing: 0.18em;
46
+ text-transform: uppercase;
47
+ margin-bottom: 12px;
48
+ display: block;
49
+ }
50
+ .kan-hero-title {
51
+ font-family: var(--kan-font-display);
52
+ font-size: 32px;
53
+ font-weight: 600;
54
+ letter-spacing: -0.015em;
55
+ margin: 0 0 12px;
56
+ line-height: var(--kan-line-height-heading);
57
+ color: var(--kan-text);
58
+ }
59
+ .kan-hero-subtitle {
60
+ font-size: 17px;
61
+ color: var(--kan-text-dim);
62
+ font-weight: 300;
63
+ line-height: 1.55;
64
+ margin: 0 0 16px;
65
+ }
66
+ .kan-hero-badges {
67
+ display: flex;
68
+ flex-wrap: wrap;
69
+ gap: 6px;
70
+ margin-top: 12px;
71
+ }
72
+
73
+ /* PropertyList band */
74
+ .kan-property-list {
75
+ margin: 24px 0;
76
+ }
77
+ .kan-property-list-title {
78
+ font-family: var(--kan-font-mono);
79
+ font-size: 11px;
80
+ letter-spacing: 0.18em;
81
+ text-transform: uppercase;
82
+ color: var(--kan-text-dim);
83
+ margin: 0 0 12px;
84
+ font-weight: 600;
85
+ }
86
+ .kan-property-list-items {
87
+ list-style: none;
88
+ padding: 0;
89
+ margin: 0;
90
+ display: flex;
91
+ flex-direction: column;
92
+ gap: 6px;
93
+ }
94
+ .kan-property-list-items > li {
95
+ color: var(--kan-text);
96
+ }
97
+ .kan-property-list-items > li.kan-empty {
98
+ color: var(--kan-text-faint);
99
+ font-style: italic;
100
+ }
101
+
102
+ /* BadgeRow band */
103
+ .kan-badge-row {
104
+ display: flex;
105
+ flex-wrap: wrap;
106
+ gap: 6px;
107
+ margin: 16px 0;
108
+ }
109
+
110
+ /* Badge (used by Hero badges + BadgeRow) */
111
+ .kan-badge {
112
+ display: inline-block;
113
+ padding: 2px 8px;
114
+ background: var(--kan-badge-bg);
115
+ color: var(--kan-badge-fg);
116
+ border-radius: var(--kan-radius-sm);
117
+ font-size: 11px;
118
+ font-weight: 500;
119
+ text-decoration: none;
120
+ letter-spacing: 0.02em;
121
+ }
122
+ .kan-badge:hover {
123
+ filter: brightness(1.1);
124
+ text-decoration: none;
125
+ }
126
+
127
+ /* ChipRow band */
128
+ .kan-chip-row {
129
+ display: flex;
130
+ flex-wrap: wrap;
131
+ gap: 8px;
132
+ margin: 16px 0;
133
+ }
134
+ .kan-chip {
135
+ display: inline-flex;
136
+ align-items: center;
137
+ gap: 6px;
138
+ padding: 5px 10px;
139
+ background: var(--kan-bg-card);
140
+ border: 1px solid var(--kan-border);
141
+ border-radius: var(--kan-radius-sm);
142
+ font-family: var(--kan-font-mono);
143
+ font-size: 11px;
144
+ text-transform: uppercase;
145
+ letter-spacing: 0.04em;
146
+ }
147
+ .kan-chip-key { color: var(--kan-text-faint); }
148
+ .kan-chip-val { color: var(--kan-text); font-weight: 500; }
149
+
150
+ /* ReferenceList band */
151
+ dl.kan-reference-list {
152
+ display: grid;
153
+ grid-template-columns: max-content 1fr;
154
+ gap: 8px 16px;
155
+ margin: 16px 0;
156
+ padding: 16px 18px;
157
+ background: var(--kan-bg-card);
158
+ border: 1px solid var(--kan-border);
159
+ border-radius: var(--kan-radius);
160
+ }
161
+ dl.kan-reference-list dt {
162
+ font-family: var(--kan-font-mono);
163
+ font-size: 11px;
164
+ text-transform: uppercase;
165
+ letter-spacing: 0.1em;
166
+ color: var(--kan-text-faint);
167
+ align-self: center;
168
+ }
169
+ dl.kan-reference-list dd { margin: 0; align-self: center; }
170
+
171
+ /* Link (used by reference values across bands) */
172
+ .kan-link {
173
+ color: var(--kan-accent);
174
+ text-decoration: none;
175
+ }
176
+ .kan-link:hover {
177
+ color: var(--kan-accent-hover);
178
+ text-decoration: underline;
179
+ }
180
+ `.trim();export{F as a};
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{a as Ze,b as Qe,c as et,d as tt,e as rt,f as nt,g as ot,h as at,i as it,j as st}from"./chunk-NYXIGTTH.js";import{a as Yt}from"./chunk-7C5JUPYB.js";import{a as qe,b as Ye,c as Xe,d as b,e as S,f as i}from"./chunk-VLBP5CHO.js";import{a as qt}from"./chunk-ROCCA4BY.js";import{a as Te,b as je,c as Le,d as Fe,e as Ne}from"./chunk-AZSZXLEH.js";import{a as Be,b as De,c as Oe,d as Ae}from"./chunk-AV4AVTI6.js";import{a as lt,b as dt,c as ut,d as pt}from"./chunk-63NJ25ZX.js";import{a as Je,b as mt,c as ft,d as yt,e as ht}from"./chunk-4TJZIM7A.js";import{a as gt}from"./chunk-NIGFQYVA.js";import{A as Mt,B as zt,C as Gt,D as Wt,E as Jt,a as kt,b as bt,c as St,d as Ct,e as Pt,f as Rt,g as wt,h as xt,i as $t,j as vt,k as Et,l as Kt,m as Bt,n as It,o as Tt,p as jt,q as Lt,r as Ft,s as Nt,t as Dt,u as Ot,v as At,w as Ut,x as Vt,y as Ht,z as _t}from"./chunk-PB2RWBJN.js";import"./chunk-FJ35VIV6.js";import{a as F,b as D,c as Me,e as We}from"./chunk-R2V7IXWN.js";import{a as Ue,b as j,c as L,d as N,e as He,f as _e,g as O,h as A,i as U,j as V,k as H,l as _}from"./chunk-W6T7MOKY.js";import{a as Ie}from"./chunk-MYITGTGJ.js";import{a as Pe,b as Re,c as we,d as xe,e as $e,f as ve,g as Ee,h as Ke}from"./chunk-FQHALFRR.js";import{b as ze,c as Ge}from"./chunk-IXE5THUW.js";import{a as Ve}from"./chunk-FUUTGGJS.js";import{a as ct}from"./chunk-ODIECDN7.js";import{VersionOperator as oo}from"@kanonak-protocol/types/document/models/enums";import{existsSync as fr,readFileSync as yr}from"fs";import{homedir as gr}from"os";import{join as hr}from"path";import{execFile as Xt}from"child_process";import{promisify as Zt}from"util";var C=Zt(Xt),P="kanonak",R="/usr/bin/security",p=class{async get(e){let r=i(e);try{let{stdout:n}=await C(R,["find-generic-password","-s",P,"-a",r,"-w"],{timeout:1e4});try{return JSON.parse(n.trim())}catch{throw new Error(`Stored credential for '${r}' is corrupted (not valid JSON).
1
+ import{a as Ze,b as Qe,c as et,d as tt,e as rt,f as nt,g as ot,h as at,i as it,j as st}from"./chunk-NYXIGTTH.js";import{a as Yt}from"./chunk-LNAF54OC.js";import{a as qe,b as Ye,c as Xe,d as b,e as S,f as i}from"./chunk-VLBP5CHO.js";import{a as qt}from"./chunk-ROCCA4BY.js";import{a as Te,b as je,c as Le,d as Fe,e as Ne}from"./chunk-AZSZXLEH.js";import{a as Be,b as De,c as Oe,d as Ae}from"./chunk-AV4AVTI6.js";import{a as lt,b as dt,c as ut,d as pt}from"./chunk-63NJ25ZX.js";import{a as Je,b as mt,c as ft,d as yt,e as ht}from"./chunk-4TJZIM7A.js";import{a as gt}from"./chunk-NIGFQYVA.js";import{A as Mt,B as zt,C as Gt,D as Wt,E as Jt,a as kt,b as bt,c as St,d as Ct,e as Pt,f as Rt,g as wt,h as xt,i as $t,j as vt,k as Et,l as Kt,m as Bt,n as It,o as Tt,p as jt,q as Lt,r as Ft,s as Nt,t as Dt,u as Ot,v as At,w as Ut,x as Vt,y as Ht,z as _t}from"./chunk-PB2RWBJN.js";import"./chunk-FJ35VIV6.js";import{a as F,b as D,c as Me,e as We}from"./chunk-R2V7IXWN.js";import{a as Ue,b as j,c as L,d as N,e as He,f as _e,g as O,h as A,i as U,j as V,k as H,l as _}from"./chunk-W6T7MOKY.js";import{a as Ie}from"./chunk-MYITGTGJ.js";import{a as Pe,b as Re,c as we,d as xe,e as $e,f as ve,g as Ee,h as Ke}from"./chunk-FQHALFRR.js";import{b as ze,c as Ge}from"./chunk-IXE5THUW.js";import{a as Ve}from"./chunk-FUUTGGJS.js";import{a as ct}from"./chunk-ODIECDN7.js";import{VersionOperator as oo}from"@kanonak-protocol/types/document/models/enums";import{existsSync as fr,readFileSync as yr}from"fs";import{homedir as gr}from"os";import{join as hr}from"path";import{execFile as Xt}from"child_process";import{promisify as Zt}from"util";var C=Zt(Xt),P="kanonak",R="/usr/bin/security",p=class{async get(e){let r=i(e);try{let{stdout:n}=await C(R,["find-generic-password","-s",P,"-a",r,"-w"],{timeout:1e4});try{return JSON.parse(n.trim())}catch{throw new Error(`Stored credential for '${r}' is corrupted (not valid JSON).
2
2
  Run 'kanonak logout ${r}' then 'kanonak login ${r}' to fix.`)}}catch(n){if(X(n,44))return null;throw new Error(`macOS Keychain read failed for '${r}': ${w(n)}
3
3
  The Keychain may be locked or inaccessible.
4
4
  Try unlocking it via Keychain Access.app or running 'security unlock-keychain'.`)}}async store(e,r){let n=i(e),o=JSON.stringify(r);try{await C(R,["add-generic-password","-s",P,"-a",n,"-U","-w",o],{timeout:1e4})}catch(a){throw new Error(`macOS Keychain write failed for '${n}': ${w(a)}
@@ -75,6 +75,24 @@ export declare class LookRenderer {
75
75
  * Render the instance as body-only HTML using its cascaded look.
76
76
  */
77
77
  renderHtml(instance: SubjectKanonak): string;
78
+ /**
79
+ * Render the instance as a standalone HTML document — `<!doctype html>`
80
+ * with `<head>` (title, viewport, stylesheet link) wrapping the body
81
+ * bands from `renderHtml`. The stylesheet href points at
82
+ * `${instance.name}.css` (paired output of `renderStylesheet`).
83
+ *
84
+ * If the instance's class chain declares a `derivation.derivations`
85
+ * binding for `formats.svg`, an `<img src="${instance.name}.svg">`
86
+ * figure is inserted at the top of the body so per-resource visuals
87
+ * appear without authors needing a custom look.Figure band.
88
+ */
89
+ renderDocument(instance: SubjectKanonak): string;
90
+ /**
91
+ * True if the instance's class chain declares a `derivation.derivations`
92
+ * binding whose `derivation.format` is `kanonak.org/formats/svg`. Used by
93
+ * `renderDocument` to decide whether to emit an `<img>` figure.
94
+ */
95
+ private hasSvgDerivation;
78
96
  private renderBand;
79
97
  private renderHero;
80
98
  private renderPropertyList;
@@ -1,4 +1,4 @@
1
- import{b as E,c as F,d as f,f as M}from"../chunk-2JQMUZWN.js";import{a as ke}from"../chunk-7C5JUPYB.js";import{a as _e}from"../chunk-ROCCA4BY.js";import"../chunk-63NJ25ZX.js";import"../chunk-NIGFQYVA.js";import{a as Ne}from"../chunk-FJ35VIV6.js";import{a as C,c as Ue,e as Oe}from"../chunk-R2V7IXWN.js";import{b as K,c as w,d as b,g as B,h as U,i as O,j as V,k as T,l as S}from"../chunk-W6T7MOKY.js";import{a as Ce}from"../chunk-MYITGTGJ.js";import"../chunk-IXE5THUW.js";import"../chunk-FUUTGGJS.js";var wt="kanonak.org",St="document-ast",p=t=>({publisher:wt,package_:St,name:t}),h={Document:p("Document"),Block:p("Block"),Inline:p("Inline"),StructuredValue:p("StructuredValue"),Heading:p("Heading"),Paragraph:p("Paragraph"),RawBlock:p("RawBlock"),Text:p("Text"),StructuredMap:p("StructuredMap"),StructuredEntry:p("StructuredEntry"),StructuredList:p("StructuredList"),StringScalar:p("StringScalar"),IntegerScalar:p("IntegerScalar"),EscapeHint:p("EscapeHint"),MediaType:p("MediaType"),metadata:p("metadata"),children:p("children"),level:p("level"),inlines:p("inlines"),text:p("text"),entries:p("entries"),key:p("key"),value:p("value"),escapeHint:p("escapeHint"),items:p("items"),stringValue:p("stringValue"),integerValue:p("integerValue"),rawContent:p("rawContent"),mediaType:p("mediaType"),mimeType:p("mimeType"),ESC_RAW:p("esc-raw"),ESC_YAML_SAFE:p("esc-yaml-safe"),ESC_TOML_STRING:p("esc-toml-string"),ESC_TOML_MULTILINE:p("esc-toml-multiline"),ESC_JSON:p("esc-json"),ESC_DYNAMODB_BOOL:p("esc-dynamodb-bool"),ESC_DYNAMODB_NUMBER:p("esc-dynamodb-number"),ESC_DYNAMODB_NULL:p("esc-dynamodb-null"),TEXT_PLAIN:p("text-plain"),TEXT_MARKDOWN:p("text-markdown"),TEXT_HTML:p("text-html"),TEXT_CSS:p("text-css"),APPLICATION_JSON:p("application-json"),TEXT_YAML:p("text-yaml"),IMAGE_SVG_XML:p("image-svg-xml"),ResourceLink:p("ResourceLink"),target:p("target"),linkLabel:p("linkLabel"),PropertyList:p("PropertyList"),propertyEntries:p("propertyEntries"),PropertyEntry:p("PropertyEntry"),propertyKey:p("propertyKey"),propertyValue:p("propertyValue"),Table:p("Table"),tableColumnLabels:p("tableColumnLabels"),tableRows:p("tableRows"),TableRow:p("TableRow"),tableCells:p("tableCells")};function Me(t,e){return t.publisher===e.publisher&&t.package_===e.package_&&t.name===e.name}var Y=class{backendUri="kanonak.org/transformations/markdown-with-frontmatter";render(e,n){let r=Et(e.metadata,n),a=jt(e.children),u=["---",...r,"---","",a].join(`
1
+ import{b as E,c as F,d as f,f as M}from"../chunk-2JQMUZWN.js";import{a as ke}from"../chunk-LNAF54OC.js";import{a as _e}from"../chunk-ROCCA4BY.js";import"../chunk-63NJ25ZX.js";import"../chunk-NIGFQYVA.js";import{a as Ne}from"../chunk-FJ35VIV6.js";import{a as C,c as Ue,e as Oe}from"../chunk-R2V7IXWN.js";import{b as K,c as w,d as b,g as B,h as U,i as O,j as V,k as T,l as S}from"../chunk-W6T7MOKY.js";import{a as Ce}from"../chunk-MYITGTGJ.js";import"../chunk-IXE5THUW.js";import"../chunk-FUUTGGJS.js";var wt="kanonak.org",St="document-ast",p=t=>({publisher:wt,package_:St,name:t}),h={Document:p("Document"),Block:p("Block"),Inline:p("Inline"),StructuredValue:p("StructuredValue"),Heading:p("Heading"),Paragraph:p("Paragraph"),RawBlock:p("RawBlock"),Text:p("Text"),StructuredMap:p("StructuredMap"),StructuredEntry:p("StructuredEntry"),StructuredList:p("StructuredList"),StringScalar:p("StringScalar"),IntegerScalar:p("IntegerScalar"),EscapeHint:p("EscapeHint"),MediaType:p("MediaType"),metadata:p("metadata"),children:p("children"),level:p("level"),inlines:p("inlines"),text:p("text"),entries:p("entries"),key:p("key"),value:p("value"),escapeHint:p("escapeHint"),items:p("items"),stringValue:p("stringValue"),integerValue:p("integerValue"),rawContent:p("rawContent"),mediaType:p("mediaType"),mimeType:p("mimeType"),ESC_RAW:p("esc-raw"),ESC_YAML_SAFE:p("esc-yaml-safe"),ESC_TOML_STRING:p("esc-toml-string"),ESC_TOML_MULTILINE:p("esc-toml-multiline"),ESC_JSON:p("esc-json"),ESC_DYNAMODB_BOOL:p("esc-dynamodb-bool"),ESC_DYNAMODB_NUMBER:p("esc-dynamodb-number"),ESC_DYNAMODB_NULL:p("esc-dynamodb-null"),TEXT_PLAIN:p("text-plain"),TEXT_MARKDOWN:p("text-markdown"),TEXT_HTML:p("text-html"),TEXT_CSS:p("text-css"),APPLICATION_JSON:p("application-json"),TEXT_YAML:p("text-yaml"),IMAGE_SVG_XML:p("image-svg-xml"),ResourceLink:p("ResourceLink"),target:p("target"),linkLabel:p("linkLabel"),PropertyList:p("PropertyList"),propertyEntries:p("propertyEntries"),PropertyEntry:p("PropertyEntry"),propertyKey:p("propertyKey"),propertyValue:p("propertyValue"),Table:p("Table"),tableColumnLabels:p("tableColumnLabels"),tableRows:p("tableRows"),TableRow:p("TableRow"),tableCells:p("tableCells")};function Me(t,e){return t.publisher===e.publisher&&t.package_===e.package_&&t.name===e.name}var Y=class{backendUri="kanonak.org/transformations/markdown-with-frontmatter";render(e,n){let r=Et(e.metadata,n),a=jt(e.children),u=["---",...r,"---","",a].join(`
2
2
  `);return n?.trailingNewline&&(u.endsWith(`
3
3
  `)||(u+=`
4
4
  `)),u}};function Et(t,e){if(!t)return[];let n=new Map;for(let c of t.entries)n.set(ce(c.key),c);let r=new Map;if(e?.metadataRenames)for(let[c,l]of e.metadataRenames)r.set(ce(c),l);let i=(e?.metadataKeys??t.entries.map(c=>c.key)).map(ce),u=[];for(let c of i){let l=n.get(c);if(!l)continue;let m=r.get(c),g=ce(m??c),k=Ie(l.value,l.escapeHint);k!==void 0&&u.push(`${g}: ${k}`)}return u}function ce(t){let e=t.lastIndexOf(".");return e===-1?t:t.substring(e+1)||t}function Ie(t,e){switch(t.kind){case"StringScalar":return $t(t.stringValue,e);case"IntegerScalar":return String(t.integerValue);case"StructuredList":{let n=[];for(let r of t.items){let a=Ie(r,e);a!==void 0&&n.push(a)}return n.join(", ")}case"StructuredMap":return;default:return}}function $t(t,e){return!e||Me(e,h.ESC_RAW)?t:Me(e,h.ESC_YAML_SAFE)?vt(t):t}function vt(t){return t.includes(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanonak-protocol/sdk",
3
- "version": "3.27.1",
3
+ "version": "3.27.2",
4
4
  "description": "Kanonak Protocol SDK - Document repository and parsing implementations for TypeScript",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -113,7 +113,7 @@
113
113
  "yaml-parser"
114
114
  ],
115
115
  "dependencies": {
116
- "@kanonak-protocol/types": "^3.27.1",
116
+ "@kanonak-protocol/types": "^3.27.2",
117
117
  "ignore": "^7.0.5",
118
118
  "js-yaml": "^4.1.0",
119
119
  "yaml": "^2.7.0"
@@ -1,165 +0,0 @@
1
- import{a as $}from"./chunk-NIGFQYVA.js";import{a as _}from"./chunk-R2V7IXWN.js";import{c as S,d as p,g as m,j as d,k as v,l as k}from"./chunk-W6T7MOKY.js";var L={publisher:"kanonak.org",package_:"derivation",name:"look"},U={publisher:"kanonak.org",package_:"derivation",name:"tokens"},j={publisher:"kanonak.org",package_:"core-rdf",name:"Resource"},M={publisher:"kanonak.org",package_:"core-rdf",name:"label"},N={publisher:"kanonak.org",package_:"core-rdf",name:"comment"},z={publisher:"kanonak.org",package_:"look",name:"Hero"},A={publisher:"kanonak.org",package_:"look",name:"PropertyList"},W={publisher:"kanonak.org",package_:"look",name:"BadgeRow"},q={publisher:"kanonak.org",package_:"look",name:"ChipRow"},G={publisher:"kanonak.org",package_:"look",name:"ReferenceList"},O={publisher:"kanonak.org",package_:"look",name:"bands"},Y={publisher:"kanonak.org",package_:"look",name:"title"},J={publisher:"kanonak.org",package_:"look",name:"eyebrow"},Q={publisher:"kanonak.org",package_:"look",name:"subtitle"},F={publisher:"kanonak.org",package_:"look",name:"badges"},y={publisher:"kanonak.org",package_:"look",name:"source"},X={publisher:"kanonak.org",package_:"look",name:"chips"},P={publisher:"kanonak.org",package_:"look",name:"entries"},Z={publisher:"kanonak.org",package_:"look",name:"urlForm"},w=class{constructor(e){this.catalog=e}catalog;findCascadedLook(e){let n=new Set,t=B(e);for(;t.length>0;){let r=t.shift(),a=x(r.subject);if(n.has(a))continue;n.add(a);let s=g(this.catalog,r.subject);if(!s)continue;let i=C(s);if(i)return{declaration:i,sourceClass:{publisher:r.subject.publisher,package_:r.subject.package_,name:r.subject.name}};for(let c of V(s))t.push(c)}if(!n.has(x(j))){let r=g(this.catalog,j);if(r){let a=C(r);if(a)return{declaration:a,sourceClass:{...j}}}}}findCascadedTokens(e){let n=new Map;for(let[a,s]of I(e))n.has(a)||n.set(a,s);let t=new Set,r=B(e);for(;r.length>0;){let a=r.shift(),s=x(a.subject);if(t.has(s))continue;t.add(s);let i=g(this.catalog,a.subject);if(i){for(let[c,f]of I(i))n.has(c)||n.set(c,f);for(let c of V(i))r.push(c)}}if(!t.has(x(j))){let a=g(this.catalog,j);if(a)for(let[s,i]of I(a))n.has(s)||n.set(s,i)}return n}renderStylesheet(e){let n=this.findCascadedTokens(e),t=[];for(let[a,s]of n)t.push(` --kan-${a}: ${s};`);return`${t.length>0?`:root {
2
- ${t.join(`
3
- `)}
4
- }`:":root { /* no tokens resolved */ }"}
5
- ${re}`}renderHtml(e){let n=this.findCascadedLook(e);if(!n)return`<!-- LookRenderer: no derivation.look found for ${e.namespace}/${e.name} -->`;let t=ee(n.declaration);if(t.length===0)return"<!-- LookRenderer: look declaration has no bands -->";let r=te(e),a=[];for(let s of t)a.push(this.renderBand(s,e,r));return a.join(`
6
- `)}renderBand(e,n,t){let r=ne(e);return r?R(r,z)?this.renderHero(e,n,t):R(r,A)?this.renderPropertyList(e,n,t):R(r,W)?this.renderBadgeRow(e,n,t):R(r,q)?this.renderChipRow(e,n,t):R(r,G)?this.renderReferenceList(e,n,t):`<!-- LookRenderer: unsupported band ${r.publisher}/${r.package_}/${r.name} -->`:"<!-- LookRenderer: band has no rdf:type -->"}renderHero(e,n,t){let r=['<header class="kan-hero">'],a=h(e,J);if(a){let l=this.readPropertyValueText(n,a);l&&r.push(`<span class="kan-hero-eyebrow">${u(l)}</span>`)}let s=h(e,Y),i="";s&&(i=this.readPropertyValueText(n,s)??""),i||(i=n.name),r.push(`<h1 class="kan-hero-title">${u(i)}</h1>`);let c=h(e,Q);if(c){let l=this.readPropertyValueText(n,c);l&&r.push(`<p class="kan-hero-subtitle">${u(l)}</p>`)}let f=h(e,F);if(f){let l=this.readPropertyValueReferences(n,f);if(l.length>0){let H=l.map(D=>this.renderBadge(D,F,t)).join("");r.push(`<div class="kan-hero-badges">${H}</div>`)}}return r.push("</header>"),r.join(`
7
- `)}renderPropertyList(e,n,t){let r=h(e,y);if(!r)return"<!-- LookRenderer: PropertyList missing look.source -->";let a=this.readLabelForUri(r)??r.name,s=K(n,r),i=this.gatherValueItems(s),c=i.length>0?i.map(f=>`<li>${this.renderInlineValue(f,y,t)}</li>`).join(""):'<li class="kan-empty">(no values)</li>';return['<section class="kan-property-list">',`<h3 class="kan-property-list-title">${u(a)}</h3>`,`<ul class="kan-property-list-items">${c}</ul>`,"</section>"].join(`
8
- `)}renderBadgeRow(e,n,t){let r=h(e,y);if(!r)return"<!-- LookRenderer: BadgeRow missing look.source -->";let a=this.readPropertyValueReferences(n,r);return a.length===0?"":`<div class="kan-badge-row">${a.map(i=>this.renderBadge(i,y,t)).join("")}</div>`}renderChipRow(e,n,t){let r=T(e,X);if(r.length===0)return"<!-- LookRenderer: ChipRow has no look.chips -->";let a=[];for(let s of r){let i=K(n,s);if(!i)continue;let c=this.readLabelForUri(s)??s.name,f=this.renderStatementInlineValue(i,s,t);f&&a.push(`<span class="kan-chip"><span class="kan-chip-key">${u(c)}</span> <span class="kan-chip-val">${f}</span></span>`)}return a.length===0?"":`<div class="kan-chip-row">${a.join("")}</div>`}renderReferenceList(e,n,t){let r=T(e,P);if(r.length===0)return"<!-- LookRenderer: ReferenceList has no look.entries -->";let a=[];for(let s of r){let i=this.readPropertyValueReferences(n,s);if(i.length===0)continue;let c=this.readLabelForUri(s)??s.name,f=i.map(l=>this.renderReferenceLink(l,P,t)).join(", ");a.push(`<dt>${u(c)}</dt><dd>${f}</dd>`)}return a.length===0?"":`<dl class="kan-reference-list">${a.join("")}</dl>`}readPropertyValueText(e,n){let t=K(e,n);if(t){if(t instanceof m)return t.object;if(t instanceof d){let r=t.object;return this.readLabelForUri({publisher:r.subject.publisher,package_:r.subject.package_,name:r.subject.name})??r.subject.name}if(t instanceof k)return(t.object??[]).map(a=>a instanceof p?this.readLabelForUri({publisher:a.subject.publisher,package_:a.subject.package_,name:a.subject.name})??a.subject.name:a instanceof _?a.name??"":String(a)).filter(a=>a).join(", ")}}readPropertyValueReferences(e,n){let t=K(e,n);if(!t)return[];if(t instanceof d)return[t.object];if(t instanceof k){let r=[];for(let a of t.object??[])a instanceof p&&r.push(a);return r}return[]}gatherValueItems(e){return e?e instanceof k?e.object??[]:e instanceof d?[e.object]:e instanceof v?[e.object]:e instanceof m?[e.object]:[]:[]}renderInlineValue(e,n,t){return e instanceof p?this.renderReferenceLink(e,n,t):e instanceof _?u(e.name??"(embedded)"):typeof e=="string"?u(e):typeof e=="number"||typeof e=="boolean"?u(String(e)):""}renderStatementInlineValue(e,n,t){return e instanceof m?u(e.object):e instanceof d?this.renderReferenceLink(e.object,n,t):e instanceof k?(e.object??[]).map(a=>this.renderInlineValue(a,n,t)).filter(a=>a).join(", "):""}renderReferenceLink(e,n,t){let r=this.readLabelForUri({publisher:e.subject.publisher,package_:e.subject.package_,name:e.subject.name})??e.subject.name,a=this.urlForReference(e,n,t);return`<a class="kan-link" href="${u(a)}">${u(r)}</a>`}renderBadge(e,n,t){let r=this.readLabelForUri({publisher:e.subject.publisher,package_:e.subject.package_,name:e.subject.name})??e.subject.name,a=this.readCommentForUri({publisher:e.subject.publisher,package_:e.subject.package_,name:e.subject.name}),s=this.urlForReference(e,n,t),i=a?` title="${u(a)}"`:"";return`<a class="kan-badge" href="${u(s)}"${i}>${u(r)}</a>`}urlForReference(e,n,t){let r=n?this.getUrlFormForProperty(n):"=";return $.formatResourceUrl({publisher:e.subject.publisher,package_:e.subject.package_,...e.subject.version?{version:e.subject.version}:{},name:e.subject.name},r,{contextPublisher:t})}getUrlFormForProperty(e){let n=g(this.catalog,e);if(!n)return"=";let t=E(n,Z);return t==="*"||t==="^"||t==="~"||t==="="?t:"="}readLabelForUri(e){let n=g(this.catalog,e);if(n)return E(n,M)}readCommentForUri(e){let n=g(this.catalog,e);if(n)return E(n,N)}};function I(o){let e=new Map;for(let n of o.statement){if(!(n instanceof v)||!b(n,U.publisher,U.package_,U.name))continue;let t=n.object;for(let r of t.statement){if(!(r instanceof m))continue;let a=r.predicate?.subject?.name;if(!a)continue;let s=r.object;e.set(a,s)}return e}return e}function C(o){for(let e of o.statement)if(e instanceof v&&b(e,L.publisher,L.package_,L.name))return e.object}function ee(o){for(let e of o.statement){if(!(e instanceof k)||!b(e,O.publisher,O.package_,O.name))continue;let n=[];for(let t of e.object??[])t instanceof _&&n.push(t);return n}return[]}function ne(o){for(let e of o.statement)if(e instanceof d&&e.predicate?.subject?.name==="type"&&e.object instanceof p){let n=e.object.subject;return{publisher:n.publisher,package_:n.package_,name:n.name}}}function h(o,e){for(let n of o.statement)if(n instanceof d&&b(n,e.publisher,e.package_,e.name)&&n.object instanceof p){let t=n.object.subject;return{publisher:t.publisher,package_:t.package_,name:t.name}}}function T(o,e){for(let n of o.statement){if(!(n instanceof k)||!b(n,e.publisher,e.package_,e.name))continue;let t=[];for(let r of n.object??[])r instanceof p&&t.push({publisher:r.subject.publisher,package_:r.subject.package_,name:r.subject.name});return t}return[]}function K(o,e){for(let n of o.statement)if(b(n,e.publisher,e.package_,e.name))return n}function E(o,e){for(let n of o.statement)if(n instanceof m&&b(n,e.publisher,e.package_,e.name))return n.object}function B(o){let e=[];for(let n of o.statement)if(n instanceof d){if(n.predicate?.subject?.name!=="type")continue;n.object instanceof p&&e.push(n.object)}else if(n instanceof k){if(n.predicate?.subject?.name!=="type")continue;for(let t of n.object??[])t instanceof p&&e.push(t)}return e}function V(o){let e=[];for(let n of o.statement)if(n instanceof d){if(n.predicate?.subject?.name!=="subClassOf")continue;n.object instanceof p&&e.push(n.object)}else if(n instanceof k){if(n.predicate?.subject?.name!=="subClassOf")continue;for(let t of n.object??[])t instanceof p&&e.push(t)}return e}function g(o,e){let n="version"in e?e.version:void 0;if(n){let t=`${e.publisher}/${e.package_}@${n.major}.${n.minor}.${n.patch}`;for(let r of o)if(r instanceof S&&r.name===e.name&&r.namespace===t)return r}for(let t of o){if(!(t instanceof S)||t.name!==e.name)continue;if((t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))return t}}function b(o,e,n,t){let r=o.predicate?.subject;return r?r.publisher===e&&r.package_===n&&r.name===t:!1}function R(o,e){return o.publisher===e.publisher&&o.package_===e.package_&&o.name===e.name}function x(o){return`${o.publisher}/${o.package_}/${o.name}`}function te(o){let e=o.namespace||"",n=e.indexOf("/");return n>=0?e.substring(0,n):e}function u(o){return o.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}var re=`
9
- * { box-sizing: border-box; }
10
- body {
11
- background: var(--kan-bg);
12
- color: var(--kan-text);
13
- font-family: var(--kan-font-body);
14
- line-height: var(--kan-line-height-body);
15
- margin: 0;
16
- }
17
- a { color: var(--kan-accent); text-decoration: none; }
18
- a:hover { color: var(--kan-accent-hover); text-decoration: underline; }
19
-
20
- /* Hero band */
21
- .kan-hero {
22
- padding: 32px 0 24px;
23
- border-bottom: 1px solid var(--kan-border);
24
- margin-bottom: 32px;
25
- }
26
- .kan-hero-eyebrow {
27
- font-family: var(--kan-font-mono);
28
- font-size: 11px;
29
- color: var(--kan-accent);
30
- letter-spacing: 0.18em;
31
- text-transform: uppercase;
32
- margin-bottom: 12px;
33
- display: block;
34
- }
35
- .kan-hero-title {
36
- font-family: var(--kan-font-display);
37
- font-size: 32px;
38
- font-weight: 600;
39
- letter-spacing: -0.015em;
40
- margin: 0 0 12px;
41
- line-height: var(--kan-line-height-heading);
42
- color: var(--kan-text);
43
- }
44
- .kan-hero-subtitle {
45
- font-size: 17px;
46
- color: var(--kan-text-dim);
47
- font-weight: 300;
48
- line-height: 1.55;
49
- margin: 0 0 16px;
50
- }
51
- .kan-hero-badges {
52
- display: flex;
53
- flex-wrap: wrap;
54
- gap: 6px;
55
- margin-top: 12px;
56
- }
57
-
58
- /* PropertyList band */
59
- .kan-property-list {
60
- margin: 24px 0;
61
- }
62
- .kan-property-list-title {
63
- font-family: var(--kan-font-mono);
64
- font-size: 11px;
65
- letter-spacing: 0.18em;
66
- text-transform: uppercase;
67
- color: var(--kan-text-dim);
68
- margin: 0 0 12px;
69
- font-weight: 600;
70
- }
71
- .kan-property-list-items {
72
- list-style: none;
73
- padding: 0;
74
- margin: 0;
75
- display: flex;
76
- flex-direction: column;
77
- gap: 6px;
78
- }
79
- .kan-property-list-items > li {
80
- color: var(--kan-text);
81
- }
82
- .kan-property-list-items > li.kan-empty {
83
- color: var(--kan-text-faint);
84
- font-style: italic;
85
- }
86
-
87
- /* BadgeRow band */
88
- .kan-badge-row {
89
- display: flex;
90
- flex-wrap: wrap;
91
- gap: 6px;
92
- margin: 16px 0;
93
- }
94
-
95
- /* Badge (used by Hero badges + BadgeRow) */
96
- .kan-badge {
97
- display: inline-block;
98
- padding: 2px 8px;
99
- background: var(--kan-badge-bg);
100
- color: var(--kan-badge-fg);
101
- border-radius: var(--kan-radius-sm);
102
- font-size: 11px;
103
- font-weight: 500;
104
- text-decoration: none;
105
- letter-spacing: 0.02em;
106
- }
107
- .kan-badge:hover {
108
- filter: brightness(1.1);
109
- text-decoration: none;
110
- }
111
-
112
- /* ChipRow band */
113
- .kan-chip-row {
114
- display: flex;
115
- flex-wrap: wrap;
116
- gap: 8px;
117
- margin: 16px 0;
118
- }
119
- .kan-chip {
120
- display: inline-flex;
121
- align-items: center;
122
- gap: 6px;
123
- padding: 5px 10px;
124
- background: var(--kan-bg-card);
125
- border: 1px solid var(--kan-border);
126
- border-radius: var(--kan-radius-sm);
127
- font-family: var(--kan-font-mono);
128
- font-size: 11px;
129
- text-transform: uppercase;
130
- letter-spacing: 0.04em;
131
- }
132
- .kan-chip-key { color: var(--kan-text-faint); }
133
- .kan-chip-val { color: var(--kan-text); font-weight: 500; }
134
-
135
- /* ReferenceList band */
136
- dl.kan-reference-list {
137
- display: grid;
138
- grid-template-columns: max-content 1fr;
139
- gap: 8px 16px;
140
- margin: 16px 0;
141
- padding: 16px 18px;
142
- background: var(--kan-bg-card);
143
- border: 1px solid var(--kan-border);
144
- border-radius: var(--kan-radius);
145
- }
146
- dl.kan-reference-list dt {
147
- font-family: var(--kan-font-mono);
148
- font-size: 11px;
149
- text-transform: uppercase;
150
- letter-spacing: 0.1em;
151
- color: var(--kan-text-faint);
152
- align-self: center;
153
- }
154
- dl.kan-reference-list dd { margin: 0; align-self: center; }
155
-
156
- /* Link (used by reference values across bands) */
157
- .kan-link {
158
- color: var(--kan-accent);
159
- text-decoration: none;
160
- }
161
- .kan-link:hover {
162
- color: var(--kan-accent-hover);
163
- text-decoration: underline;
164
- }
165
- `.trim();export{w as a};