@nordhealth/components 4.10.0-alpha.1 → 4.12.0
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.
- package/custom-elements.json +4296 -4086
- package/lib/IconManager.js +1 -1
- package/lib/IconManager.js.map +1 -1
- package/lib/Progress.js +2 -0
- package/lib/Progress.js.map +1 -0
- package/lib/bundle.js +18 -18
- package/lib/bundle.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/react.d.ts +5 -0
- package/lib/src/index.d.ts +1 -0
- package/lib/src/progress/Progress.d.ts +68 -0
- package/lib/src/progress/Progress.test.d.ts +1 -0
- package/lib/vue.d.ts +2 -0
- package/package.json +4 -4
package/lib/IconManager.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=e=>fetch(`https://nordcdn.net/ds/icons/3.
|
|
1
|
+
const e=e=>fetch(`https://nordcdn.net/ds/icons/3.13.0/assets/${e}.svg`).then((t=>{if(!t.ok)throw new TypeError(`NORD: unknown icon: '${e}'`);return t.text()}));class t{constructor(){this.cache=new Map,this.resolver=e}resolve(e,t){let r=this.cache.get(e);"string"!=typeof r?(r||(r=this.resolver(e).catch((()=>"")).then((t=>(this.cache.set(e,t),t))),this.cache.set(e,r)),r.then(t)):t(r)}registerIcon(e,t){let r,s;if("string"==typeof e?(r=e,s=t):(r=e.title,s=e.default),!r)throw new Error("name is required when registering an icon");if(!s)throw new Error("icon must not be empty");this.cache.set(r,s)}clear(){this.cache.clear()}}export{t as IconManager};
|
|
2
2
|
//# sourceMappingURL=IconManager.js.map
|
package/lib/IconManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconManager.js","sources":["../src/icon/IconManager.ts"],"sourcesContent":["export type IconResolver = (iconName: string) => Promise<string>\n\n// in dev we should just load from node_modules\nconst loadIcon: IconResolver = (name: string) =>\n import(`@nordhealth/icons/lib/assets/${name}.js`).then(({ default: svg }) => svg)\n\n// in prod we should load from the CDN, as a sensible default\nconst loadIconCdn: IconResolver = (name: string) =>\n fetch(`https://nordcdn.net/ds/icons/${process.env.ICON_VERSION}/assets/${name}.svg`).then(response => {\n if (!response.ok) {\n throw new TypeError(`NORD: unknown icon: '${name}'`)\n }\n\n return response.text()\n })\n\nexport class IconManager {\n private cache = new Map<string, string | Promise<string>>()\n resolver: IconResolver = process.env.NODE_ENV === \"development\" ? loadIcon : loadIconCdn\n\n resolve(name: string, onResolved: (svg: string) => void) {\n let cached = this.cache.get(name)\n\n // if it's a string, we can resolve immediately\n if (typeof cached === \"string\") {\n onResolved(cached)\n return\n }\n\n // if it's null, then we should initiate a fetch\n if (!cached) {\n cached = this.resolver(name)\n .catch(() => \"\")\n .then(svg => {\n // replace the promise with the resolved value, for faster resolution next time\n this.cache.set(name, svg)\n return svg\n })\n\n // store the promise so that duplicate icons do not make separate requests\n this.cache.set(name, cached)\n }\n\n cached.then(onResolved)\n }\n\n registerIcon(iconOrName: string | { title: string; default: string }, icon?: string) {\n let name: string | undefined\n let svg: string | undefined\n\n if (typeof iconOrName === \"string\") {\n name = iconOrName\n svg = icon\n } else {\n name = iconOrName.title\n svg = iconOrName.default\n }\n\n // handle errors\n if (!name) {\n throw new Error(\"name is required when registering an icon\")\n }\n if (!svg) {\n throw new Error(\"icon must not be empty\")\n }\n\n this.cache.set(name, svg)\n }\n\n clear() {\n this.cache.clear()\n }\n}\n"],"names":["loadIconCdn","name","fetch","then","response","ok","TypeError","text","IconManager","constructor","this","cache","Map","resolver","resolve","onResolved","cached","get","catch","svg","set","registerIcon","iconOrName","icon","title","default","Error","clear"],"mappings":"AAOA,MAAMA,EAA6BC,GACjCC,MAAM,
|
|
1
|
+
{"version":3,"file":"IconManager.js","sources":["../src/icon/IconManager.ts"],"sourcesContent":["export type IconResolver = (iconName: string) => Promise<string>\n\n// in dev we should just load from node_modules\nconst loadIcon: IconResolver = (name: string) =>\n import(`@nordhealth/icons/lib/assets/${name}.js`).then(({ default: svg }) => svg)\n\n// in prod we should load from the CDN, as a sensible default\nconst loadIconCdn: IconResolver = (name: string) =>\n fetch(`https://nordcdn.net/ds/icons/${process.env.ICON_VERSION}/assets/${name}.svg`).then(response => {\n if (!response.ok) {\n throw new TypeError(`NORD: unknown icon: '${name}'`)\n }\n\n return response.text()\n })\n\nexport class IconManager {\n private cache = new Map<string, string | Promise<string>>()\n resolver: IconResolver = process.env.NODE_ENV === \"development\" ? loadIcon : loadIconCdn\n\n resolve(name: string, onResolved: (svg: string) => void) {\n let cached = this.cache.get(name)\n\n // if it's a string, we can resolve immediately\n if (typeof cached === \"string\") {\n onResolved(cached)\n return\n }\n\n // if it's null, then we should initiate a fetch\n if (!cached) {\n cached = this.resolver(name)\n .catch(() => \"\")\n .then(svg => {\n // replace the promise with the resolved value, for faster resolution next time\n this.cache.set(name, svg)\n return svg\n })\n\n // store the promise so that duplicate icons do not make separate requests\n this.cache.set(name, cached)\n }\n\n cached.then(onResolved)\n }\n\n registerIcon(iconOrName: string | { title: string; default: string }, icon?: string) {\n let name: string | undefined\n let svg: string | undefined\n\n if (typeof iconOrName === \"string\") {\n name = iconOrName\n svg = icon\n } else {\n name = iconOrName.title\n svg = iconOrName.default\n }\n\n // handle errors\n if (!name) {\n throw new Error(\"name is required when registering an icon\")\n }\n if (!svg) {\n throw new Error(\"icon must not be empty\")\n }\n\n this.cache.set(name, svg)\n }\n\n clear() {\n this.cache.clear()\n }\n}\n"],"names":["loadIconCdn","name","fetch","then","response","ok","TypeError","text","IconManager","constructor","this","cache","Map","resolver","resolve","onResolved","cached","get","catch","svg","set","registerIcon","iconOrName","icon","title","default","Error","clear"],"mappings":"AAOA,MAAMA,EAA6BC,GACjCC,MAAM,8CAAmED,SAAYE,MAAKC,IACxF,IAAKA,EAASC,GACZ,MAAM,IAAIC,UAAU,wBAAwBL,MAG9C,OAAOG,EAASG,MAAM,UAGbC,EAAb,WAAAC,GACUC,KAAAC,MAAQ,IAAIC,IACpBF,KAAAG,SAA6Eb,CAsD9E,CApDC,OAAAc,CAAQb,EAAcc,GACpB,IAAIC,EAASN,KAAKC,MAAMM,IAAIhB,GAGN,iBAAXe,GAMNA,IACHA,EAASN,KAAKG,SAASZ,GACpBiB,OAAM,IAAM,KACZf,MAAKgB,IAEJT,KAAKC,MAAMS,IAAInB,EAAMkB,GACdA,KAIXT,KAAKC,MAAMS,IAAInB,EAAMe,IAGvBA,EAAOb,KAAKY,IAlBVA,EAAWC,EAmBd,CAED,YAAAK,CAAaC,EAAyDC,GACpE,IAAItB,EACAkB,EAWJ,GAT0B,iBAAfG,GACTrB,EAAOqB,EACPH,EAAMI,IAENtB,EAAOqB,EAAWE,MAClBL,EAAMG,EAAWG,UAIdxB,EACH,MAAM,IAAIyB,MAAM,6CAElB,IAAKP,EACH,MAAM,IAAIO,MAAM,0BAGlBhB,KAAKC,MAAMS,IAAInB,EAAMkB,EACtB,CAED,KAAAQ,GACEjB,KAAKC,MAAMgB,OACZ"}
|
package/lib/Progress.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{_ as s}from"./tslib.es6-CmLYFWVC.js";import{css as r,LitElement as o,html as t,svg as e}from"lit";import{property as i,state as n,customElement as a}from"lit/decorators.js";import{ifDefined as l}from"lit/directives/if-defined.js";import{c}from"./cond-CI1KbneT.js";import{s as h}from"./Component-DSU3Qp0O.js";const g=r`:host{--_n-progress-color:var(--n-progress-color, var(--n-color-accent));--_n-progress-size:var(--n-size-icon-m);--_n-progress-background:var(--n-color-background);inline-size:var(--_n-progress-size);block-size:var(--_n-progress-size);display:inline-flex;position:relative}:host([size=xs]){--_n-progress-size:var(--n-size-icon-xs)}:host([size="s"]){--_n-progress-size:var(--n-size-icon-s)}:host([size="l"]){--_n-progress-size:var(--n-size-icon-l)}:host([size=xl]){--_n-progress-size:var(--n-size-icon-xl)}:host([size=xxl]){--_n-progress-size:var(--n-size-icon-xxl)}:host([color=success]){--_n-progress-color:var(--n-color-status-success)}:host([color=warning]){--_n-progress-color:var(--n-color-status-warning)}:host([color=danger]){--_n-progress-color:var(--n-color-status-danger)}:host([color=highlight]){--_n-progress-color:var(--n-color-status-highlight)}:host([color=info]){--_n-progress-color:var(--n-color-status-info)}:host svg{inline-size:100%;block-size:100%}`,d=11.25,p=11.25;let m=0;let _=class extends o{constructor(){super(),this.size="m",this.progress=0,this._animatedProgress=0,this._animationId=null,this._targetProgress=0,this._instanceId=0,this._instanceId=m++}connectedCallback(){super.connectedCallback(),this._animatedProgress=this.progress,this._targetProgress=this.progress}disconnectedCallback(){super.disconnectedCallback(),null!==this._animationId&&(cancelAnimationFrame(this._animationId),this._animationId=null)}updated(s){s.has("progress")&&(this._targetProgress=Math.max(0,Math.min(100,this.progress)),this._animate())}_animate(){null!==this._animationId&&cancelAnimationFrame(this._animationId);const s=()=>{const r=this._targetProgress-this._animatedProgress;if(Math.abs(r)<.5)return this._animatedProgress=this._targetProgress,void(this._animationId=null);this._animatedProgress+=.15*r,this._animationId=requestAnimationFrame(s)};this._animationId=requestAnimationFrame(s)}get _clampedProgress(){return Math.max(0,Math.min(100,this._animatedProgress))}get _isSemanticColor(){var s;return["success","warning","danger","highlight","info"].includes(null!==(s=this.color)&&void 0!==s?s:"")}get _customColorStyle(){if(this.color&&!this._isSemanticColor)return`--_n-progress-color:${this.color}`}render(){const s=Boolean(this.label),r=function(s){const r=Math.max(0,Math.min(100,s));if(0===r)return"";if(100===r)return"M11.25,5.25\n A6,6 0 1 1 11.25,17.25\n A6,6 0 1 1 11.25,5.25 Z";const o=r/100*360,t=(-90+o)*(Math.PI/180);return`M11.25,11.25\n L11.25,5.25\n A6,6 0 ${o>180?1:0},1 ${d+6*Math.cos(t)},${p+6*Math.sin(t)}\n Z`}(this._clampedProgress),o=`n-progress-clip-${this._instanceId}`;return t`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22.5 22.5" fill="none" role="${c(s,"progressbar")}" aria-label="${l(this.label)}" aria-valuenow="${c(s,Math.round(this._clampedProgress))}" aria-valuemin="${c(s,"0")}" aria-valuemax="${c(s,"100")}" aria-hidden="${c(!s,"true")}" style="${l(this._customColorStyle)}"><g clip-path="url(#${o})"><rect x="1.25" y="1.25" width="20" height="20" rx="10" fill="var(--_n-progress-background)"/><circle cx="${d}" cy="${p}" r="${9}" fill="var(--_n-progress-background)" stroke="var(--_n-progress-color)" stroke-width="2"/>${e`<path fill="var(--_n-progress-color)" d="${r}">`}</g><rect x="0.625" y="0.625" width="21.25" height="21.25" rx="10.625" stroke="var(--_n-progress-background)" stroke-width="1.25"/><defs><clipPath id="${o}"><rect x="1.25" y="1.25" width="20" height="20" rx="10" fill="white"/></clipPath></defs></svg>`}};_.styles=[h,g],s([i({reflect:!0})],_.prototype,"size",void 0),s([i({reflect:!0})],_.prototype,"color",void 0),s([i({reflect:!0})],_.prototype,"label",void 0),s([i({reflect:!0,type:Number})],_.prototype,"progress",void 0),s([n()],_.prototype,"_animatedProgress",void 0),_=s([a("nord-progress")],_);var u=_;export{u as default};
|
|
2
|
+
//# sourceMappingURL=Progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Progress.js","sources":["../src/progress/Progress.ts"],"sourcesContent":["import { LitElement, html, svg } from \"lit\"\nimport { customElement, property, state } from \"lit/decorators.js\"\nimport { ifDefined } from \"lit/directives/if-defined.js\"\nimport { cond } from \"../common/directives/cond.js\"\nimport componentStyle from \"../common/styles/Component.css\"\nimport style from \"./Progress.css\"\n\nconst CX = 11.25\nconst CY = 11.25\nconst OUTER_RADIUS = 9\nconst INNER_RADIUS = 6\n\nlet instanceCounter = 0\n\n/**\n * Generates an SVG path for a pie sector starting from 12 o'clock, sweeping clockwise.\n * @param percent - The progress percentage (0-100)\n * @returns The SVG path data string\n */\nfunction sectorPath(percent: number): string {\n const p = Math.max(0, Math.min(100, percent))\n if (p === 0) return \"\"\n if (p === 100) {\n return `M${CX},${CY - INNER_RADIUS}\n A${INNER_RADIUS},${INNER_RADIUS} 0 1 1 ${CX},${CY + INNER_RADIUS}\n A${INNER_RADIUS},${INNER_RADIUS} 0 1 1 ${CX},${CY - INNER_RADIUS} Z`\n }\n const sweep = (p / 100) * 360\n const theta = (-90 + sweep) * (Math.PI / 180)\n const ex = CX + INNER_RADIUS * Math.cos(theta)\n const ey = CY + INNER_RADIUS * Math.sin(theta)\n const large = sweep > 180 ? 1 : 0\n return `M${CX},${CY}\n L${CX},${CY - INNER_RADIUS}\n A${INNER_RADIUS},${INNER_RADIUS} 0 ${large},1 ${ex},${ey}\n Z`\n}\n\n/**\n * Progress component is used to display a circular pie-chart style progress indicator.\n * You can customize the size and color of the progress indicator with the\n * provided properties.\n *\n * @status ready\n * @category feedback\n * @cssprop [--n-progress-color=var(--n-color-accent)] - Controls the color of the progress indicator.\n */\n@customElement(\"nord-progress\")\nexport default class Progress extends LitElement {\n static styles = [componentStyle, style]\n\n /**\n * The size of the progress indicator.\n */\n @property({ reflect: true }) size: \"xs\" | \"s\" | \"m\" | \"l\" | \"xl\" | \"xxl\" = \"m\"\n\n /**\n * The color of the progress indicator.\n * Can accept any valid CSS color value, including custom properties.\n * Takes precedence over the `--n-progress-color` CSS custom property.\n */\n @property({ reflect: true }) color?: string\n\n /**\n * An accessible label for the progress indicator.\n * If no label is supplied, the component is hidden from assistive technology.\n */\n @property({ reflect: true }) label?: string\n\n /**\n * The progress percentage value.\n */\n @property({ reflect: true, type: Number }) progress: number = 0\n\n /**\n * Internal state for the animated progress value.\n */\n @state() private _animatedProgress: number = 0\n\n /**\n * Animation frame ID for cleanup.\n */\n private _animationId: number | null = null\n\n /**\n * Target progress for animation.\n */\n private _targetProgress: number = 0\n\n /**\n * Unique ID for this component instance, used for SVG clipPath.\n */\n private _instanceId: number = 0\n\n constructor() {\n super()\n this._instanceId = instanceCounter++\n }\n\n connectedCallback() {\n super.connectedCallback()\n this._animatedProgress = this.progress\n this._targetProgress = this.progress\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n if (this._animationId !== null) {\n cancelAnimationFrame(this._animationId)\n this._animationId = null\n }\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has(\"progress\")) {\n this._targetProgress = Math.max(0, Math.min(100, this.progress))\n this._animate()\n }\n }\n\n private _animate() {\n if (this._animationId !== null) {\n cancelAnimationFrame(this._animationId)\n }\n\n const animate = () => {\n const diff = this._targetProgress - this._animatedProgress\n if (Math.abs(diff) < 0.5) {\n this._animatedProgress = this._targetProgress\n this._animationId = null\n return\n }\n // Ease towards target with smooth interpolation\n this._animatedProgress += diff * 0.15\n this._animationId = requestAnimationFrame(animate)\n }\n\n this._animationId = requestAnimationFrame(animate)\n }\n\n private get _clampedProgress(): number {\n return Math.max(0, Math.min(100, this._animatedProgress))\n }\n\n /**\n * Check if the color is a semantic value handled by CSS.\n */\n private get _isSemanticColor(): boolean {\n return [\"success\", \"warning\", \"danger\", \"highlight\", \"info\"].includes(this.color ?? \"\")\n }\n\n /**\n * Get the custom color style if not a semantic value.\n */\n private get _customColorStyle(): string | undefined {\n if (this.color && !this._isSemanticColor) {\n return `--_n-progress-color:${this.color}`\n }\n return undefined\n }\n\n render() {\n const hasLabel = Boolean(this.label)\n const pathData = sectorPath(this._clampedProgress)\n const clipId = `n-progress-clip-${this._instanceId}`\n\n return html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 22.5 22.5\"\n fill=\"none\"\n role=${cond(hasLabel, \"progressbar\")}\n aria-label=${ifDefined(this.label)}\n aria-valuenow=${cond(hasLabel, Math.round(this._clampedProgress))}\n aria-valuemin=${cond(hasLabel, \"0\")}\n aria-valuemax=${cond(hasLabel, \"100\")}\n aria-hidden=${cond(!hasLabel, \"true\")}\n style=${ifDefined(this._customColorStyle)}\n >\n <g clip-path=\"url(#${clipId})\">\n <rect x=\"1.25\" y=\"1.25\" width=\"20\" height=\"20\" rx=\"10\" fill=\"var(--_n-progress-background)\" />\n <circle\n cx=\"${CX}\"\n cy=\"${CY}\"\n r=\"${OUTER_RADIUS}\"\n fill=\"var(--_n-progress-background)\"\n stroke=\"var(--_n-progress-color)\"\n stroke-width=\"2\"\n />\n ${svg`<path fill=\"var(--_n-progress-color)\" d=\"${pathData}\" />`}\n </g>\n <rect\n x=\"0.625\"\n y=\"0.625\"\n width=\"21.25\"\n height=\"21.25\"\n rx=\"10.625\"\n stroke=\"var(--_n-progress-background)\"\n stroke-width=\"1.25\"\n />\n <defs>\n <clipPath id=\"${clipId}\">\n <rect x=\"1.25\" y=\"1.25\" width=\"20\" height=\"20\" rx=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"nord-progress\": Progress\n }\n}\n"],"names":["CX","CY","instanceCounter","Progress","LitElement","constructor","super","this","size","progress","_animatedProgress","_animationId","_targetProgress","_instanceId","connectedCallback","disconnectedCallback","cancelAnimationFrame","updated","changedProperties","has","Math","max","min","_animate","animate","diff","abs","requestAnimationFrame","_clampedProgress","_isSemanticColor","includes","_a","color","_customColorStyle","render","hasLabel","Boolean","label","pathData","percent","p","sweep","theta","PI","cos","sin","sectorPath","clipId","html","cond","ifDefined","round","svg","styles","componentStyle","style","__decorate","property","reflect","prototype","type","Number","state","customElement"],"mappings":"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"}
|