@kubed.io/cdn 0.0.1 → 0.0.4

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 (62) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +33 -5
  3. package/dist/chunks/define-XzEniRJH.js +10 -0
  4. package/dist/chunks/define-XzEniRJH.js.map +1 -0
  5. package/dist/chunks/element-ChNBLJ5X.js +632 -0
  6. package/dist/chunks/element-ChNBLJ5X.js.map +1 -0
  7. package/dist/chunks/kd-Bbw0GeQ5.js +1149 -0
  8. package/dist/chunks/kd-Bbw0GeQ5.js.map +1 -0
  9. package/dist/chunks/scene-CUr0fSXC.js +240 -0
  10. package/dist/chunks/scene-CUr0fSXC.js.map +1 -0
  11. package/dist/k8s/elements/events.d.ts +54 -0
  12. package/dist/k8s/elements/object.d.ts +47 -0
  13. package/dist/k8s/elements/ref.d.ts +45 -0
  14. package/dist/k8s/events.d.ts +63 -0
  15. package/dist/k8s/icons.d.ts +18 -0
  16. package/dist/k8s/index.d.ts +13 -0
  17. package/dist/k8s/links.d.ts +72 -0
  18. package/dist/k8s/map.d.ts +114 -0
  19. package/dist/k8s.js +909 -0
  20. package/dist/k8s.js.map +1 -0
  21. package/dist/kd/cell.d.ts +45 -0
  22. package/dist/kd/define.d.ts +0 -0
  23. package/dist/kd/element.d.ts +32 -0
  24. package/dist/kd/elements/bar.d.ts +33 -0
  25. package/dist/kd/elements/data.d.ts +27 -0
  26. package/dist/kd/elements/groups.d.ts +32 -0
  27. package/dist/kd/elements/link.d.ts +67 -0
  28. package/dist/kd/elements/mask.d.ts +22 -0
  29. package/dist/kd/elements/meter.d.ts +37 -0
  30. package/dist/kd/elements/pill.d.ts +15 -0
  31. package/dist/kd/elements/sheet.d.ts +28 -0
  32. package/dist/kd/elements/steps.d.ts +30 -0
  33. package/dist/kd/elements/table.d.ts +38 -0
  34. package/dist/kd/elements/tabs.d.ts +27 -0
  35. package/dist/kd/elements/tile.d.ts +19 -0
  36. package/dist/kd/helpers.d.ts +12 -0
  37. package/dist/kd/index.d.ts +30 -0
  38. package/dist/kd/parts.d.ts +15 -0
  39. package/dist/kd/scene.d.ts +178 -0
  40. package/dist/kd/theme.d.ts +2 -0
  41. package/dist/kd/yaml.d.ts +17 -0
  42. package/dist/kd.css +0 -0
  43. package/dist/kd.js +5 -64
  44. package/dist/n8n/config.d.ts +57 -0
  45. package/dist/n8n/fetch.d.ts +35 -0
  46. package/dist/n8n/history.d.ts +8 -0
  47. package/dist/n8n/index.d.ts +8 -0
  48. package/dist/n8n/metadata.d.ts +10 -0
  49. package/dist/n8n/mount.d.ts +29 -0
  50. package/dist/n8n/state.d.ts +44 -0
  51. package/dist/n8n/stream.d.ts +17 -0
  52. package/dist/n8n/styles.d.ts +1 -0
  53. package/dist/n8n.js +384 -0
  54. package/dist/n8n.js.map +1 -0
  55. package/dist/openapi/describe.d.ts +20 -0
  56. package/dist/openapi/index.d.ts +6 -0
  57. package/dist/openapi/model.d.ts +154 -0
  58. package/dist/openapi/schema.d.ts +52 -0
  59. package/dist/openapi.js +504 -0
  60. package/dist/openapi.js.map +1 -0
  61. package/package.json +18 -2
  62. package/dist/kd.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k8s.js","names":["nothing","nothing","nothing","b","i","A","json","KdElement","applyTheme","define","VERSION","timeRange","COMMUNITY","ARTWORK","ESO","DEVICON","resource","name","DEFAULT_ICON","CRD_ICON","KIND_ICONS","GROUP_ICONS","GROUP_SUFFIXES","BUILT_IN","apiGroup","v","apiVersion","cut","isBuiltInGroup","group","kindIcon","k","kind","exact","suffix","s","WORKLOAD_KINDS","DASHBOARDS","plural","apiPath","ref","root","ns","namespaceRoute","namespace","route","path","definitionRoute","icon","opt","refLink","text","title","to","img","namespaceLink","kindLink","SUFFIXES","QUANTITY","quantity","value","m","duration","seconds","ms","iso","age","t","now","ORDER","BYTES","scale","largest","resources","requests","container","limits","a","request","limit","used","usage","marks","factor","data","CONDITION_ORDER","NEGATIVE_CONDITIONS","CONDITION_LABELS","conditionOk","negative","c","because","conditions","list","obj","order","rank","created","ok","status","step","changed","why","sameRef","o","owners","chain","seen","walk","hash","key","found","related","r","labels","HIDDEN_ANNOTATIONS","annotations","out","code","pill","when","podRows","spec","ips","x","workloadRows","selector","sa","replicas","ROLE","nodeRows","info","address","type","cap","mem","summary","rows","f","PHASE_TONES","phaseTone","re","phase","ready","want","podChips","sidecars","main","all","restarts","n","tone","total","nodeChips","pressure","genericChips","good","lead","chips","bar","trimmed","_drop","metadata","WARNING_REASONS","isWarning","isFieldFrame","frameRows","columns","frame","eventRows","visit","input","labelsOf","l","row","timeOf","foldEvents","groups","message","g","eventsTable","ago","KdK8sEvents","base","#groups","pane","table","#end","KdK8sObject","steps","count","map","KdK8sRef","d"],"sources":["../src/k8s/icons.ts","../src/k8s/links.ts","../src/k8s/map.ts","../src/k8s/events.ts","../src/k8s/elements/events.ts","../src/k8s/elements/object.ts","../src/k8s/elements/ref.ts"],"sourcesContent":["// Kind -> icon. Every URL is pinned to a commit, so an upstream move or rename\n// never breaks a published version.\n\nconst COMMUNITY = 'https://cdn.jsdelivr.net/gh/kubernetes/community@149066325ed521eab576a262ddff8f4da074d5de/icons/svg/';\nconst ARTWORK = 'https://cdn.jsdelivr.net/gh/cncf/artwork@002662490acb2303c7301acc0256c00790e03e9f/projects/';\nconst ESO = 'https://cdn.jsdelivr.net/gh/external-secrets/external-secrets@088f9e5ff057d35bd9f68779893b691abb948b33/assets/';\nconst DEVICON = 'https://cdn.jsdelivr.net/gh/devicons/devicon@7330accdbc47e2dc0c19789a48533c4a3c50fe58/icons/';\n\nconst resource = (name: string) => `${COMMUNITY}resources/unlabeled/${name}.svg`;\n\n/** The Kubernetes wheel: a kind nobody drew an icon for. */\nexport const DEFAULT_ICON = `${ARTWORK}kubernetes/icon/color/kubernetes-icon-color.svg`;\n\n/** A custom resource whose group has no icon of its own. */\nexport const CRD_ICON = resource('crd');\n\n/** The kubernetes/community icon of each built-in kind that has one. */\nexport const KIND_ICONS: Readonly<Record<string, string>> = {\n Pod: resource('pod'),\n Deployment: resource('deploy'),\n StatefulSet: resource('sts'),\n DaemonSet: resource('ds'),\n ReplicaSet: resource('rs'),\n CronJob: resource('cronjob'),\n Job: resource('job'),\n Service: resource('svc'),\n Ingress: resource('ing'),\n IngressClass: resource('ing'),\n Endpoints: resource('ep'),\n EndpointSlice: resource('ep'),\n NetworkPolicy: resource('netpol'),\n ConfigMap: resource('cm'),\n Secret: resource('secret'),\n PersistentVolumeClaim: resource('pvc'),\n PersistentVolume: resource('pv'),\n StorageClass: resource('sc'),\n Volume: resource('vol'),\n ServiceAccount: resource('sa'),\n Role: resource('role'),\n RoleBinding: resource('rb'),\n ClusterRole: resource('c-role'),\n ClusterRoleBinding: resource('crb'),\n User: resource('user'),\n Group: resource('group'),\n Namespace: resource('ns'),\n ResourceQuota: resource('quota'),\n PriorityClass: resource('quota'),\n LimitRange: resource('limits'),\n HorizontalPodAutoscaler: resource('hpa'),\n PodSecurityPolicy: resource('psp'),\n CustomResourceDefinition: resource('crd'),\n Node: `${COMMUNITY}infrastructure_components/unlabeled/node.svg`,\n};\n\n/** The icon of each API group that has one; a group missing here falls back to `CRD_ICON`. */\nexport const GROUP_ICONS: Readonly<Record<string, string>> = {\n 'cert-manager.io': `${ARTWORK}cert-manager/icon/color/cert-manager-icon-color.svg`,\n 'external-secrets.io': `${ESO}eso-round-logo.svg`,\n 'postgresql.kubed.io': `${DEVICON}postgresql/postgresql-original.svg`,\n 'gcp.kubed.io': `${DEVICON}googlecloud/googlecloud-original.svg`,\n 'keycloak.kubed.io': `${ARTWORK}keycloak/icon/color/keycloak-icon-color.svg`,\n 'pkg.crossplane.io': `${ARTWORK}crossplane/icon/color/crossplane-icon-color.svg`,\n};\n\n// Groups whose kinds take their icon from the group, whatever the kind.\nconst GROUP_SUFFIXES: readonly [string, string][] = [\n ['crossplane.io', GROUP_ICONS['pkg.crossplane.io']],\n ['kubed.io', GROUP_ICONS['pkg.crossplane.io']],\n];\n\nconst BUILT_IN = /^(|apps|batch|policy|autoscaling|[a-z0-9.-]*\\.k8s\\.io)$/;\n\n/** The group of an apiVersion: `apps` for `apps/v1`, `''` for `v1`. */\nexport function apiGroup(apiVersion: string | null | undefined): string {\n const v = apiVersion ?? '';\n const cut = v.indexOf('/');\n return cut < 0 ? '' : v.slice(0, cut);\n}\n\n/** Whether a group is served by Kubernetes itself rather than a CRD or an aggregated API. */\nexport function isBuiltInGroup(group: string): boolean {\n return BUILT_IN.test(group);\n}\n\n/**\n * The icon of a kind. With an apiVersion, a custom resource takes its group's\n * icon (or the CRD icon), so a `ServiceAccount` of some operator's group is not\n * drawn as the core one. A kind with no icon at all gets `DEFAULT_ICON`.\n */\nexport function kindIcon(kind: string | null | undefined, apiVersion?: string | null): string {\n const k = kind ?? '';\n if (apiVersion != null && apiVersion !== '') {\n const group = apiGroup(apiVersion);\n if (!isBuiltInGroup(group)) {\n // ldap.kubed.io manages LDAP accounts: its kinds read as users.\n if (group === 'ldap.kubed.io') return KIND_ICONS[k === 'ServiceAccount' ? 'ServiceAccount' : 'User'];\n const exact = GROUP_ICONS[group];\n if (exact) return exact;\n const suffix = GROUP_SUFFIXES.find(([s]) => group === s || group.endsWith(`.${s}`));\n return suffix ? suffix[1] : CRD_ICON;\n }\n }\n return KIND_ICONS[k] ?? DEFAULT_ICON;\n}\n","// Kind -> the k8s-* dashboard that shows it, as kd-link data.\nimport type { DashboardCell, HrefCell } from '../kd/cell';\nimport type { Vars } from '../kd/elements/link';\nimport { apiGroup, isBuiltInGroup, kindIcon } from './icons';\n\n/** What names one Kubernetes object. */\nexport interface ObjectRef {\n kind: string;\n name: string;\n namespace?: string | null;\n apiVersion?: string | null;\n /** The resource name (`deployments`) when the kind's plural is irregular; guessed otherwise. */\n plural?: string | null;\n}\n\n/** A dashboard and its variables. */\nexport interface Route {\n dashboard: string;\n vars: Vars;\n}\n\n/** Options for a link cell. */\nexport interface LinkOptions {\n /** The label; defaults to the object's name. */\n text?: string;\n /** False leaves the icon out; a string replaces it. */\n icon?: boolean | string;\n /** Tooltip; defaults to the kind. */\n title?: string;\n}\n\n/** A dashboard link, or a plain label (an `href` cell with an empty href) where no view shows the kind. */\nexport type RefCell = DashboardCell | HrefCell;\n\n/** Kinds the workload view opens, and the apiVersion each has when a reference omits it. */\nexport const WORKLOAD_KINDS: Readonly<Record<string, string>> = {\n Deployment: 'apps/v1',\n StatefulSet: 'apps/v1',\n DaemonSet: 'apps/v1',\n ReplicaSet: 'apps/v1',\n Job: 'batch/v1',\n CronJob: 'batch/v1',\n};\n\n/** The k8s-* dashboards, by kind, that the routes below can open. */\nexport const DASHBOARDS = {\n pod: 'k8s-pod',\n workload: 'k8s-workload',\n maps: 'k8s-maps',\n volume: 'k8s-volume',\n class: 'k8s-class',\n serviceaccount: 'k8s-serviceaccount',\n crd: 'k8s-crd',\n rd: 'k8s-rd',\n namespace: 'k8s-namespace',\n node: 'k8s-node',\n service: 'k8s-service',\n ingress: 'k8s-ingress',\n resource: 'k8s-resource',\n} as const;\n\n/** A kind's resource name, as the API guesses it: `Ingress` -> `ingresses`, `Policy` -> `policies`. */\nexport function plural(kind: string): string {\n const s = kind.toLowerCase();\n if (s === 'endpoints') return s;\n if (/(s|x|z|ch|sh)$/.test(s)) return `${s}es`;\n if (/[^aeiou]y$/.test(s)) return `${s.slice(0, -1)}ies`;\n return `${s}s`;\n}\n\n/** The API path of an object: `apis/apps/v1/namespaces/db/statefulsets/postgresql`, or `api/v1/nodes/n1`. */\nexport function apiPath(ref: ObjectRef): string | undefined {\n if (!ref.apiVersion) return undefined;\n const root = ref.apiVersion.includes('/') ? 'apis' : 'api';\n const ns = ref.namespace ? `/namespaces/${ref.namespace}` : '';\n return `${root}/${ref.apiVersion}${ns}/${ref.plural || plural(ref.kind)}/${ref.name}`;\n}\n\n/** The namespace view. */\nexport function namespaceRoute(namespace: string): Route {\n return { dashboard: DASHBOARDS.namespace, vars: { app_namespace: namespace } };\n}\n\n/**\n * The dashboard that shows an object: its own k8s-* view for the kinds that\n * have one, else the generic resource view (which needs the apiVersion to\n * build the API path). Undefined when there is neither.\n */\nexport function route(ref: ObjectRef): Route | undefined {\n const { kind, name } = ref;\n const ns = ref.namespace ?? '';\n // A kind of the same name in some operator's group is not the built-in one.\n const builtIn = !ref.apiVersion || isBuiltInGroup(apiGroup(ref.apiVersion));\n if (builtIn) {\n if (kind === 'Pod') return { dashboard: DASHBOARDS.pod, vars: { app_namespace: ns, pod: name } };\n if (kind in WORKLOAD_KINDS) {\n const apiVersion = ref.apiVersion || WORKLOAD_KINDS[kind];\n return {\n dashboard: DASHBOARDS.workload,\n vars: { kind: `${apiVersion}/${ref.plural || plural(kind)}`, app_namespace: ns, workload: name },\n };\n }\n if (kind === 'ConfigMap' || kind === 'Secret') {\n return {\n dashboard: DASHBOARDS.maps,\n vars: { kind: kind === 'Secret' ? 'secrets' : 'configmaps', app_namespace: ns, mapname: name },\n };\n }\n if (kind === 'PersistentVolumeClaim' || kind === 'PersistentVolume') {\n return {\n dashboard: DASHBOARDS.volume,\n vars: {\n kind: kind === 'PersistentVolume' ? 'persistentvolumes' : 'persistentvolumeclaims',\n app_namespace: kind === 'PersistentVolume' ? '' : ns,\n volname: name,\n },\n };\n }\n if (kind === 'StorageClass' || kind === 'IngressClass') {\n return {\n dashboard: DASHBOARDS.class,\n vars: {\n kind: kind === 'IngressClass' ? 'networking.k8s.io/v1/ingressclasses' : 'storage.k8s.io/v1/storageclasses',\n classname: name,\n },\n };\n }\n if (kind === 'ServiceAccount') return { dashboard: DASHBOARDS.serviceaccount, vars: { app_namespace: ns, saname: name } };\n if (kind === 'CustomResourceDefinition') return { dashboard: DASHBOARDS.crd, vars: { crdname: name } };\n if (kind === 'Namespace') return namespaceRoute(name);\n if (kind === 'Node') return { dashboard: DASHBOARDS.node, vars: { node: name } };\n if (kind === 'Service') return { dashboard: DASHBOARDS.service, vars: { app_namespace: ns, service: name } };\n if (kind === 'Ingress') return { dashboard: DASHBOARDS.ingress, vars: { app_namespace: ns, ingress: name } };\n }\n const path = apiPath(ref);\n return path ? { dashboard: DASHBOARDS.resource, vars: { path } } : undefined;\n}\n\n/**\n * The view of a kind's definition: the CRD view for a custom resource (its\n * CRD is named `<plural>.<group>`), the resource-definition view for a\n * built-in kind (which picks it as `<api path>#<Kind>`).\n */\nexport function definitionRoute(kind: string, apiVersion: string, resource?: string | null): Route {\n const group = apiGroup(apiVersion);\n if (!isBuiltInGroup(group)) {\n return { dashboard: DASHBOARDS.crd, vars: { crdname: `${resource || plural(kind)}.${group}` } };\n }\n const root = apiVersion.includes('/') ? 'apis' : 'api';\n return { dashboard: DASHBOARDS.rd, vars: { rd: `${root}/${apiVersion}#${kind}` } };\n}\n\nfunction icon(ref: ObjectRef, opt: LinkOptions): string | undefined {\n if (opt.icon === false) return undefined;\n return typeof opt.icon === 'string' ? opt.icon : kindIcon(ref.kind, ref.apiVersion);\n}\n\n/**\n * An object as a link cell (`kd-link` data) to its view, with its kind's icon\n * and a back link to this page. A kind no view shows is a plain label.\n */\nexport function refLink(ref: ObjectRef, opt: LinkOptions = {}): RefCell {\n const text = opt.text ?? ref.name;\n const title = opt.title ?? ref.kind;\n const to = route(ref);\n const img = icon(ref, opt);\n if (!to) return { href: '', text, title, ...(img ? { icon: img } : {}) };\n return { dashboard: to.dashboard, vars: to.vars, back: true, text, title, ...(img ? { icon: img } : {}) };\n}\n\n/** A namespace as a link cell to the namespace view. */\nexport function namespaceLink(namespace: string, opt: LinkOptions = {}): DashboardCell {\n return refLink({ kind: 'Namespace', name: namespace, apiVersion: 'v1' }, { title: 'Namespace', ...opt }) as DashboardCell;\n}\n\n/** A kind as a link cell to its definition. */\nexport function kindLink(kind: string, apiVersion: string, opt: LinkOptions = {}): DashboardCell {\n const to = definitionRoute(kind, apiVersion);\n const img = icon({ kind, name: kind, apiVersion }, opt);\n return {\n dashboard: to.dashboard,\n vars: to.vars,\n back: true,\n text: opt.text ?? kind,\n title: opt.title ?? apiVersion,\n ...(img ? { icon: img } : {}),\n };\n}\n","// A Kubernetes API object, mapped onto the generic elements' data.\nimport type { Cell, CodeCell, PillCell } from '../kd/cell';\nimport type { BarData } from '../kd/elements/bar';\nimport type { GroupsData } from '../kd/elements/groups';\nimport type { MeterData, MeterMark } from '../kd/elements/meter';\nimport type { SheetRow } from '../kd/elements/sheet';\nimport type { Step, StepStatus } from '../kd/elements/steps';\nimport type { Tone } from '../kd/parts';\nimport { kindIcon } from './icons';\nimport { kindLink, namespaceLink, refLink, WORKLOAD_KINDS, type RefCell } from './links';\n\nexport interface OwnerReference {\n apiVersion?: string;\n kind: string;\n name: string;\n uid?: string;\n controller?: boolean;\n}\n\nexport interface Condition {\n type: string;\n status: 'True' | 'False' | 'Unknown' | string;\n reason?: string;\n message?: string;\n lastTransitionTime?: string;\n}\n\nexport interface ObjectMeta {\n name?: string;\n namespace?: string;\n uid?: string;\n creationTimestamp?: string;\n deletionTimestamp?: string;\n labels?: Record<string, string>;\n annotations?: Record<string, string>;\n ownerReferences?: OwnerReference[];\n finalizers?: string[];\n [key: string]: unknown;\n}\n\n/** Any Kubernetes API object; only the parts the mappings read are typed. */\nexport interface K8sObject {\n apiVersion?: string;\n kind?: string;\n metadata?: ObjectMeta;\n // The shapes differ by kind; each mapping reads what it knows defensively.\n spec?: any;\n status?: any;\n [key: string]: unknown;\n}\n\nexport interface ResourceRequirements {\n requests?: Record<string, string | number>;\n limits?: Record<string, string | number>;\n}\n\n/** A container, or anything with `resources`. */\nexport interface ContainerLike {\n name?: string;\n resources?: ResourceRequirements;\n}\n\n/** Options shared by the mappings that show an age. */\nexport interface MapOptions {\n /** The time ages are measured to, in ms; defaults to now. */\n now?: number;\n /** Other objects the owner chain may walk through (the ReplicaSet a pod's Deployment owns, say). */\n related?: K8sObject[];\n}\n\n// --- quantities and times ------------------------------------------------------\n\nconst SUFFIXES: Record<string, number> = {\n n: 1e-9,\n u: 1e-6,\n m: 1e-3,\n '': 1,\n k: 1e3,\n M: 1e6,\n G: 1e9,\n T: 1e12,\n P: 1e15,\n E: 1e18,\n Ki: 2 ** 10,\n Mi: 2 ** 20,\n Gi: 2 ** 30,\n Ti: 2 ** 40,\n Pi: 2 ** 50,\n Ei: 2 ** 60,\n};\n\nconst QUANTITY = /^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+))(?:([eE][+-]?\\d+)|(Ki|Mi|Gi|Ti|Pi|Ei|[numkMGTPE]))?$/;\n\n/**\n * A Kubernetes quantity as a plain number in base units: `100m` -> 0.1,\n * `128Mi` -> 134217728, `1e3` -> 1000, `2E` -> 2e18. NaN when it is not one.\n */\nexport function quantity(value: string | number | null | undefined): number {\n if (typeof value === 'number') return value;\n if (typeof value !== 'string') return NaN;\n const m = QUANTITY.exec(value.trim());\n if (!m) return NaN;\n const n = Number(m[1]);\n if (m[2]) return n * 10 ** Number(m[2].slice(1));\n return n * SUFFIXES[m[3] ?? ''];\n}\n\n/** Seconds as kubectl-ish text: `42s`, `5m`, `3h 12m`, `2d 4h`. */\nexport function duration(seconds: number): string {\n const s = Math.max(0, Math.floor(seconds));\n if (s < 60) return `${s}s`;\n if (s < 3600) return `${Math.floor(s / 60)}m`;\n if (s < 86400) return `${Math.floor(s / 3600)}h ${Math.floor((s % 3600) / 60)}m`;\n return `${Math.floor(s / 86400)}d ${Math.floor((s % 86400) / 3600)}h`;\n}\n\nconst ms = (iso: string | null | undefined) => (iso ? Date.parse(iso) : NaN);\n\n/** How long ago a timestamp was, or '' without one. */\nexport function age(iso: string | null | undefined, now = Date.now()): string {\n const t = ms(iso);\n return Number.isFinite(t) ? duration((now - t) / 1000) : '';\n}\n\n// --- resources -----------------------------------------------------------------\n\nexport interface ResourceMeter {\n /** `cpu`, `memory`, or any other resource name. */\n resource: string;\n data: MeterData;\n}\n\nconst ORDER = (name: string) => (name === 'cpu' ? 0 : name === 'memory' ? 1 : 2);\nconst BYTES = /^(memory|ephemeral-storage|storage|hugepages-.*)$/;\n\n// The display unit of a resource, chosen from the largest number shown.\nfunction scale(resource: string, largest: number): { unit: string; factor: number } {\n if (resource === 'cpu') return { unit: 'm', factor: 1e3 };\n if (!BYTES.test(resource)) return { unit: '', factor: 1 };\n if (largest >= 2 ** 40) return { unit: 'Ti', factor: 2 ** -40 };\n if (largest >= 2 ** 30) return { unit: 'Gi', factor: 2 ** -30 };\n if (largest >= 2 ** 20) return { unit: 'Mi', factor: 2 ** -20 };\n return { unit: 'Ki', factor: 2 ** -10 };\n}\n\n/**\n * One meter per resource a container requests or limits, cpu and memory\n * first: CPU in millicores, bytes in Ki/Mi/Gi/Ti. `usage` (quantities or base\n * numbers, by resource name) fills the meter; without it only the marks show.\n */\nexport function resources(container: ContainerLike | null | undefined, usage: Record<string, string | number> = {}): ResourceMeter[] {\n const requests = container?.resources?.requests ?? {};\n const limits = container?.resources?.limits ?? {};\n const names = [...new Set([...Object.keys(requests), ...Object.keys(limits)])].sort(\n (a, b) => ORDER(a) - ORDER(b) || (a < b ? -1 : a > b ? 1 : 0),\n );\n return names.map((resource) => {\n const request = quantity(requests[resource]);\n const limit = quantity(limits[resource]);\n const used = quantity(usage[resource]);\n const { unit, factor } = scale(resource, Math.max(...[request, limit, used].filter(Number.isFinite), 0));\n const marks: MeterMark[] = [];\n if (Number.isFinite(request)) marks.push({ label: 'request', value: request * factor });\n if (Number.isFinite(limit)) marks.push({ label: 'limit', value: limit * factor, tone: 'error' });\n const data: MeterData = { unit, marks };\n if (Number.isFinite(used)) data.value = used * factor;\n return { resource, data };\n });\n}\n\n// --- conditions ----------------------------------------------------------------\n\n// The order each kind's conditions happen in; any other condition follows, by time.\nconst CONDITION_ORDER: Record<string, string[]> = {\n Pod: ['PodScheduled', 'PodReadyToStartContainers', 'Initialized', 'ContainersReady', 'Ready'],\n Node: ['MemoryPressure', 'DiskPressure', 'PIDPressure', 'NetworkUnavailable', 'Ready'],\n Deployment: ['Progressing', 'Available', 'ReplicaFailure'],\n};\n\n/** Condition types that are good when False. */\nexport const NEGATIVE_CONDITIONS: ReadonlySet<string> = new Set([\n 'Failed',\n 'Stalled',\n 'Degraded',\n 'FailureTarget',\n 'Suspended',\n 'Terminating',\n 'DisruptionTarget',\n 'ReplicaFailure',\n 'MemoryPressure',\n 'DiskPressure',\n 'PIDPressure',\n 'NetworkUnavailable',\n]);\n\nconst CONDITION_LABELS: Record<string, string> = {\n PodScheduled: 'Scheduled',\n PodReadyToStartContainers: 'Sandbox',\n ContainersReady: 'Containers',\n MemoryPressure: 'Memory',\n DiskPressure: 'Disk',\n PIDPressure: 'PIDs',\n NetworkUnavailable: 'Network',\n};\n\n/** Whether a condition is in its good state (true), its bad one (false), or unknown (null). */\nexport function conditionOk(c: Condition): boolean | null {\n const negative = NEGATIVE_CONDITIONS.has(c.type);\n if (c.status === 'True') return !negative;\n if (c.status === 'False') return negative;\n return null;\n}\n\nconst because = (c: Condition) => [c.reason, c.message].filter((s) => s != null && s !== '').join(': ');\n\n/**\n * The object's conditions as steps, in the order they happen for the kinds\n * that have one: done when good, failed when bad, warning when unknown. The\n * time is how long after creation the condition last changed.\n */\nexport function conditions(obj: K8sObject | null | undefined): Step[] {\n const list: Condition[] = Array.isArray(obj?.status?.conditions) ? obj.status.conditions : [];\n const order = CONDITION_ORDER[obj?.kind ?? ''] ?? [];\n const rank = (c: Condition) => (order.includes(c.type) ? order.indexOf(c.type) : order.length);\n const created = ms(obj?.metadata?.creationTimestamp);\n return [...list]\n .sort((a, b) => rank(a) - rank(b) || (ms(a.lastTransitionTime) || 0) - (ms(b.lastTransitionTime) || 0))\n .map((c) => {\n const ok = conditionOk(c);\n const status: StepStatus = ok === true ? 'done' : ok === false ? 'failed' : 'warning';\n const step: Step = { label: CONDITION_LABELS[c.type] ?? c.type, status };\n const changed = ms(c.lastTransitionTime);\n if (Number.isFinite(changed) && Number.isFinite(created)) step.time = `+${duration((changed - created) / 1000)}`;\n const why = because(c);\n if (why && ok !== true) step.detail = why;\n return step;\n });\n}\n\n// --- owners --------------------------------------------------------------------\n\nconst sameRef = (o: K8sObject, ref: OwnerReference) =>\n (ref.uid && o.metadata?.uid === ref.uid) || (o.kind === ref.kind && o.metadata?.name === ref.name);\n\n/**\n * The owner chain, outermost first, as link cells: each owner reference, with\n * the owners of any owner found in `related` before it. A pod's ReplicaSet\n * that carries its `pod-template-hash` is preceded by the Deployment it\n * implies even when the ReplicaSet itself is not at hand.\n */\nexport function owners(obj: K8sObject | null | undefined, related: K8sObject[] = []): RefCell[] {\n const chain: RefCell[] = [];\n const seen = new Set<string>();\n const walk = (o: K8sObject) => {\n const ns = o.metadata?.namespace;\n const hash = o.metadata?.labels?.['pod-template-hash'];\n for (const ref of o.metadata?.ownerReferences ?? []) {\n const key = ref.uid || `${ref.kind}/${ref.name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n const found = related.find((r) => sameRef(r, ref));\n if (found) walk(found);\n else if (ref.kind === 'ReplicaSet' && hash && ref.name.endsWith(`-${hash}`)) {\n const name = ref.name.slice(0, -hash.length - 1);\n chain.push(refLink({ kind: 'Deployment', name, namespace: ns, apiVersion: ref.apiVersion ?? 'apps/v1' }));\n }\n chain.push(refLink({ kind: ref.kind, name: ref.name, namespace: ns, apiVersion: ref.apiVersion }));\n }\n };\n if (obj) walk(obj);\n return chain;\n}\n\n// --- labels and annotations ---------------------------------------------------\n\n/** The labels, for `<kd-groups mode=\"pills\">`. */\nexport function labels(obj: K8sObject | null | undefined): GroupsData {\n return { ...(obj?.metadata?.labels ?? {}) };\n}\n\n/** Annotations too large and too stale to show: the copy of the object kubectl apply keeps. */\nexport const HIDDEN_ANNOTATIONS: readonly string[] = ['kubectl.kubernetes.io/last-applied-configuration'];\n\n/** The annotations, for `<kd-groups mode=\"tree\">`, without the last-applied copy. */\nexport function annotations(obj: K8sObject | null | undefined): GroupsData {\n const out: GroupsData = { ...(obj?.metadata?.annotations ?? {}) };\n for (const key of HIDDEN_ANNOTATIONS) delete out[key];\n return out;\n}\n\n// --- summary and bar ----------------------------------------------------------\n\nconst code = (value: unknown): CodeCell | undefined =>\n value === null || value === undefined || value === '' ? undefined : { code: String(value) };\nconst pill = (text: string, tone: Tone, title?: string): PillCell => (title ? { text, tone, title } : { text, tone });\n\nfunction when(iso: string | undefined, now: number): Cell {\n const a = age(iso, now);\n return a ? [`${a} ago`, { code: iso as string }] : undefined;\n}\n\nfunction podRows(o: K8sObject, now: number): SheetRow[] {\n const spec = o.spec ?? {};\n const status = o.status ?? {};\n const ns = o.metadata?.namespace;\n const ips = (list: unknown) => (Array.isArray(list) ? list.map((x: { ip?: string }) => code(x?.ip)) : undefined);\n return [\n { key: 'Started', value: when(status.startTime, now) },\n {\n key: 'Node',\n value: spec.nodeName ? refLink({ kind: 'Node', name: spec.nodeName, apiVersion: 'v1' }) : pill('unscheduled', 'warning'),\n },\n { key: 'Pod IP', value: ips(status.podIPs) ?? code(status.podIP) },\n { key: 'Host IP', value: ips(status.hostIPs) ?? code(status.hostIP) },\n { key: 'QoS', value: status.qosClass },\n {\n key: 'Priority',\n value: [\n spec.priorityClassName\n ? refLink({ kind: 'PriorityClass', name: spec.priorityClassName, apiVersion: 'scheduling.k8s.io/v1' })\n : undefined,\n code(spec.priority ?? 0),\n ],\n },\n {\n key: 'Service account',\n value: spec.serviceAccountName\n ? refLink({ kind: 'ServiceAccount', name: spec.serviceAccountName, namespace: ns, apiVersion: 'v1' })\n : undefined,\n },\n { key: 'Restart policy', value: spec.restartPolicy },\n ];\n}\n\nfunction workloadRows(o: K8sObject): SheetRow[] {\n const spec = o.spec ?? {};\n const ns = o.metadata?.namespace;\n const selector = spec.selector?.matchLabels as Record<string, string> | undefined;\n const sa = spec.template?.spec?.serviceAccountName ?? spec.jobTemplate?.spec?.template?.spec?.serviceAccountName;\n return [\n { key: 'Replicas', value: replicas(o)?.text },\n { key: 'Strategy', value: spec.strategy?.type ?? spec.updateStrategy?.type },\n { key: 'Schedule', value: code(spec.schedule) },\n { key: 'Selector', value: selector ? Object.entries(selector).map(([k, v]) => code(`${k}=${v}`)) : undefined },\n { key: 'Service account', value: sa ? refLink({ kind: 'ServiceAccount', name: sa, namespace: ns, apiVersion: 'v1' }) : undefined },\n ];\n}\n\nconst ROLE = 'node-role.kubernetes.io/';\n\nfunction nodeRows(o: K8sObject): SheetRow[] {\n const status = o.status ?? {};\n const info = status.nodeInfo ?? {};\n const address = (type: string) =>\n (Array.isArray(status.addresses) ? status.addresses : []).filter((a: { type?: string }) => a?.type === type).map((a: { address?: string }) => code(a.address));\n const cap = status.capacity ?? {};\n const mem = quantity(cap.memory);\n return [\n { key: 'Roles', value: Object.keys(o.metadata?.labels ?? {}).filter((k) => k.startsWith(ROLE)).map((k) => k.slice(ROLE.length)).join(', ') },\n { key: 'Internal IP', value: address('InternalIP') },\n { key: 'External IP', value: address('ExternalIP') },\n { key: 'Kubelet', value: code(info.kubeletVersion) },\n { key: 'OS', value: [info.osImage, info.architecture].filter(Boolean).join(' · ') },\n { key: 'Kernel', value: code(info.kernelVersion) },\n { key: 'Runtime', value: code(info.containerRuntimeVersion) },\n { key: 'CPU', value: cap.cpu === undefined ? undefined : `${cap.cpu} cores` },\n { key: 'Memory', value: Number.isFinite(mem) ? `${(mem / 2 ** 30).toFixed(1)} Gi` : undefined },\n { key: 'Pods', value: cap.pods },\n ];\n}\n\n/**\n * A property sheet of the object, as the k8s views show it: kind (linked to\n * its definition), namespace, age, owners and uid, then what the kind adds\n * (a pod's node and IPs, a workload's replicas, a node's addresses and\n * capacity), then finalizers. Empty rows are left in; `kd-sheet` drops them.\n */\nexport function summary(obj: K8sObject | null | undefined, opt: MapOptions = {}): SheetRow[] {\n if (!obj) return [];\n const now = opt.now ?? Date.now();\n const m = obj.metadata ?? {};\n const kind = obj.kind ?? '';\n const rows: SheetRow[] = [\n { key: 'Kind', value: kind && obj.apiVersion ? kindLink(kind, obj.apiVersion) : kind },\n { key: 'Namespace', value: m.namespace ? namespaceLink(m.namespace) : undefined },\n { key: 'Created', value: when(m.creationTimestamp, now) },\n {\n key: 'Deleting',\n value: m.deletionTimestamp ? pill('terminating', 'warning', m.deletionTimestamp) : undefined,\n },\n { key: 'Controlled by', value: owners(obj, opt.related) },\n ];\n if (kind === 'Pod') rows.push(...podRows(obj, now));\n else if (kind in WORKLOAD_KINDS) rows.push(...workloadRows(obj));\n else if (kind === 'Node') rows.push(...nodeRows(obj));\n rows.push(\n { key: 'UID', value: code(m.uid) },\n { key: 'Finalizers', value: (m.finalizers ?? []).map((f) => code(f)) },\n );\n return rows;\n}\n\nconst PHASE_TONES: [RegExp, Tone][] = [\n [/^(Running|Bound|Succeeded|Active|Available)$/, 'success'],\n [/^(Pending|Terminating|Released)$/, 'warning'],\n [/^(Failed|Lost)$/, 'error'],\n];\n\nconst phaseTone = (phase: string): Tone => PHASE_TONES.find(([re]) => re.test(phase))?.[1] ?? 'neutral';\n\n// Ready/desired for the kinds that run replicas.\nfunction replicas(o: K8sObject): PillCell | undefined {\n const s = o.status ?? {};\n const kind = o.kind;\n let ready: number | undefined;\n let want: number | undefined;\n if (kind === 'DaemonSet') {\n ready = s.numberReady ?? 0;\n want = s.desiredNumberScheduled ?? 0;\n } else if (kind === 'Deployment' || kind === 'StatefulSet' || kind === 'ReplicaSet') {\n ready = s.readyReplicas ?? 0;\n want = o.spec?.replicas ?? 1;\n }\n if (ready === undefined || want === undefined) return undefined;\n return pill(`${ready}/${want} ready`, ready >= want ? 'success' : 'warning');\n}\n\nfunction podChips(o: K8sObject): Cell[] {\n const status = o.status ?? {};\n const sidecars = new Set(\n (o.spec?.initContainers ?? []).filter((c: { restartPolicy?: string }) => c.restartPolicy === 'Always').map((c: { name: string }) => c.name),\n );\n const main = [\n ...(status.containerStatuses ?? []),\n ...(status.initContainerStatuses ?? []).filter((c: { name: string }) => sidecars.has(c.name)),\n ];\n const all = [...(status.initContainerStatuses ?? []), ...(status.containerStatuses ?? []), ...(status.ephemeralContainerStatuses ?? [])];\n const ready = main.filter((c: { ready?: boolean }) => c.ready).length;\n const restarts = all.reduce((n: number, c: { restartCount?: number }) => n + (c.restartCount ?? 0), 0);\n const phase: string = o.metadata?.deletionTimestamp ? 'Terminating' : (status.phase ?? 'Unknown');\n const tone: Tone = phase === 'Succeeded' ? 'neutral' : phaseTone(phase);\n const total = main.length || (o.spec?.containers ?? []).length;\n return [\n pill(phase, tone, status.message ?? status.reason),\n pill(`${ready}/${total} ready`, ready === total ? 'success' : 'warning'),\n restarts > 0 ? pill(`↻ ${restarts}`, 'warning', 'restarts') : undefined,\n ];\n}\n\nfunction nodeChips(o: K8sObject): Cell[] {\n const ready = ((o.status?.conditions ?? []) as Condition[]).find((c) => c.type === 'Ready');\n const pressure = ((o.status?.conditions ?? []) as Condition[]).filter((c) => c.type !== 'Ready' && conditionOk(c) === false);\n return [\n ready ? pill(ready.status === 'True' ? 'Ready' : 'NotReady', ready.status === 'True' ? 'success' : 'error', because(ready)) : undefined,\n o.spec?.unschedulable ? pill('cordoned', 'warning', 'unschedulable') : undefined,\n ...pressure.map((c) => pill(`✗ ${c.type}`, 'error', because(c))),\n ];\n}\n\n// Phase, then the conditions folded into one good pill and one pill per bad one.\nfunction genericChips(o: K8sObject): Cell[] {\n const s = o.status ?? {};\n const list = (Array.isArray(s.conditions) ? s.conditions : []) as Condition[];\n const good = list.filter((c) => conditionOk(c) === true);\n const lead = ['Ready', 'Available', 'Complete'].find((t) => good.some((c) => c.type === t)) ?? good[0]?.type;\n return [\n typeof s.phase === 'string' ? pill(s.phase, phaseTone(s.phase), 'phase') : undefined,\n kind(o) in WORKLOAD_KINDS ? replicas(o) : undefined,\n good.length ? pill(`✓ ${lead}${good.length > 1 ? ` +${good.length - 1}` : ''}`, 'success', good.map((c) => c.type).join(', ')) : undefined,\n ...list\n .filter((c) => conditionOk(c) !== true)\n .map((c) => (conditionOk(c) === null ? pill(`? ${c.type}`, 'warning', because(c)) : pill(`✗ ${c.type}`, 'error', because(c)))),\n ];\n}\n\nconst kind = (o: K8sObject) => o.kind ?? '';\n\n/** Status pills for the title bar: a pod's phase, readiness and restarts; a node's readiness; else phase, replicas and conditions. */\nexport function chips(obj: K8sObject | null | undefined): Cell[] {\n if (!obj) return [];\n const out = kind(obj) === 'Pod' ? podChips(obj) : kind(obj) === 'Node' ? nodeChips(obj) : genericChips(obj);\n return out.filter((c) => c !== undefined);\n}\n\n/** The title bar: the kind's icon, `Kind · namespace` above the name, status pills and the owner chain. */\nexport function bar(obj: K8sObject | null | undefined, opt: MapOptions = {}): BarData {\n if (!obj) return { title: '' };\n const ns = obj.metadata?.namespace;\n return {\n icon: kindIcon(obj.kind, obj.apiVersion),\n eyebrow: ns ? [`${kind(obj)} ·`, namespaceLink(ns, { icon: false })] : kind(obj),\n title: obj.metadata?.name ?? '',\n chips: chips(obj),\n chain: owners(obj, opt.related),\n };\n}\n\n/** The object without what nobody reads: managedFields and the last-applied copy. */\nexport function trimmed(obj: K8sObject): K8sObject {\n const { managedFields: _drop, ...metadata } = obj.metadata ?? {};\n const out: K8sObject = { ...obj, metadata };\n if (metadata.annotations) {\n const a = annotations(obj);\n if (Object.keys(a).length) metadata.annotations = a;\n else delete metadata.annotations;\n }\n return out;\n}\n","// Kubernetes events as Loki keeps them (one line per event, the object and\n// reason as labels), folded into one row per object, reason and message.\nimport type { Cell } from '../kd/cell';\nimport type { TableColumn, TableData } from '../kd/elements/table';\nimport { refLink, namespaceLink } from './links';\nimport { duration } from './map';\n\n/** The labels the kube-events source puts on each line. */\nexport interface EventLabels {\n kind?: string;\n name?: string;\n namespace?: string;\n objectAPIversion?: string;\n reason?: string;\n type?: string;\n sourcecomponent?: string;\n reportingcontroller?: string;\n [key: string]: unknown;\n}\n\n/** One Loki log row, as Business Text hands a frame's rows to a panel. */\nexport interface EventRow {\n labels?: EventLabels | string;\n Line?: string;\n body?: string;\n Time?: number | string;\n timestamp?: number | string;\n tsNs?: string;\n [key: string]: unknown;\n}\n\n/** One folded event. */\nexport interface EventGroup {\n kind: string;\n name: string;\n namespace: string;\n apiVersion: string;\n reason: string;\n message: string;\n /** The component that reported it. */\n source: string;\n warning: boolean;\n count: number;\n /** ms */\n first: number;\n /** ms */\n last: number;\n}\n\n/** Reasons that mean something went wrong, for sources whose lines carry no `type` label. */\nexport const WARNING_REASONS =\n /^(BackOff|Failed|Unhealthy|Evicted|OOM|Killing|Preempt|ExceededGracePeriod|NetworkNotReady|NodeNotReady|InspectFailed|ErrImage|ProbeWarning|FreeDiskSpaceFailed|BadConfig|Error)/;\n\n/** Whether an event is a warning: its `type` label says so, or its reason does. */\nexport function isWarning(labels: EventLabels): boolean {\n return labels.type === 'Warning' || WARNING_REASONS.test(labels.reason ?? '');\n}\n\ninterface FieldFrame {\n fields: { name: string; values: ArrayLike<unknown> | { toArray(): unknown[] } }[];\n}\n\nconst isFieldFrame = (x: unknown): x is FieldFrame =>\n typeof x === 'object' && x !== null && Array.isArray((x as FieldFrame).fields);\n\nfunction frameRows(frame: FieldFrame): EventRow[] {\n const columns = frame.fields.map((f) => ({\n name: f.name,\n values: Array.from('toArray' in f.values && typeof f.values.toArray === 'function' ? f.values.toArray() : (f.values as ArrayLike<unknown>)),\n }));\n const n = Math.max(0, ...columns.map((c) => c.values.length));\n return Array.from({ length: n }, (_, i) => Object.fromEntries(columns.map((c) => [c.name, c.values[i]])) as EventRow);\n}\n\n/**\n * The log rows in whatever Business Text or a query hands over: rows, an\n * array of frames' rows, or data frames with `fields`. Rows that are not log\n * lines (an Infinity query's rows in the same panel) are dropped.\n */\nexport function eventRows(input: unknown): EventRow[] {\n const out: EventRow[] = [];\n const visit = (x: unknown) => {\n if (Array.isArray(x)) x.forEach(visit);\n else if (isFieldFrame(x)) frameRows(x).forEach(visit);\n else if (typeof x === 'object' && x !== null && ((x as EventRow).Line !== undefined || (x as EventRow).body !== undefined)) {\n out.push(x as EventRow);\n }\n };\n visit(input);\n return out;\n}\n\nfunction labelsOf(row: EventRow): EventLabels {\n const l = row.labels;\n if (typeof l === 'string') {\n try {\n return (JSON.parse(l) as EventLabels) ?? {};\n } catch {\n return {};\n }\n }\n return l ?? {};\n}\n\nfunction timeOf(row: EventRow): number {\n if (row.tsNs) return Number(row.tsNs) / 1e6;\n const t = row.Time ?? row.timestamp;\n if (typeof t === 'number') return t;\n if (typeof t === 'string') {\n const n = Number(t);\n if (Number.isFinite(n)) return n > 1e14 ? n / 1e6 : n;\n return Date.parse(t);\n }\n return NaN;\n}\n\n/** Events folded by object, reason and message, the most recent first. */\nexport function foldEvents(input: unknown): EventGroup[] {\n const groups = new Map<string, EventGroup>();\n for (const row of eventRows(input)) {\n const l = labelsOf(row);\n const message = String(row.Line ?? row.body ?? '');\n const key = [l.kind ?? '', l.namespace ?? '', l.name ?? '', l.reason ?? '', message].join('\\u0000');\n const t = timeOf(row);\n let g = groups.get(key);\n if (!g) {\n g = {\n kind: l.kind ?? '',\n name: l.name ?? '',\n namespace: l.namespace ?? '',\n apiVersion: l.objectAPIversion ?? '',\n reason: l.reason ?? '',\n message,\n source: l.sourcecomponent || l.reportingcontroller || '',\n warning: isWarning(l),\n count: 0,\n first: t,\n last: t,\n };\n groups.set(key, g);\n }\n g.count += 1;\n if (Number.isFinite(t)) {\n g.first = Number.isFinite(g.first) ? Math.min(g.first, t) : t;\n g.last = Number.isFinite(g.last) ? Math.max(g.last, t) : t;\n }\n }\n return [...groups.values()].sort((a, b) => (b.last || 0) - (a.last || 0));\n}\n\n/** Which optional columns an events table has. */\nexport interface EventColumns {\n /** The object each event is about, for a view of many objects (a namespace, a workload). */\n object?: boolean;\n /** The object's namespace, for a cluster-wide view (a node). */\n namespace?: boolean;\n /** The end of the time range, in ms: \"last seen\" is measured to it. */\n now?: number;\n}\n\n/** Folded events as `kd-table` data: reason pill, [namespace], [object], message, count, last seen. */\nexport function eventsTable(groups: EventGroup[], opt: EventColumns = {}): TableData {\n const now = opt.now ?? Date.now();\n const columns: TableColumn[] = [\n { key: 'reason', label: 'Reason', nowrap: true },\n ...(opt.namespace ? [{ key: 'namespace', label: 'Namespace' }] : []),\n ...(opt.object ? [{ key: 'object', label: 'Object' }] : []),\n { key: 'message', label: 'Message' },\n { key: 'count', label: '', align: 'right' as const, nowrap: true },\n { key: 'last', label: 'Last seen', nowrap: true },\n ];\n const ago = (t: number) => (Number.isFinite(t) ? `${duration((now - t) / 1000)} ago` : '');\n const rows = groups.map((g): Record<string, Cell> => ({\n reason: {\n text: g.reason || '?',\n tone: g.warning ? 'error' : 'info',\n title: `${g.warning ? 'Warning' : 'Normal'}${g.source ? ` · from ${g.source}` : ''}`,\n },\n namespace: g.namespace ? namespaceLink(g.namespace) : '',\n object: g.kind && g.name\n ? refLink({ kind: g.kind, name: g.name, namespace: g.namespace || undefined, apiVersion: g.apiVersion || undefined })\n : '',\n message: g.message,\n count: g.count > 1 ? `×${g.count}` : '',\n last: g.count > 1 && g.first !== g.last ? [ago(g.last), `(first ${ago(g.first).replace(/ ago$/, '')})`] : ago(g.last),\n }));\n return { columns, rows };\n}\n","import { html, nothing, type PropertyValues } from 'lit';\n\nimport '../../kd/elements/table';\nimport { define } from '../../kd/define';\nimport { KdElement, base, json } from '../../kd/element';\nimport { timeRange } from '../../kd/scene';\nimport { eventsTable, foldEvents, type EventGroup } from '../events';\n\n/**\n * Kubernetes events from Loki (the panel's frames, or their rows) folded into\n * a table: one row per object, reason and message, with a reason pill\n * (warnings in the error tone, the reporting component on hover), the\n * message, how many times and when last seen. `object` adds the object each\n * event is about, `namespace` its namespace. \"Last seen\" is measured to `now`\n * (ms), else the dashboard's time range end, else the clock.\n *\n * `count` is the number of rows, `warnings` how many are warnings. Inside a\n * `kd-tabs` pane, the pane's `count` follows it, so the tab shows it.\n *\n * `el.data = context.data` → `<kd-k8s-events object></kd-k8s-events>`\n */\nexport class KdK8sEvents extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n object: { type: Boolean },\n namespace: { type: Boolean },\n now: { type: Number },\n empty: {},\n };\n static override styles = base;\n\n declare data: unknown;\n declare object: boolean | undefined;\n declare namespace: boolean | undefined;\n declare now: number | undefined;\n declare empty: string | undefined;\n\n #groups: EventGroup[] = [];\n\n /** The folded events. */\n get groups(): EventGroup[] {\n return this.#groups;\n }\n\n /** How many rows the table has. */\n get count(): number {\n return this.#groups.length;\n }\n\n /** How many of them are warnings. */\n get warnings(): number {\n return this.#groups.filter((g) => g.warning).length;\n }\n\n #end(): number {\n if (typeof this.now === 'number' && Number.isFinite(this.now)) return this.now;\n const to = timeRange(this)?.toIso;\n const t = to ? Date.parse(to) : NaN;\n return Number.isFinite(t) ? t : Date.now();\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('data')) this.#groups = foldEvents(this.data);\n }\n\n protected override updated(): void {\n const pane = this.parentElement;\n if (pane?.parentElement?.localName === 'kd-tabs' && pane.getAttribute('count') !== String(this.count)) {\n pane.setAttribute('count', String(this.count));\n }\n }\n\n override render() {\n if (this.data === undefined || this.data === null) return nothing;\n const table = eventsTable(this.#groups, { object: this.object, namespace: this.namespace, now: this.#end() });\n return html`<kd-table .data=${table} empty=${this.empty ?? 'No events in this time range'}></kd-table>`;\n }\n}\n\ndefine('kd-k8s-events', KdK8sEvents);\n","import { css, html, nothing } from 'lit';\n\nimport '../../kd/elements/bar';\nimport '../../kd/elements/data';\nimport '../../kd/elements/groups';\nimport '../../kd/elements/sheet';\nimport '../../kd/elements/steps';\nimport '../../kd/elements/tabs';\nimport './events';\nimport { define } from '../../kd/define';\nimport { KdElement, base, json } from '../../kd/element';\nimport { annotations, bar, conditions, labels, summary, trimmed, type K8sObject } from '../map';\n\n/**\n * The generic page of one Kubernetes object, composed from the kd elements:\n * the title bar, the conditions as steps, then tabs for the summary sheet,\n * labels, annotations, events (when `events` is set: the panel's Loki frames)\n * and the YAML. `related` objects extend the owner chain; `key` keeps the\n * open tab per view; `now` (ms) pins the ages.\n *\n * `el.data = context.data[0][0]; el.events = context.data` → `<kd-k8s-object key=\"pod\"></kd-k8s-object>`\n */\nexport class KdK8sObject extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n events: { attribute: false },\n related: { attribute: false },\n key: {},\n now: { type: Number },\n };\n static override styles = [\n base,\n css`\n .page {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n `,\n ];\n\n declare data: K8sObject | undefined;\n declare events: unknown;\n declare related: K8sObject[] | undefined;\n declare key: string | undefined;\n declare now: number | undefined;\n\n override render() {\n const o = this.data;\n if (!o || typeof o !== 'object') return nothing;\n const opt = { now: this.now, related: this.related };\n const steps = conditions(o);\n const l = labels(o);\n const a = annotations(o);\n const count = (map: object) => String(Object.keys(map).length);\n return html`<div class=\"page\">\n <kd-bar .data=${bar(o, opt)}></kd-bar>\n ${steps.length ? html`<kd-steps .data=${steps}></kd-steps>` : nothing}\n <kd-tabs key=${this.key ?? nothing}>\n <section label=\"Summary\"><kd-sheet .data=${summary(o, opt)}></kd-sheet></section>\n <section label=\"Labels\" count=${count(l)}><kd-groups mode=\"pills\" .data=${l}></kd-groups></section>\n <section label=\"Annotations\" count=${count(a)}><kd-groups mode=\"tree\" .data=${a}></kd-groups></section>\n ${this.events === undefined\n ? nothing\n : html`<section label=\"Events\"><kd-k8s-events .data=${this.events} .now=${this.now}></kd-k8s-events></section>`}\n <section label=\"YAML\"><kd-data fold=\"0\" .data=${trimmed(o)}></kd-data></section>\n </kd-tabs>\n </div>`;\n }\n}\n\ndefine('kd-k8s-object', KdK8sObject);\n","import { css, html, nothing } from 'lit';\n\nimport '../../kd/elements/link';\nimport { define } from '../../kd/define';\nimport { KdElement, base, json } from '../../kd/element';\nimport { refLink, type ObjectRef } from '../links';\n\n/**\n * A link to the k8s-* view of one object, with its kind's icon and a back\n * link to this page. Set `data` (an `ObjectRef`, or any object with `kind`,\n * `apiVersion` and `metadata`), or the attributes `kind`, `name`, `namespace`,\n * `api-version` and `plural`. A kind no view shows renders as a label.\n *\n * `<kd-k8s-ref kind=\"Pod\" namespace=\"db\" name=\"postgresql-0\"></kd-k8s-ref>`\n */\nexport class KdK8sRef extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n kind: {},\n name: {},\n namespace: {},\n apiVersion: { attribute: 'api-version' },\n plural: {},\n };\n static override styles = [\n base,\n css`\n :host {\n display: inline;\n }\n `,\n ];\n\n declare data: Partial<ObjectRef> & { metadata?: { name?: string; namespace?: string } } | undefined;\n declare kind: string | undefined;\n declare name: string | undefined;\n declare namespace: string | undefined;\n declare apiVersion: string | undefined;\n declare plural: string | undefined;\n\n /** The reference, `data` taking precedence over the attributes field by field. */\n get ref(): ObjectRef | undefined {\n const d = this.data ?? {};\n const kind = d.kind ?? this.kind;\n const name = d.name ?? d.metadata?.name ?? this.name;\n if (!kind || !name) return undefined;\n return {\n kind,\n name,\n namespace: d.namespace ?? d.metadata?.namespace ?? this.namespace,\n apiVersion: d.apiVersion ?? this.apiVersion,\n plural: d.plural ?? this.plural,\n };\n }\n\n override render() {\n const ref = this.ref;\n return ref ? html`<kd-link .data=${refLink(ref)}></kd-link>` : nothing;\n }\n}\n\ndefine('kd-k8s-ref', KdK8sRef);\n"],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { nothing, type TemplateResult } from 'lit';
2
+ import './elements/data';
3
+ import './elements/link';
4
+ import './elements/pill';
5
+ import type { Vars } from './elements/link';
6
+ import type { Tone } from './parts';
7
+ export type { Tone };
8
+ /** A pill: `<kd-pill>`. */
9
+ export interface PillCell {
10
+ text: string;
11
+ tone?: Tone;
12
+ title?: string;
13
+ }
14
+ /** A plain link: `<kd-link>` with an `href`. */
15
+ export interface HrefCell {
16
+ href: string;
17
+ text: string;
18
+ icon?: string;
19
+ title?: string;
20
+ }
21
+ /** A dashboard link: `<kd-link>`. */
22
+ export interface DashboardCell {
23
+ dashboard: string;
24
+ vars?: Vars;
25
+ text: string;
26
+ icon?: string;
27
+ title?: string;
28
+ back?: boolean;
29
+ }
30
+ /** Any JSON value as YAML: `<kd-data>`. */
31
+ export interface DataCell {
32
+ data: unknown;
33
+ }
34
+ /** Monospace text. */
35
+ export interface CodeCell {
36
+ code: string;
37
+ }
38
+ /** A scalar is text; an array renders its cells inline, wrapped. */
39
+ export type Cell = string | number | boolean | null | undefined | PillCell | HrefCell | DashboardCell | DataCell | CodeCell | Cell[];
40
+ /** Whether a cell has nothing to show. */
41
+ export declare function isEmpty(cell: Cell): boolean;
42
+ /** One cell. An object of no known shape is shown as data. */
43
+ export declare function renderCell(cell: Cell): TemplateResult | string | typeof nothing;
44
+ /** Styles an element that renders cells adds to its own. */
45
+ export declare const cellStyles: import("lit").CSSResult;
File without changes
@@ -0,0 +1,32 @@
1
+ import { LitElement, type CSSResultGroup } from 'lit';
2
+ /**
3
+ * What every element's shadow stylesheet starts from. Colours, fonts, radii and
4
+ * spacing come only from the theme's `--kd-*` properties; a fallback is never a
5
+ * colour literal, so an element on a page nobody themed inherits instead.
6
+ */
7
+ export declare const base: import("lit").CSSResult;
8
+ /** A JSON attribute, for markup produced by a query: `<kd-x data="{{kdjson rows}}">`. */
9
+ export declare const json: {
10
+ fromAttribute(value: string | null): unknown;
11
+ toAttribute(value: unknown): string;
12
+ };
13
+ /** The nearest ancestor carrying `data-theme`, looking through shadow roots. */
14
+ export declare function themedAncestor(element: Element): Element | null;
15
+ /**
16
+ * The base of every `kd-*` element. Elements are stateless renderers: they
17
+ * draw from their properties, which the panel pushes in on every render, and
18
+ * nothing lives only in an element (Business Text recreates them whenever the
19
+ * panel's HTML changes).
20
+ *
21
+ * A top-level element with no themed ancestor themes itself from Grafana's
22
+ * runtime and follows a live theme switch; under a panel root that `applyTheme`
23
+ * already themed, or inside another element's shadow root, it simply inherits.
24
+ */
25
+ export declare class KdElement extends LitElement {
26
+ #private;
27
+ static styles: CSSResultGroup;
28
+ connectedCallback(): void;
29
+ /** Stops theming itself and inherits; applyTheme calls this on a newly themed root. */
30
+ kdInherit(): void;
31
+ disconnectedCallback(): void;
32
+ }
@@ -0,0 +1,33 @@
1
+ import { nothing } from 'lit';
2
+ import { type Cell } from '../cell';
3
+ import { KdElement } from '../element';
4
+ export interface BarData {
5
+ /** An image URL or an emoji. */
6
+ icon?: string;
7
+ /** The line above the title, e.g. the kind and namespace. */
8
+ eyebrow?: Cell;
9
+ title: string;
10
+ /** Pills beside the title. */
11
+ chips?: Cell[];
12
+ /** A breadcrumb at the far end, e.g. the owner chain. */
13
+ chain?: Cell[];
14
+ }
15
+ /**
16
+ * A title bar or masthead.
17
+ *
18
+ * `el.data = { icon: '🐘', eyebrow: 'StatefulSet', title: 'postgresql', chips: [{ text: '1/1', tone: 'success' }] }`
19
+ */
20
+ export declare class KdBar extends KdElement {
21
+ static properties: {
22
+ data: {
23
+ attribute: string;
24
+ converter: {
25
+ fromAttribute(value: string | null): unknown;
26
+ toAttribute(value: unknown): string;
27
+ };
28
+ };
29
+ };
30
+ static styles: import("lit").CSSResult[];
31
+ data: BarData | undefined;
32
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
33
+ }
@@ -0,0 +1,27 @@
1
+ import { nothing } from 'lit';
2
+ import { KdElement } from '../element';
3
+ /**
4
+ * Any JSON value as YAML. An object or array longer than `fold` lines (default
5
+ * 10; 0 never folds) collapses under a "{ } n keys" / "[ ] n items" line.
6
+ *
7
+ * `<kd-data data="{{kdjson spec}}" fold="20">`
8
+ */
9
+ export declare class KdData extends KdElement {
10
+ static properties: {
11
+ data: {
12
+ attribute: string;
13
+ converter: {
14
+ fromAttribute(value: string | null): unknown;
15
+ toAttribute(value: unknown): string;
16
+ };
17
+ };
18
+ fold: {
19
+ type: NumberConstructor;
20
+ };
21
+ };
22
+ static styles: import("lit").CSSResult[];
23
+ data: unknown;
24
+ fold: number;
25
+ constructor();
26
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
27
+ }
@@ -0,0 +1,32 @@
1
+ import { nothing } from 'lit';
2
+ import './data';
3
+ import './pill';
4
+ import { KdElement } from '../element';
5
+ /** A string map, such as labels or annotations. */
6
+ export type GroupsData = Record<string, string>;
7
+ /** A value that is a JSON object or array, parsed; undefined for anything else. */
8
+ export declare function jsonValue(value: string): object | undefined;
9
+ /**
10
+ * A string map grouped by key prefix: as pills (`mode="pills"`, the default,
11
+ * for labels) or as a key/value tree (`mode="tree"`, for annotations, where a
12
+ * value holding a JSON object or array is shown as folded YAML).
13
+ *
14
+ * `<kd-groups mode="tree" data="{{kdjson metadata.annotations}}">`
15
+ */
16
+ export declare class KdGroups extends KdElement {
17
+ #private;
18
+ static properties: {
19
+ data: {
20
+ attribute: string;
21
+ converter: {
22
+ fromAttribute(value: string | null): unknown;
23
+ toAttribute(value: unknown): string;
24
+ };
25
+ };
26
+ mode: {};
27
+ };
28
+ static styles: import("lit").CSSResult[];
29
+ data: GroupsData | undefined;
30
+ mode: 'pills' | 'tree' | undefined;
31
+ render(): typeof nothing | import("lit-html").TemplateResult<1>[] | import("lit-html").TemplateResult<1>;
32
+ }
@@ -0,0 +1,67 @@
1
+ import { KdElement } from '../element';
2
+ /** Dashboard variables, without the `var-` prefix (one is added when missing). A list repeats the variable. */
3
+ export type Vars = Record<string, string | number | boolean | null | undefined | readonly (string | number | boolean)[]>;
4
+ export interface LinkData {
5
+ /** A dashboard uid (optionally `uid/slug`, optionally followed by `?query`, as a `back` value is). */
6
+ dashboard?: string;
7
+ /** A plain URL, used when there is no `dashboard`. */
8
+ href?: string;
9
+ vars?: Vars;
10
+ text?: string;
11
+ /** An image URL or an emoji. */
12
+ icon?: string;
13
+ /** Tooltip. */
14
+ title?: string;
15
+ /** Pass this dashboard and its variables as `var-back`, so the target can link back. */
16
+ back?: boolean;
17
+ }
18
+ /**
19
+ * The URL a link goes to: `<sub-path>/d/<dashboard>?var-k=v…` keeping the
20
+ * current `from`/`to`, plus `var-back=<this uid>?<this page's var-* query>`
21
+ * when `back` is set; or the plain `href`. Undefined when there is neither.
22
+ */
23
+ export declare function linkUrl(link: LinkData, win?: Window | null): string | undefined;
24
+ /**
25
+ * A link to a dashboard (or any URL) with an optional icon. Set `data`, or the
26
+ * attributes of the same names (`vars` as JSON, `back` as a boolean). Without
27
+ * `text`, the slot is the label.
28
+ *
29
+ * `<kd-link dashboard="k8s-pod" vars='{"pod":"web-0"}' back>web-0</kd-link>`
30
+ */
31
+ export declare class KdLink extends KdElement {
32
+ #private;
33
+ static properties: {
34
+ data: {
35
+ attribute: string;
36
+ converter: {
37
+ fromAttribute(value: string | null): unknown;
38
+ toAttribute(value: unknown): string;
39
+ };
40
+ };
41
+ dashboard: {};
42
+ href: {};
43
+ vars: {
44
+ converter: {
45
+ fromAttribute(value: string | null): unknown;
46
+ toAttribute(value: unknown): string;
47
+ };
48
+ };
49
+ text: {};
50
+ icon: {};
51
+ back: {
52
+ type: BooleanConstructor;
53
+ };
54
+ };
55
+ static styles: import("lit").CSSResult[];
56
+ data: LinkData | undefined;
57
+ dashboard: string | undefined;
58
+ href: string | undefined;
59
+ vars: Vars | undefined;
60
+ text: string | undefined;
61
+ icon: string | undefined;
62
+ back: boolean | undefined;
63
+ /** The link, `data` taking precedence over the attributes field by field. */
64
+ get link(): LinkData;
65
+ connectedCallback(): void;
66
+ render(): import("lit-html").TemplateResult<1>;
67
+ }
@@ -0,0 +1,22 @@
1
+ import { type PropertyValues } from 'lit';
2
+ import { KdElement } from '../element';
3
+ /**
4
+ * A secret value, hidden until clicked. The value never reaches a tooltip, the
5
+ * console or any other attribute, and the dots do not give away its length.
6
+ *
7
+ * `<kd-mask value="{{password}}"></kd-mask>`
8
+ */
9
+ export declare class KdMask extends KdElement {
10
+ static properties: {
11
+ value: {};
12
+ shown: {
13
+ state: boolean;
14
+ };
15
+ };
16
+ static styles: import("lit").CSSResult[];
17
+ value: string | undefined;
18
+ shown: boolean;
19
+ constructor();
20
+ protected willUpdate(changed: PropertyValues<this>): void;
21
+ render(): import("lit-html").TemplateResult<1>;
22
+ }
@@ -0,0 +1,37 @@
1
+ import { nothing } from 'lit';
2
+ import { KdElement } from '../element';
3
+ import { type Tone } from '../parts';
4
+ export interface MeterMark {
5
+ label: string;
6
+ value: number;
7
+ tone?: Tone;
8
+ }
9
+ export interface MeterData {
10
+ /** The measured value; null or missing shows only the marks. */
11
+ value?: number | null;
12
+ /** The full scale; defaults to the largest of the value and the marks. */
13
+ max?: number;
14
+ /** Appended to every number as is, e.g. `Mi`, `m` or ` cores`. */
15
+ unit?: string;
16
+ marks?: MeterMark[];
17
+ }
18
+ /**
19
+ * A value against request/limit-style marks. The fill takes the tone of the
20
+ * highest toned mark it has reached, else primary.
21
+ *
22
+ * `el.data = { value: 412, unit: 'Mi', marks: [{ label: 'request', value: 256 }, { label: 'limit', value: 512, tone: 'error' }] }`
23
+ */
24
+ export declare class KdMeter extends KdElement {
25
+ static properties: {
26
+ data: {
27
+ attribute: string;
28
+ converter: {
29
+ fromAttribute(value: string | null): unknown;
30
+ toAttribute(value: unknown): string;
31
+ };
32
+ };
33
+ };
34
+ static styles: import("lit").CSSResult[];
35
+ data: MeterData | undefined;
36
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
37
+ }
@@ -0,0 +1,15 @@
1
+ import { KdElement } from '../element';
2
+ import { type Tone } from '../parts';
3
+ /**
4
+ * A pill or badge. The slot is its text; `title` is the native tooltip.
5
+ *
6
+ * `<kd-pill tone="success" title="all containers ready">Running</kd-pill>`
7
+ */
8
+ export declare class KdPill extends KdElement {
9
+ static properties: {
10
+ tone: {};
11
+ };
12
+ static styles: import("lit").CSSResult[];
13
+ tone: Tone | undefined;
14
+ render(): import("lit-html").TemplateResult<1>;
15
+ }
@@ -0,0 +1,28 @@
1
+ import { nothing } from 'lit';
2
+ import { type Cell } from '../cell';
3
+ import { KdElement } from '../element';
4
+ export interface SheetRow {
5
+ key: string;
6
+ value: Cell;
7
+ }
8
+ /** Rows in order, or a plain object (its keys in order). */
9
+ export type SheetData = SheetRow[] | Record<string, Cell>;
10
+ /**
11
+ * A two-column property sheet. A row whose value is empty is left out.
12
+ *
13
+ * `el.data = [{ key: 'Node', value: 'node-1' }, { key: 'Phase', value: { text: 'Running', tone: 'success' } }]`
14
+ */
15
+ export declare class KdSheet extends KdElement {
16
+ static properties: {
17
+ data: {
18
+ attribute: string;
19
+ converter: {
20
+ fromAttribute(value: string | null): unknown;
21
+ toAttribute(value: unknown): string;
22
+ };
23
+ };
24
+ };
25
+ static styles: import("lit").CSSResult[];
26
+ data: SheetData | undefined;
27
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
28
+ }
@@ -0,0 +1,30 @@
1
+ import { nothing } from 'lit';
2
+ import { KdElement } from '../element';
3
+ import { type Tone } from '../parts';
4
+ export type StepStatus = 'done' | 'active' | 'failed' | 'pending' | Tone;
5
+ export interface Step {
6
+ label: string;
7
+ status: StepStatus;
8
+ time?: string;
9
+ detail?: string;
10
+ }
11
+ /**
12
+ * A stepper or state stripe: ordered steps, each with a status (a lifecycle
13
+ * word or a tone), an optional time and a detail line.
14
+ *
15
+ * `el.data = [{ label: 'Scheduled', status: 'done', time: '2m' }, { label: 'Ready', status: 'failed', detail: 'probe failed' }]`
16
+ */
17
+ export declare class KdSteps extends KdElement {
18
+ static properties: {
19
+ data: {
20
+ attribute: string;
21
+ converter: {
22
+ fromAttribute(value: string | null): unknown;
23
+ toAttribute(value: unknown): string;
24
+ };
25
+ };
26
+ };
27
+ static styles: import("lit").CSSResult[];
28
+ data: Step[] | undefined;
29
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
30
+ }
@@ -0,0 +1,38 @@
1
+ import { nothing } from 'lit';
2
+ import { type Cell } from '../cell';
3
+ import { KdElement } from '../element';
4
+ export interface TableColumn {
5
+ key: string;
6
+ /** Defaults to the key. */
7
+ label?: string;
8
+ align?: 'left' | 'center' | 'right';
9
+ /** Keep the cell on one line (counts, times, short pills). */
10
+ nowrap?: boolean;
11
+ }
12
+ export interface TableData {
13
+ /** Defaults to every key of the rows, in order of first appearance. */
14
+ columns?: TableColumn[];
15
+ rows: Record<string, Cell>[];
16
+ }
17
+ /**
18
+ * A small table of cells. `data` may also be just the rows. With no rows it
19
+ * shows `empty` (default "none").
20
+ *
21
+ * `el.data = { columns: [{ key: 'reason', label: 'Reason' }, { key: 'n', align: 'right' }], rows }`
22
+ */
23
+ export declare class KdTable extends KdElement {
24
+ static properties: {
25
+ data: {
26
+ attribute: string;
27
+ converter: {
28
+ fromAttribute(value: string | null): unknown;
29
+ toAttribute(value: unknown): string;
30
+ };
31
+ };
32
+ empty: {};
33
+ };
34
+ static styles: import("lit").CSSResult[];
35
+ data: TableData | TableData['rows'] | undefined;
36
+ empty: string | undefined;
37
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
38
+ }
@@ -0,0 +1,27 @@
1
+ import { nothing, type PropertyValues } from 'lit';
2
+ import { KdElement } from '../element';
3
+ /**
4
+ * Tabs over its child elements, any number of them: each child is a pane,
5
+ * labelled by its `label` attribute, with an optional `count` beside it.
6
+ * `selected` names the open pane by label (or by index). With a `key`, the
7
+ * choice is kept in sessionStorage, so it survives the panel recreating the
8
+ * element. A change dispatches `change` with `{ label, index }`.
9
+ *
10
+ * `<kd-tabs key="pod-tabs"><section label="Events" count="3">…</section>…</kd-tabs>`
11
+ */
12
+ export declare class KdTabs extends KdElement {
13
+ #private;
14
+ static properties: {
15
+ selected: {};
16
+ key: {};
17
+ };
18
+ static shadowRootOptions: ShadowRootInit;
19
+ static styles: import("lit").CSSResult[];
20
+ selected: string | undefined;
21
+ key: string | undefined;
22
+ connectedCallback(): void;
23
+ disconnectedCallback(): void;
24
+ protected willUpdate(changed: PropertyValues<this>): void;
25
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
26
+ protected updated(): void;
27
+ }