@charcoal-ui/icons 2.0.0 → 2.1.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/dist/index.cjs +6 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.modern.js +6 -1
- package/dist/index.modern.js.map +1 -1
- package/dist/index.module.js +6 -1
- package/dist/index.module.js.map +1 -1
- package/dist/loaders/CustomIconLoader.d.ts.map +1 -1
- package/dist/loaders/PixivIconLoadError.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/loaders/CustomIconLoader.ts +3 -0
- package/src/loaders/PixivIconLoadError.ts +2 -1
package/dist/index.cjs
CHANGED
|
@@ -158,7 +158,8 @@ var PixivIconLoadError = /*#__PURE__*/function (_Error) {
|
|
|
158
158
|
var message = formatMessage(name, cause); // TODO: TypeScript 4.6+ になるとここに `{ cause }` が渡せる
|
|
159
159
|
|
|
160
160
|
_this = _Error.call(this, message) || this;
|
|
161
|
-
|
|
161
|
+
_this.name = 'PixivIconLoadError';
|
|
162
|
+
Object.setPrototypeOf(_assertThisInitialized(_this), (this instanceof PixivIconLoadError ? this.constructor : void 0).prototype);
|
|
162
163
|
return _this;
|
|
163
164
|
}
|
|
164
165
|
|
|
@@ -277,6 +278,10 @@ var CustomIconLoader = /*#__PURE__*/function () {
|
|
|
277
278
|
_this2._resultSvg = svg;
|
|
278
279
|
return _this2._resultSvg;
|
|
279
280
|
})["catch"](function (e) {
|
|
281
|
+
if (e instanceof PixivIconLoadError) {
|
|
282
|
+
throw e;
|
|
283
|
+
}
|
|
284
|
+
|
|
280
285
|
throw new PixivIconLoadError(_this2._name, e);
|
|
281
286
|
})["finally"](function () {
|
|
282
287
|
_this2._promise = undefined;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/charcoalIconFiles.ts","../src/loaders/PixivIconLoadError.ts","../src/loaders/CharcoalIconFilesLoader.ts","../src/loaders/CustomIconLoader.ts","../src/loaders/index.ts","../src/ssr.ts","../src/PixivIcon.ts","../src/index.ts"],"sourcesContent":["import charcoalIconFiles from '@charcoal-ui/icon-files'\n\nexport default charcoalIconFiles\nexport type KnownIconFile = keyof typeof charcoalIconFiles\nexport const KNOWN_ICON_FILES = Object.keys(\n charcoalIconFiles\n) as KnownIconFile[]\n\nexport function isKnownIconFile(name: string): name is KnownIconFile {\n return name in charcoalIconFiles\n}\n","export class PixivIconLoadError extends Error {\n constructor(name: string, cause: unknown) {\n const message = formatMessage(name, cause)\n\n // TODO: TypeScript 4.6+ になるとここに `{ cause }` が渡せる\n super(message)\n Object.setPrototypeOf(this, new.target)\n }\n}\n\nfunction formatMessage(name: string, cause: unknown) {\n const message = `Failed to fetch <pixiv-icon name=\"${name}\">`\n if (cause == null) {\n return message\n }\n\n if (cause instanceof Error) {\n return `${message}: ${cause.toString()})`\n }\n\n return `${message}: ${JSON.stringify(cause)})`\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\nimport charcoalIconFiles, { KnownIconFile } from '../charcoalIconFiles'\n\n/**\n * `@charcoal-ui/icon-files` に収録されているアイコンを取ってくる\n */\nexport class CharcoalIconFilesLoader implements Loadable {\n private _name: KnownIconFile\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: KnownIconFile) {\n this._name = name\n }\n\n get importIconFile() {\n return charcoalIconFiles[this._name]\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = this.importIconFile()\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\n\n/**\n * `PixivIcon.extend()` で登録されたカスタムのアイコンを取得する\n */\nexport class CustomIconLoader implements Loadable {\n private _name: string\n private _filePathOrUrl: string\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: string, filePathOrUrl: string) {\n this._name = name\n this._filePathOrUrl = filePathOrUrl\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = fetch(this._filePathOrUrl)\n .then((response) => {\n if (!response.ok) {\n throw new PixivIconLoadError(this._name, 'Response is not ok')\n }\n\n return response.text()\n })\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { isKnownIconFile } from '../charcoalIconFiles'\nimport { CharcoalIconFilesLoader } from './CharcoalIconFilesLoader'\nimport { CustomIconLoader } from './CustomIconLoader'\nimport { Loadable } from './Loadable'\nimport { PixivIconLoadError } from './PixivIconLoadError'\n\n/**\n * icon をロードするオブジェクトのプール。Loader のインスタンスは作り次第ここに入れる\n *\n * 同じアイコンへの複数回のリクエストが起きないためには、Loader がこの中でユニークでないと行けない\n */\nconst loaders = new Map<string, Loadable>()\n\nexport function addCustomIcon(name: string, filePathOrUrl: string) {\n loaders.set(name, new CustomIconLoader(name, filePathOrUrl))\n}\n\nexport async function getIcon(name: string) {\n const loader = resolveIconLoader(name)\n if (loader == null) {\n throw new PixivIconLoadError(name, 'Loader was not found')\n }\n\n return loader.fetch().catch((e) => {\n if (e instanceof PixivIconLoadError) {\n throw e\n }\n\n throw new PixivIconLoadError(name, e)\n })\n}\n\nfunction resolveIconLoader(name: string) {\n // 登録済み or キャッシュ済みの場合\n // addCustomIcon で登録された CustomIconLoader は常にこっちを通る\n const registeredLoader = loaders.get(name)\n if (registeredLoader) {\n return registeredLoader\n }\n\n // `@charcoal-ui/icon-files` に収録されているアイコンにはこれを返す\n if (isKnownIconFile(name)) {\n const charcoalIconFilesLoader = new CharcoalIconFilesLoader(name)\n\n loaders.set(name, charcoalIconFilesLoader)\n return charcoalIconFilesLoader\n }\n\n // 存在しないアイコンにはこれを返す\n return null\n}\n","export const __SERVER__ = typeof window === 'undefined'\n\nconst CAN_USE_DOM = typeof HTMLElement !== 'undefined'\n\n// Workaround: `extends HTMLELement` の形式でないとbabelのトランスパイルがおかしくなる\nif (__SERVER__ || !CAN_USE_DOM) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n globalThis.HTMLElement = class {} as any\n}\n","import type React from 'react'\nimport warning from 'warning'\nimport { KnownIconFile } from './charcoalIconFiles'\nimport { getIcon, addCustomIcon } from './loaders'\nimport { __SERVER__ } from './ssr'\nimport DOMPurify from 'dompurify'\n\nconst attributes = ['name', 'scale', 'unsafe-non-guideline-scale'] as const\n\nconst ROOT_MARGIN = 50\n\nexport interface KnownIconType extends Record<KnownIconFile, unknown> {}\n\nexport interface Props\n extends Omit<\n React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>,\n 'className' | 'css'\n > {\n name: keyof KnownIconType\n scale?: 1 | 2 | 3 | '1' | '2' | '3'\n 'unsafe-non-guideline-scale'?: number | string\n\n // CustomElements は className が使えない。class と書く必要がある\n // https://ja.reactjs.org/docs/web-components.html#using-web-components-in-react\n class?: string\n}\n\ntype ExtendedIconFile = Exclude<keyof KnownIconType, KnownIconFile>\ntype Extended = [ExtendedIconFile] extends [never] // NOTE: ExtendedIconFileがneverならKnownIconTypeは拡張されていない\n ? false\n : true\n\nexport class PixivIcon extends HTMLElement {\n static readonly tagName = 'pixiv-icon'\n\n static extend(\n map: Extended extends true\n ? Record<ExtendedIconFile, string>\n : Record<string, string>\n ) {\n warning(!__SERVER__, 'Using `PixivIcon.extend()` on server has no effect')\n if (__SERVER__) {\n return\n }\n\n Object.entries(map).forEach(([name, filePathOrUrl]) => {\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n addCustomIcon(name, filePathOrUrl)\n })\n }\n\n static get observedAttributes() {\n return attributes\n }\n\n private svgContent?: string\n private observer?: IntersectionObserver\n private isVisible = false\n\n get props() {\n const partial = Object.fromEntries(\n attributes.map((attribute) => [attribute, this.getAttribute(attribute)])\n ) as Record<typeof attributes[number], string | null>\n\n const name = partial.name\n\n if (name === null) {\n throw new TypeError('property \"name\" is required.')\n }\n\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n return {\n ...partial,\n name,\n }\n }\n\n get forceResizedSize() {\n if (this.props['unsafe-non-guideline-scale'] === null) {\n return null\n }\n\n const [size] = this.props.name.split('/')\n const scale = Number(this.props['unsafe-non-guideline-scale'])\n\n switch (size) {\n case 'Inline': {\n return 16 * scale\n }\n\n default: {\n return Number(size) * scale\n }\n }\n }\n\n get scaledSize() {\n const [size] = this.props.name.split('/')\n\n const scale = Number(this.props.scale ?? '1')\n\n switch (size) {\n case 'Inline': {\n switch (scale) {\n case 2: {\n return 32\n }\n\n default: {\n return 16\n }\n }\n }\n\n case '24': {\n return Number(size) * scale\n }\n\n default: {\n return Number(size)\n }\n }\n }\n\n constructor() {\n super()\n this.attachShadow({ mode: 'open' })\n }\n\n async connectedCallback() {\n this.render()\n await this.waitUntilVisible()\n this.isVisible = true\n await this.loadSvg(this.props.name)\n }\n\n disconnectedCallback() {\n this.observer?.disconnect()\n this.observer = undefined\n this.isVisible = false\n }\n\n attributeChangedCallback(\n attr: string,\n _oldValue: string | null,\n newValue: string\n ) {\n // 非表示の場合はロードしない\n if (!this.isVisible) {\n return\n }\n\n // name が変更された場合必ず再読み込みを試みる\n if (attr === 'name') {\n void this.loadSvg(newValue)\n return\n }\n\n // SVG が読み込み済み && scale などの変更だけならそこだけ反映すればいい\n if (this.svgContent !== undefined) {\n this.render()\n return\n }\n\n // まだ SVG が読み込めてないなら load\n void this.loadSvg(this.props.name)\n }\n\n render() {\n const size = this.forceResizedSize ?? this.scaledSize\n\n const style = DOMPurify.sanitize(\n `<style>\n :host {\n display: inline-flex;\n --size: ${size}px;\n }\n\n svg {\n width: var(--size);\n height: var(--size);\n }\n</style>`,\n { ALLOWED_TAGS: ['style'], FORCE_BODY: true }\n )\n\n const svg = DOMPurify.sanitize(\n this.svgContent !== undefined\n ? this.svgContent\n : `<svg viewBox=\"0 0 ${size} ${size}\"></svg>`,\n { USE_PROFILES: { svg: true, svgFilters: true } }\n )\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.shadowRoot!.innerHTML = style + svg\n }\n\n private async loadSvg(name: string) {\n this.svgContent = await getIcon(name)\n this.render()\n }\n\n private waitUntilVisible() {\n return new Promise<void>((resolve) => {\n this.observer = new IntersectionObserver(\n ([first]) => {\n if (first.isIntersecting) {\n this.observer?.disconnect()\n this.observer = undefined\n resolve()\n }\n },\n { rootMargin: `${ROOT_MARGIN}px` }\n )\n\n this.observer.observe(this)\n })\n }\n}\n","import { PixivIcon, Props } from './PixivIcon'\nimport { __SERVER__ } from './ssr'\nexport { PixivIcon, type KnownIconType, type Props } from './PixivIcon'\nexport { KNOWN_ICON_FILES } from './charcoalIconFiles'\nexport { PixivIconLoadError } from './loaders/PixivIconLoadError'\n\ndeclare global {\n interface Window {\n PixivIcon: typeof PixivIcon\n }\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n export namespace JSX {\n interface IntrinsicElements {\n 'pixiv-icon': Props\n }\n }\n}\n\nif (!__SERVER__) {\n // TODO: HMR対応\n if (!window.customElements.get(PixivIcon.tagName)) {\n window.PixivIcon = PixivIcon\n window.customElements.define(PixivIcon.tagName, PixivIcon)\n }\n}\n"],"names":["KNOWN_ICON_FILES","Object","keys","charcoalIconFiles","isKnownIconFile","name","PixivIconLoadError","cause","message","formatMessage","setPrototypeOf","Error","toString","JSON","stringify","CharcoalIconFilesLoader","_name","_resultSvg","undefined","_promise","fetch","importIconFile","then","svg","e","CustomIconLoader","filePathOrUrl","_filePathOrUrl","response","ok","text","getIcon","loader","resolveIconLoader","loaders","Map","addCustomIcon","set","registeredLoader","get","charcoalIconFilesLoader","__SERVER__","window","CAN_USE_DOM","HTMLElement","globalThis","attributes","ROOT_MARGIN","PixivIcon","extend","map","warning","entries","forEach","includes","TypeError","svgContent","observer","isVisible","attachShadow","mode","connectedCallback","render","waitUntilVisible","loadSvg","props","disconnectedCallback","disconnect","attributeChangedCallback","attr","_oldValue","newValue","size","forceResizedSize","scaledSize","style","DOMPurify","sanitize","ALLOWED_TAGS","FORCE_BODY","USE_PROFILES","svgFilters","shadowRoot","innerHTML","Promise","resolve","IntersectionObserver","first","isIntersecting","rootMargin","observe","partial","fromEntries","attribute","getAttribute","split","scale","Number","tagName","customElements","define"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/charcoalIconFiles.ts","../src/loaders/PixivIconLoadError.ts","../src/loaders/CharcoalIconFilesLoader.ts","../src/loaders/CustomIconLoader.ts","../src/loaders/index.ts","../src/ssr.ts","../src/PixivIcon.ts","../src/index.ts"],"sourcesContent":["import charcoalIconFiles from '@charcoal-ui/icon-files'\n\nexport default charcoalIconFiles\nexport type KnownIconFile = keyof typeof charcoalIconFiles\nexport const KNOWN_ICON_FILES = Object.keys(\n charcoalIconFiles\n) as KnownIconFile[]\n\nexport function isKnownIconFile(name: string): name is KnownIconFile {\n return name in charcoalIconFiles\n}\n","export class PixivIconLoadError extends Error {\n constructor(name: string, cause: unknown) {\n const message = formatMessage(name, cause)\n\n // TODO: TypeScript 4.6+ になるとここに `{ cause }` が渡せる\n super(message)\n this.name = 'PixivIconLoadError'\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nfunction formatMessage(name: string, cause: unknown) {\n const message = `Failed to fetch <pixiv-icon name=\"${name}\">`\n if (cause == null) {\n return message\n }\n\n if (cause instanceof Error) {\n return `${message}: ${cause.toString()})`\n }\n\n return `${message}: ${JSON.stringify(cause)})`\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\nimport charcoalIconFiles, { KnownIconFile } from '../charcoalIconFiles'\n\n/**\n * `@charcoal-ui/icon-files` に収録されているアイコンを取ってくる\n */\nexport class CharcoalIconFilesLoader implements Loadable {\n private _name: KnownIconFile\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: KnownIconFile) {\n this._name = name\n }\n\n get importIconFile() {\n return charcoalIconFiles[this._name]\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = this.importIconFile()\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\n\n/**\n * `PixivIcon.extend()` で登録されたカスタムのアイコンを取得する\n */\nexport class CustomIconLoader implements Loadable {\n private _name: string\n private _filePathOrUrl: string\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: string, filePathOrUrl: string) {\n this._name = name\n this._filePathOrUrl = filePathOrUrl\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = fetch(this._filePathOrUrl)\n .then((response) => {\n if (!response.ok) {\n throw new PixivIconLoadError(this._name, 'Response is not ok')\n }\n\n return response.text()\n })\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n if (e instanceof PixivIconLoadError) {\n throw e\n }\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { isKnownIconFile } from '../charcoalIconFiles'\nimport { CharcoalIconFilesLoader } from './CharcoalIconFilesLoader'\nimport { CustomIconLoader } from './CustomIconLoader'\nimport { Loadable } from './Loadable'\nimport { PixivIconLoadError } from './PixivIconLoadError'\n\n/**\n * icon をロードするオブジェクトのプール。Loader のインスタンスは作り次第ここに入れる\n *\n * 同じアイコンへの複数回のリクエストが起きないためには、Loader がこの中でユニークでないと行けない\n */\nconst loaders = new Map<string, Loadable>()\n\nexport function addCustomIcon(name: string, filePathOrUrl: string) {\n loaders.set(name, new CustomIconLoader(name, filePathOrUrl))\n}\n\nexport async function getIcon(name: string) {\n const loader = resolveIconLoader(name)\n if (loader == null) {\n throw new PixivIconLoadError(name, 'Loader was not found')\n }\n\n return loader.fetch().catch((e) => {\n if (e instanceof PixivIconLoadError) {\n throw e\n }\n\n throw new PixivIconLoadError(name, e)\n })\n}\n\nfunction resolveIconLoader(name: string) {\n // 登録済み or キャッシュ済みの場合\n // addCustomIcon で登録された CustomIconLoader は常にこっちを通る\n const registeredLoader = loaders.get(name)\n if (registeredLoader) {\n return registeredLoader\n }\n\n // `@charcoal-ui/icon-files` に収録されているアイコンにはこれを返す\n if (isKnownIconFile(name)) {\n const charcoalIconFilesLoader = new CharcoalIconFilesLoader(name)\n\n loaders.set(name, charcoalIconFilesLoader)\n return charcoalIconFilesLoader\n }\n\n // 存在しないアイコンにはこれを返す\n return null\n}\n","export const __SERVER__ = typeof window === 'undefined'\n\nconst CAN_USE_DOM = typeof HTMLElement !== 'undefined'\n\n// Workaround: `extends HTMLELement` の形式でないとbabelのトランスパイルがおかしくなる\nif (__SERVER__ || !CAN_USE_DOM) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n globalThis.HTMLElement = class {} as any\n}\n","import type React from 'react'\nimport warning from 'warning'\nimport { KnownIconFile } from './charcoalIconFiles'\nimport { getIcon, addCustomIcon } from './loaders'\nimport { __SERVER__ } from './ssr'\nimport DOMPurify from 'dompurify'\n\nconst attributes = ['name', 'scale', 'unsafe-non-guideline-scale'] as const\n\nconst ROOT_MARGIN = 50\n\nexport interface KnownIconType extends Record<KnownIconFile, unknown> {}\n\nexport interface Props\n extends Omit<\n React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>,\n 'className' | 'css'\n > {\n name: keyof KnownIconType\n scale?: 1 | 2 | 3 | '1' | '2' | '3'\n 'unsafe-non-guideline-scale'?: number | string\n\n // CustomElements は className が使えない。class と書く必要がある\n // https://ja.reactjs.org/docs/web-components.html#using-web-components-in-react\n class?: string\n}\n\ntype ExtendedIconFile = Exclude<keyof KnownIconType, KnownIconFile>\ntype Extended = [ExtendedIconFile] extends [never] // NOTE: ExtendedIconFileがneverならKnownIconTypeは拡張されていない\n ? false\n : true\n\nexport class PixivIcon extends HTMLElement {\n static readonly tagName = 'pixiv-icon'\n\n static extend(\n map: Extended extends true\n ? Record<ExtendedIconFile, string>\n : Record<string, string>\n ) {\n warning(!__SERVER__, 'Using `PixivIcon.extend()` on server has no effect')\n if (__SERVER__) {\n return\n }\n\n Object.entries(map).forEach(([name, filePathOrUrl]) => {\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n addCustomIcon(name, filePathOrUrl)\n })\n }\n\n static get observedAttributes() {\n return attributes\n }\n\n private svgContent?: string\n private observer?: IntersectionObserver\n private isVisible = false\n\n get props() {\n const partial = Object.fromEntries(\n attributes.map((attribute) => [attribute, this.getAttribute(attribute)])\n ) as Record<typeof attributes[number], string | null>\n\n const name = partial.name\n\n if (name === null) {\n throw new TypeError('property \"name\" is required.')\n }\n\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n return {\n ...partial,\n name,\n }\n }\n\n get forceResizedSize() {\n if (this.props['unsafe-non-guideline-scale'] === null) {\n return null\n }\n\n const [size] = this.props.name.split('/')\n const scale = Number(this.props['unsafe-non-guideline-scale'])\n\n switch (size) {\n case 'Inline': {\n return 16 * scale\n }\n\n default: {\n return Number(size) * scale\n }\n }\n }\n\n get scaledSize() {\n const [size] = this.props.name.split('/')\n\n const scale = Number(this.props.scale ?? '1')\n\n switch (size) {\n case 'Inline': {\n switch (scale) {\n case 2: {\n return 32\n }\n\n default: {\n return 16\n }\n }\n }\n\n case '24': {\n return Number(size) * scale\n }\n\n default: {\n return Number(size)\n }\n }\n }\n\n constructor() {\n super()\n this.attachShadow({ mode: 'open' })\n }\n\n async connectedCallback() {\n this.render()\n await this.waitUntilVisible()\n this.isVisible = true\n await this.loadSvg(this.props.name)\n }\n\n disconnectedCallback() {\n this.observer?.disconnect()\n this.observer = undefined\n this.isVisible = false\n }\n\n attributeChangedCallback(\n attr: string,\n _oldValue: string | null,\n newValue: string\n ) {\n // 非表示の場合はロードしない\n if (!this.isVisible) {\n return\n }\n\n // name が変更された場合必ず再読み込みを試みる\n if (attr === 'name') {\n void this.loadSvg(newValue)\n return\n }\n\n // SVG が読み込み済み && scale などの変更だけならそこだけ反映すればいい\n if (this.svgContent !== undefined) {\n this.render()\n return\n }\n\n // まだ SVG が読み込めてないなら load\n void this.loadSvg(this.props.name)\n }\n\n render() {\n const size = this.forceResizedSize ?? this.scaledSize\n\n const style = DOMPurify.sanitize(\n `<style>\n :host {\n display: inline-flex;\n --size: ${size}px;\n }\n\n svg {\n width: var(--size);\n height: var(--size);\n }\n</style>`,\n { ALLOWED_TAGS: ['style'], FORCE_BODY: true }\n )\n\n const svg = DOMPurify.sanitize(\n this.svgContent !== undefined\n ? this.svgContent\n : `<svg viewBox=\"0 0 ${size} ${size}\"></svg>`,\n { USE_PROFILES: { svg: true, svgFilters: true } }\n )\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.shadowRoot!.innerHTML = style + svg\n }\n\n private async loadSvg(name: string) {\n this.svgContent = await getIcon(name)\n this.render()\n }\n\n private waitUntilVisible() {\n return new Promise<void>((resolve) => {\n this.observer = new IntersectionObserver(\n ([first]) => {\n if (first.isIntersecting) {\n this.observer?.disconnect()\n this.observer = undefined\n resolve()\n }\n },\n { rootMargin: `${ROOT_MARGIN}px` }\n )\n\n this.observer.observe(this)\n })\n }\n}\n","import { PixivIcon, Props } from './PixivIcon'\nimport { __SERVER__ } from './ssr'\nexport { PixivIcon, type KnownIconType, type Props } from './PixivIcon'\nexport { KNOWN_ICON_FILES } from './charcoalIconFiles'\nexport { PixivIconLoadError } from './loaders/PixivIconLoadError'\n\ndeclare global {\n interface Window {\n PixivIcon: typeof PixivIcon\n }\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n export namespace JSX {\n interface IntrinsicElements {\n 'pixiv-icon': Props\n }\n }\n}\n\nif (!__SERVER__) {\n // TODO: HMR対応\n if (!window.customElements.get(PixivIcon.tagName)) {\n window.PixivIcon = PixivIcon\n window.customElements.define(PixivIcon.tagName, PixivIcon)\n }\n}\n"],"names":["KNOWN_ICON_FILES","Object","keys","charcoalIconFiles","isKnownIconFile","name","PixivIconLoadError","cause","message","formatMessage","setPrototypeOf","prototype","Error","toString","JSON","stringify","CharcoalIconFilesLoader","_name","_resultSvg","undefined","_promise","fetch","importIconFile","then","svg","e","CustomIconLoader","filePathOrUrl","_filePathOrUrl","response","ok","text","getIcon","loader","resolveIconLoader","loaders","Map","addCustomIcon","set","registeredLoader","get","charcoalIconFilesLoader","__SERVER__","window","CAN_USE_DOM","HTMLElement","globalThis","attributes","ROOT_MARGIN","PixivIcon","extend","map","warning","entries","forEach","includes","TypeError","svgContent","observer","isVisible","attachShadow","mode","connectedCallback","render","waitUntilVisible","loadSvg","props","disconnectedCallback","disconnect","attributeChangedCallback","attr","_oldValue","newValue","size","forceResizedSize","scaledSize","style","DOMPurify","sanitize","ALLOWED_TAGS","FORCE_BODY","USE_PROFILES","svgFilters","shadowRoot","innerHTML","Promise","resolve","IntersectionObserver","first","isIntersecting","rootMargin","observe","partial","fromEntries","attribute","getAttribute","split","scale","Number","tagName","customElements","define"],"mappings":"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"}
|
package/dist/index.modern.js
CHANGED
|
@@ -30,7 +30,8 @@ class PixivIconLoadError extends Error {
|
|
|
30
30
|
const message = formatMessage(name, cause); // TODO: TypeScript 4.6+ になるとここに `{ cause }` が渡せる
|
|
31
31
|
|
|
32
32
|
super(message);
|
|
33
|
-
|
|
33
|
+
this.name = 'PixivIconLoadError';
|
|
34
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
}
|
|
@@ -120,6 +121,10 @@ class CustomIconLoader {
|
|
|
120
121
|
this._resultSvg = svg;
|
|
121
122
|
return this._resultSvg;
|
|
122
123
|
}).catch(e => {
|
|
124
|
+
if (e instanceof PixivIconLoadError) {
|
|
125
|
+
throw e;
|
|
126
|
+
}
|
|
127
|
+
|
|
123
128
|
throw new PixivIconLoadError(this._name, e);
|
|
124
129
|
}).finally(() => {
|
|
125
130
|
this._promise = undefined;
|
package/dist/index.modern.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.modern.js","sources":["../src/charcoalIconFiles.ts","../src/loaders/PixivIconLoadError.ts","../src/loaders/CharcoalIconFilesLoader.ts","../src/loaders/CustomIconLoader.ts","../src/loaders/index.ts","../src/ssr.ts","../src/PixivIcon.ts","../src/index.ts"],"sourcesContent":["import charcoalIconFiles from '@charcoal-ui/icon-files'\n\nexport default charcoalIconFiles\nexport type KnownIconFile = keyof typeof charcoalIconFiles\nexport const KNOWN_ICON_FILES = Object.keys(\n charcoalIconFiles\n) as KnownIconFile[]\n\nexport function isKnownIconFile(name: string): name is KnownIconFile {\n return name in charcoalIconFiles\n}\n","export class PixivIconLoadError extends Error {\n constructor(name: string, cause: unknown) {\n const message = formatMessage(name, cause)\n\n // TODO: TypeScript 4.6+ になるとここに `{ cause }` が渡せる\n super(message)\n Object.setPrototypeOf(this, new.target)\n }\n}\n\nfunction formatMessage(name: string, cause: unknown) {\n const message = `Failed to fetch <pixiv-icon name=\"${name}\">`\n if (cause == null) {\n return message\n }\n\n if (cause instanceof Error) {\n return `${message}: ${cause.toString()})`\n }\n\n return `${message}: ${JSON.stringify(cause)})`\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\nimport charcoalIconFiles, { KnownIconFile } from '../charcoalIconFiles'\n\n/**\n * `@charcoal-ui/icon-files` に収録されているアイコンを取ってくる\n */\nexport class CharcoalIconFilesLoader implements Loadable {\n private _name: KnownIconFile\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: KnownIconFile) {\n this._name = name\n }\n\n get importIconFile() {\n return charcoalIconFiles[this._name]\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = this.importIconFile()\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\n\n/**\n * `PixivIcon.extend()` で登録されたカスタムのアイコンを取得する\n */\nexport class CustomIconLoader implements Loadable {\n private _name: string\n private _filePathOrUrl: string\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: string, filePathOrUrl: string) {\n this._name = name\n this._filePathOrUrl = filePathOrUrl\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = fetch(this._filePathOrUrl)\n .then((response) => {\n if (!response.ok) {\n throw new PixivIconLoadError(this._name, 'Response is not ok')\n }\n\n return response.text()\n })\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { isKnownIconFile } from '../charcoalIconFiles'\nimport { CharcoalIconFilesLoader } from './CharcoalIconFilesLoader'\nimport { CustomIconLoader } from './CustomIconLoader'\nimport { Loadable } from './Loadable'\nimport { PixivIconLoadError } from './PixivIconLoadError'\n\n/**\n * icon をロードするオブジェクトのプール。Loader のインスタンスは作り次第ここに入れる\n *\n * 同じアイコンへの複数回のリクエストが起きないためには、Loader がこの中でユニークでないと行けない\n */\nconst loaders = new Map<string, Loadable>()\n\nexport function addCustomIcon(name: string, filePathOrUrl: string) {\n loaders.set(name, new CustomIconLoader(name, filePathOrUrl))\n}\n\nexport async function getIcon(name: string) {\n const loader = resolveIconLoader(name)\n if (loader == null) {\n throw new PixivIconLoadError(name, 'Loader was not found')\n }\n\n return loader.fetch().catch((e) => {\n if (e instanceof PixivIconLoadError) {\n throw e\n }\n\n throw new PixivIconLoadError(name, e)\n })\n}\n\nfunction resolveIconLoader(name: string) {\n // 登録済み or キャッシュ済みの場合\n // addCustomIcon で登録された CustomIconLoader は常にこっちを通る\n const registeredLoader = loaders.get(name)\n if (registeredLoader) {\n return registeredLoader\n }\n\n // `@charcoal-ui/icon-files` に収録されているアイコンにはこれを返す\n if (isKnownIconFile(name)) {\n const charcoalIconFilesLoader = new CharcoalIconFilesLoader(name)\n\n loaders.set(name, charcoalIconFilesLoader)\n return charcoalIconFilesLoader\n }\n\n // 存在しないアイコンにはこれを返す\n return null\n}\n","export const __SERVER__ = typeof window === 'undefined'\n\nconst CAN_USE_DOM = typeof HTMLElement !== 'undefined'\n\n// Workaround: `extends HTMLELement` の形式でないとbabelのトランスパイルがおかしくなる\nif (__SERVER__ || !CAN_USE_DOM) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n globalThis.HTMLElement = class {} as any\n}\n","import type React from 'react'\nimport warning from 'warning'\nimport { KnownIconFile } from './charcoalIconFiles'\nimport { getIcon, addCustomIcon } from './loaders'\nimport { __SERVER__ } from './ssr'\nimport DOMPurify from 'dompurify'\n\nconst attributes = ['name', 'scale', 'unsafe-non-guideline-scale'] as const\n\nconst ROOT_MARGIN = 50\n\nexport interface KnownIconType extends Record<KnownIconFile, unknown> {}\n\nexport interface Props\n extends Omit<\n React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>,\n 'className' | 'css'\n > {\n name: keyof KnownIconType\n scale?: 1 | 2 | 3 | '1' | '2' | '3'\n 'unsafe-non-guideline-scale'?: number | string\n\n // CustomElements は className が使えない。class と書く必要がある\n // https://ja.reactjs.org/docs/web-components.html#using-web-components-in-react\n class?: string\n}\n\ntype ExtendedIconFile = Exclude<keyof KnownIconType, KnownIconFile>\ntype Extended = [ExtendedIconFile] extends [never] // NOTE: ExtendedIconFileがneverならKnownIconTypeは拡張されていない\n ? false\n : true\n\nexport class PixivIcon extends HTMLElement {\n static readonly tagName = 'pixiv-icon'\n\n static extend(\n map: Extended extends true\n ? Record<ExtendedIconFile, string>\n : Record<string, string>\n ) {\n warning(!__SERVER__, 'Using `PixivIcon.extend()` on server has no effect')\n if (__SERVER__) {\n return\n }\n\n Object.entries(map).forEach(([name, filePathOrUrl]) => {\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n addCustomIcon(name, filePathOrUrl)\n })\n }\n\n static get observedAttributes() {\n return attributes\n }\n\n private svgContent?: string\n private observer?: IntersectionObserver\n private isVisible = false\n\n get props() {\n const partial = Object.fromEntries(\n attributes.map((attribute) => [attribute, this.getAttribute(attribute)])\n ) as Record<typeof attributes[number], string | null>\n\n const name = partial.name\n\n if (name === null) {\n throw new TypeError('property \"name\" is required.')\n }\n\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n return {\n ...partial,\n name,\n }\n }\n\n get forceResizedSize() {\n if (this.props['unsafe-non-guideline-scale'] === null) {\n return null\n }\n\n const [size] = this.props.name.split('/')\n const scale = Number(this.props['unsafe-non-guideline-scale'])\n\n switch (size) {\n case 'Inline': {\n return 16 * scale\n }\n\n default: {\n return Number(size) * scale\n }\n }\n }\n\n get scaledSize() {\n const [size] = this.props.name.split('/')\n\n const scale = Number(this.props.scale ?? '1')\n\n switch (size) {\n case 'Inline': {\n switch (scale) {\n case 2: {\n return 32\n }\n\n default: {\n return 16\n }\n }\n }\n\n case '24': {\n return Number(size) * scale\n }\n\n default: {\n return Number(size)\n }\n }\n }\n\n constructor() {\n super()\n this.attachShadow({ mode: 'open' })\n }\n\n async connectedCallback() {\n this.render()\n await this.waitUntilVisible()\n this.isVisible = true\n await this.loadSvg(this.props.name)\n }\n\n disconnectedCallback() {\n this.observer?.disconnect()\n this.observer = undefined\n this.isVisible = false\n }\n\n attributeChangedCallback(\n attr: string,\n _oldValue: string | null,\n newValue: string\n ) {\n // 非表示の場合はロードしない\n if (!this.isVisible) {\n return\n }\n\n // name が変更された場合必ず再読み込みを試みる\n if (attr === 'name') {\n void this.loadSvg(newValue)\n return\n }\n\n // SVG が読み込み済み && scale などの変更だけならそこだけ反映すればいい\n if (this.svgContent !== undefined) {\n this.render()\n return\n }\n\n // まだ SVG が読み込めてないなら load\n void this.loadSvg(this.props.name)\n }\n\n render() {\n const size = this.forceResizedSize ?? this.scaledSize\n\n const style = DOMPurify.sanitize(\n `<style>\n :host {\n display: inline-flex;\n --size: ${size}px;\n }\n\n svg {\n width: var(--size);\n height: var(--size);\n }\n</style>`,\n { ALLOWED_TAGS: ['style'], FORCE_BODY: true }\n )\n\n const svg = DOMPurify.sanitize(\n this.svgContent !== undefined\n ? this.svgContent\n : `<svg viewBox=\"0 0 ${size} ${size}\"></svg>`,\n { USE_PROFILES: { svg: true, svgFilters: true } }\n )\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.shadowRoot!.innerHTML = style + svg\n }\n\n private async loadSvg(name: string) {\n this.svgContent = await getIcon(name)\n this.render()\n }\n\n private waitUntilVisible() {\n return new Promise<void>((resolve) => {\n this.observer = new IntersectionObserver(\n ([first]) => {\n if (first.isIntersecting) {\n this.observer?.disconnect()\n this.observer = undefined\n resolve()\n }\n },\n { rootMargin: `${ROOT_MARGIN}px` }\n )\n\n this.observer.observe(this)\n })\n }\n}\n","import { PixivIcon, Props } from './PixivIcon'\nimport { __SERVER__ } from './ssr'\nexport { PixivIcon, type KnownIconType, type Props } from './PixivIcon'\nexport { KNOWN_ICON_FILES } from './charcoalIconFiles'\nexport { PixivIconLoadError } from './loaders/PixivIconLoadError'\n\ndeclare global {\n interface Window {\n PixivIcon: typeof PixivIcon\n }\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n export namespace JSX {\n interface IntrinsicElements {\n 'pixiv-icon': Props\n }\n }\n}\n\nif (!__SERVER__) {\n // TODO: HMR対応\n if (!window.customElements.get(PixivIcon.tagName)) {\n window.PixivIcon = PixivIcon\n window.customElements.define(PixivIcon.tagName, PixivIcon)\n }\n}\n"],"names":["KNOWN_ICON_FILES","Object","keys","charcoalIconFiles","isKnownIconFile","name","PixivIconLoadError","Error","constructor","cause","message","formatMessage","setPrototypeOf","new","target","toString","JSON","stringify","CharcoalIconFilesLoader","_name","_resultSvg","undefined","_promise","importIconFile","fetch","then","svg","catch","e","finally","CustomIconLoader","filePathOrUrl","_filePathOrUrl","response","ok","text","loaders","Map","addCustomIcon","set","getIcon","loader","resolveIconLoader","registeredLoader","get","charcoalIconFilesLoader","__SERVER__","window","CAN_USE_DOM","HTMLElement","globalThis","attributes","ROOT_MARGIN","PixivIcon","extend","map","warning","entries","forEach","includes","TypeError","observedAttributes","props","partial","fromEntries","attribute","getAttribute","forceResizedSize","size","split","scale","Number","scaledSize","svgContent","observer","isVisible","attachShadow","mode","connectedCallback","render","waitUntilVisible","loadSvg","disconnectedCallback","disconnect","attributeChangedCallback","attr","_oldValue","newValue","style","DOMPurify","sanitize","ALLOWED_TAGS","FORCE_BODY","USE_PROFILES","svgFilters","shadowRoot","innerHTML","Promise","resolve","IntersectionObserver","first","isIntersecting","rootMargin","observe","tagName","customElements","define"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.modern.js","sources":["../src/charcoalIconFiles.ts","../src/loaders/PixivIconLoadError.ts","../src/loaders/CharcoalIconFilesLoader.ts","../src/loaders/CustomIconLoader.ts","../src/loaders/index.ts","../src/ssr.ts","../src/PixivIcon.ts","../src/index.ts"],"sourcesContent":["import charcoalIconFiles from '@charcoal-ui/icon-files'\n\nexport default charcoalIconFiles\nexport type KnownIconFile = keyof typeof charcoalIconFiles\nexport const KNOWN_ICON_FILES = Object.keys(\n charcoalIconFiles\n) as KnownIconFile[]\n\nexport function isKnownIconFile(name: string): name is KnownIconFile {\n return name in charcoalIconFiles\n}\n","export class PixivIconLoadError extends Error {\n constructor(name: string, cause: unknown) {\n const message = formatMessage(name, cause)\n\n // TODO: TypeScript 4.6+ になるとここに `{ cause }` が渡せる\n super(message)\n this.name = 'PixivIconLoadError'\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nfunction formatMessage(name: string, cause: unknown) {\n const message = `Failed to fetch <pixiv-icon name=\"${name}\">`\n if (cause == null) {\n return message\n }\n\n if (cause instanceof Error) {\n return `${message}: ${cause.toString()})`\n }\n\n return `${message}: ${JSON.stringify(cause)})`\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\nimport charcoalIconFiles, { KnownIconFile } from '../charcoalIconFiles'\n\n/**\n * `@charcoal-ui/icon-files` に収録されているアイコンを取ってくる\n */\nexport class CharcoalIconFilesLoader implements Loadable {\n private _name: KnownIconFile\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: KnownIconFile) {\n this._name = name\n }\n\n get importIconFile() {\n return charcoalIconFiles[this._name]\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = this.importIconFile()\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\n\n/**\n * `PixivIcon.extend()` で登録されたカスタムのアイコンを取得する\n */\nexport class CustomIconLoader implements Loadable {\n private _name: string\n private _filePathOrUrl: string\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: string, filePathOrUrl: string) {\n this._name = name\n this._filePathOrUrl = filePathOrUrl\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = fetch(this._filePathOrUrl)\n .then((response) => {\n if (!response.ok) {\n throw new PixivIconLoadError(this._name, 'Response is not ok')\n }\n\n return response.text()\n })\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n if (e instanceof PixivIconLoadError) {\n throw e\n }\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { isKnownIconFile } from '../charcoalIconFiles'\nimport { CharcoalIconFilesLoader } from './CharcoalIconFilesLoader'\nimport { CustomIconLoader } from './CustomIconLoader'\nimport { Loadable } from './Loadable'\nimport { PixivIconLoadError } from './PixivIconLoadError'\n\n/**\n * icon をロードするオブジェクトのプール。Loader のインスタンスは作り次第ここに入れる\n *\n * 同じアイコンへの複数回のリクエストが起きないためには、Loader がこの中でユニークでないと行けない\n */\nconst loaders = new Map<string, Loadable>()\n\nexport function addCustomIcon(name: string, filePathOrUrl: string) {\n loaders.set(name, new CustomIconLoader(name, filePathOrUrl))\n}\n\nexport async function getIcon(name: string) {\n const loader = resolveIconLoader(name)\n if (loader == null) {\n throw new PixivIconLoadError(name, 'Loader was not found')\n }\n\n return loader.fetch().catch((e) => {\n if (e instanceof PixivIconLoadError) {\n throw e\n }\n\n throw new PixivIconLoadError(name, e)\n })\n}\n\nfunction resolveIconLoader(name: string) {\n // 登録済み or キャッシュ済みの場合\n // addCustomIcon で登録された CustomIconLoader は常にこっちを通る\n const registeredLoader = loaders.get(name)\n if (registeredLoader) {\n return registeredLoader\n }\n\n // `@charcoal-ui/icon-files` に収録されているアイコンにはこれを返す\n if (isKnownIconFile(name)) {\n const charcoalIconFilesLoader = new CharcoalIconFilesLoader(name)\n\n loaders.set(name, charcoalIconFilesLoader)\n return charcoalIconFilesLoader\n }\n\n // 存在しないアイコンにはこれを返す\n return null\n}\n","export const __SERVER__ = typeof window === 'undefined'\n\nconst CAN_USE_DOM = typeof HTMLElement !== 'undefined'\n\n// Workaround: `extends HTMLELement` の形式でないとbabelのトランスパイルがおかしくなる\nif (__SERVER__ || !CAN_USE_DOM) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n globalThis.HTMLElement = class {} as any\n}\n","import type React from 'react'\nimport warning from 'warning'\nimport { KnownIconFile } from './charcoalIconFiles'\nimport { getIcon, addCustomIcon } from './loaders'\nimport { __SERVER__ } from './ssr'\nimport DOMPurify from 'dompurify'\n\nconst attributes = ['name', 'scale', 'unsafe-non-guideline-scale'] as const\n\nconst ROOT_MARGIN = 50\n\nexport interface KnownIconType extends Record<KnownIconFile, unknown> {}\n\nexport interface Props\n extends Omit<\n React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>,\n 'className' | 'css'\n > {\n name: keyof KnownIconType\n scale?: 1 | 2 | 3 | '1' | '2' | '3'\n 'unsafe-non-guideline-scale'?: number | string\n\n // CustomElements は className が使えない。class と書く必要がある\n // https://ja.reactjs.org/docs/web-components.html#using-web-components-in-react\n class?: string\n}\n\ntype ExtendedIconFile = Exclude<keyof KnownIconType, KnownIconFile>\ntype Extended = [ExtendedIconFile] extends [never] // NOTE: ExtendedIconFileがneverならKnownIconTypeは拡張されていない\n ? false\n : true\n\nexport class PixivIcon extends HTMLElement {\n static readonly tagName = 'pixiv-icon'\n\n static extend(\n map: Extended extends true\n ? Record<ExtendedIconFile, string>\n : Record<string, string>\n ) {\n warning(!__SERVER__, 'Using `PixivIcon.extend()` on server has no effect')\n if (__SERVER__) {\n return\n }\n\n Object.entries(map).forEach(([name, filePathOrUrl]) => {\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n addCustomIcon(name, filePathOrUrl)\n })\n }\n\n static get observedAttributes() {\n return attributes\n }\n\n private svgContent?: string\n private observer?: IntersectionObserver\n private isVisible = false\n\n get props() {\n const partial = Object.fromEntries(\n attributes.map((attribute) => [attribute, this.getAttribute(attribute)])\n ) as Record<typeof attributes[number], string | null>\n\n const name = partial.name\n\n if (name === null) {\n throw new TypeError('property \"name\" is required.')\n }\n\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n return {\n ...partial,\n name,\n }\n }\n\n get forceResizedSize() {\n if (this.props['unsafe-non-guideline-scale'] === null) {\n return null\n }\n\n const [size] = this.props.name.split('/')\n const scale = Number(this.props['unsafe-non-guideline-scale'])\n\n switch (size) {\n case 'Inline': {\n return 16 * scale\n }\n\n default: {\n return Number(size) * scale\n }\n }\n }\n\n get scaledSize() {\n const [size] = this.props.name.split('/')\n\n const scale = Number(this.props.scale ?? '1')\n\n switch (size) {\n case 'Inline': {\n switch (scale) {\n case 2: {\n return 32\n }\n\n default: {\n return 16\n }\n }\n }\n\n case '24': {\n return Number(size) * scale\n }\n\n default: {\n return Number(size)\n }\n }\n }\n\n constructor() {\n super()\n this.attachShadow({ mode: 'open' })\n }\n\n async connectedCallback() {\n this.render()\n await this.waitUntilVisible()\n this.isVisible = true\n await this.loadSvg(this.props.name)\n }\n\n disconnectedCallback() {\n this.observer?.disconnect()\n this.observer = undefined\n this.isVisible = false\n }\n\n attributeChangedCallback(\n attr: string,\n _oldValue: string | null,\n newValue: string\n ) {\n // 非表示の場合はロードしない\n if (!this.isVisible) {\n return\n }\n\n // name が変更された場合必ず再読み込みを試みる\n if (attr === 'name') {\n void this.loadSvg(newValue)\n return\n }\n\n // SVG が読み込み済み && scale などの変更だけならそこだけ反映すればいい\n if (this.svgContent !== undefined) {\n this.render()\n return\n }\n\n // まだ SVG が読み込めてないなら load\n void this.loadSvg(this.props.name)\n }\n\n render() {\n const size = this.forceResizedSize ?? this.scaledSize\n\n const style = DOMPurify.sanitize(\n `<style>\n :host {\n display: inline-flex;\n --size: ${size}px;\n }\n\n svg {\n width: var(--size);\n height: var(--size);\n }\n</style>`,\n { ALLOWED_TAGS: ['style'], FORCE_BODY: true }\n )\n\n const svg = DOMPurify.sanitize(\n this.svgContent !== undefined\n ? this.svgContent\n : `<svg viewBox=\"0 0 ${size} ${size}\"></svg>`,\n { USE_PROFILES: { svg: true, svgFilters: true } }\n )\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.shadowRoot!.innerHTML = style + svg\n }\n\n private async loadSvg(name: string) {\n this.svgContent = await getIcon(name)\n this.render()\n }\n\n private waitUntilVisible() {\n return new Promise<void>((resolve) => {\n this.observer = new IntersectionObserver(\n ([first]) => {\n if (first.isIntersecting) {\n this.observer?.disconnect()\n this.observer = undefined\n resolve()\n }\n },\n { rootMargin: `${ROOT_MARGIN}px` }\n )\n\n this.observer.observe(this)\n })\n }\n}\n","import { PixivIcon, Props } from './PixivIcon'\nimport { __SERVER__ } from './ssr'\nexport { PixivIcon, type KnownIconType, type Props } from './PixivIcon'\nexport { KNOWN_ICON_FILES } from './charcoalIconFiles'\nexport { PixivIconLoadError } from './loaders/PixivIconLoadError'\n\ndeclare global {\n interface Window {\n PixivIcon: typeof PixivIcon\n }\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n export namespace JSX {\n interface IntrinsicElements {\n 'pixiv-icon': Props\n }\n }\n}\n\nif (!__SERVER__) {\n // TODO: HMR対応\n if (!window.customElements.get(PixivIcon.tagName)) {\n window.PixivIcon = PixivIcon\n window.customElements.define(PixivIcon.tagName, PixivIcon)\n }\n}\n"],"names":["KNOWN_ICON_FILES","Object","keys","charcoalIconFiles","isKnownIconFile","name","PixivIconLoadError","Error","constructor","cause","message","formatMessage","setPrototypeOf","new","target","prototype","toString","JSON","stringify","CharcoalIconFilesLoader","_name","_resultSvg","undefined","_promise","importIconFile","fetch","then","svg","catch","e","finally","CustomIconLoader","filePathOrUrl","_filePathOrUrl","response","ok","text","loaders","Map","addCustomIcon","set","getIcon","loader","resolveIconLoader","registeredLoader","get","charcoalIconFilesLoader","__SERVER__","window","CAN_USE_DOM","HTMLElement","globalThis","attributes","ROOT_MARGIN","PixivIcon","extend","map","warning","entries","forEach","includes","TypeError","observedAttributes","props","partial","fromEntries","attribute","getAttribute","forceResizedSize","size","split","scale","Number","scaledSize","svgContent","observer","isVisible","attachShadow","mode","connectedCallback","render","waitUntilVisible","loadSvg","disconnectedCallback","disconnect","attributeChangedCallback","attr","_oldValue","newValue","style","DOMPurify","sanitize","ALLOWED_TAGS","FORCE_BODY","USE_PROFILES","svgFilters","shadowRoot","innerHTML","Promise","resolve","IntersectionObserver","first","isIntersecting","rootMargin","observe","tagName","customElements","define"],"mappings":"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"}
|
package/dist/index.module.js
CHANGED
|
@@ -152,7 +152,8 @@ var PixivIconLoadError = /*#__PURE__*/function (_Error) {
|
|
|
152
152
|
var message = formatMessage(name, cause); // TODO: TypeScript 4.6+ になるとここに `{ cause }` が渡せる
|
|
153
153
|
|
|
154
154
|
_this = _Error.call(this, message) || this;
|
|
155
|
-
|
|
155
|
+
_this.name = 'PixivIconLoadError';
|
|
156
|
+
Object.setPrototypeOf(_assertThisInitialized(_this), (this instanceof PixivIconLoadError ? this.constructor : void 0).prototype);
|
|
156
157
|
return _this;
|
|
157
158
|
}
|
|
158
159
|
|
|
@@ -271,6 +272,10 @@ var CustomIconLoader = /*#__PURE__*/function () {
|
|
|
271
272
|
_this2._resultSvg = svg;
|
|
272
273
|
return _this2._resultSvg;
|
|
273
274
|
})["catch"](function (e) {
|
|
275
|
+
if (e instanceof PixivIconLoadError) {
|
|
276
|
+
throw e;
|
|
277
|
+
}
|
|
278
|
+
|
|
274
279
|
throw new PixivIconLoadError(_this2._name, e);
|
|
275
280
|
})["finally"](function () {
|
|
276
281
|
_this2._promise = undefined;
|
package/dist/index.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.module.js","sources":["../src/charcoalIconFiles.ts","../src/loaders/PixivIconLoadError.ts","../src/loaders/CharcoalIconFilesLoader.ts","../src/loaders/CustomIconLoader.ts","../src/loaders/index.ts","../src/ssr.ts","../src/PixivIcon.ts","../src/index.ts"],"sourcesContent":["import charcoalIconFiles from '@charcoal-ui/icon-files'\n\nexport default charcoalIconFiles\nexport type KnownIconFile = keyof typeof charcoalIconFiles\nexport const KNOWN_ICON_FILES = Object.keys(\n charcoalIconFiles\n) as KnownIconFile[]\n\nexport function isKnownIconFile(name: string): name is KnownIconFile {\n return name in charcoalIconFiles\n}\n","export class PixivIconLoadError extends Error {\n constructor(name: string, cause: unknown) {\n const message = formatMessage(name, cause)\n\n // TODO: TypeScript 4.6+ になるとここに `{ cause }` が渡せる\n super(message)\n Object.setPrototypeOf(this, new.target)\n }\n}\n\nfunction formatMessage(name: string, cause: unknown) {\n const message = `Failed to fetch <pixiv-icon name=\"${name}\">`\n if (cause == null) {\n return message\n }\n\n if (cause instanceof Error) {\n return `${message}: ${cause.toString()})`\n }\n\n return `${message}: ${JSON.stringify(cause)})`\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\nimport charcoalIconFiles, { KnownIconFile } from '../charcoalIconFiles'\n\n/**\n * `@charcoal-ui/icon-files` に収録されているアイコンを取ってくる\n */\nexport class CharcoalIconFilesLoader implements Loadable {\n private _name: KnownIconFile\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: KnownIconFile) {\n this._name = name\n }\n\n get importIconFile() {\n return charcoalIconFiles[this._name]\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = this.importIconFile()\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\n\n/**\n * `PixivIcon.extend()` で登録されたカスタムのアイコンを取得する\n */\nexport class CustomIconLoader implements Loadable {\n private _name: string\n private _filePathOrUrl: string\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: string, filePathOrUrl: string) {\n this._name = name\n this._filePathOrUrl = filePathOrUrl\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = fetch(this._filePathOrUrl)\n .then((response) => {\n if (!response.ok) {\n throw new PixivIconLoadError(this._name, 'Response is not ok')\n }\n\n return response.text()\n })\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { isKnownIconFile } from '../charcoalIconFiles'\nimport { CharcoalIconFilesLoader } from './CharcoalIconFilesLoader'\nimport { CustomIconLoader } from './CustomIconLoader'\nimport { Loadable } from './Loadable'\nimport { PixivIconLoadError } from './PixivIconLoadError'\n\n/**\n * icon をロードするオブジェクトのプール。Loader のインスタンスは作り次第ここに入れる\n *\n * 同じアイコンへの複数回のリクエストが起きないためには、Loader がこの中でユニークでないと行けない\n */\nconst loaders = new Map<string, Loadable>()\n\nexport function addCustomIcon(name: string, filePathOrUrl: string) {\n loaders.set(name, new CustomIconLoader(name, filePathOrUrl))\n}\n\nexport async function getIcon(name: string) {\n const loader = resolveIconLoader(name)\n if (loader == null) {\n throw new PixivIconLoadError(name, 'Loader was not found')\n }\n\n return loader.fetch().catch((e) => {\n if (e instanceof PixivIconLoadError) {\n throw e\n }\n\n throw new PixivIconLoadError(name, e)\n })\n}\n\nfunction resolveIconLoader(name: string) {\n // 登録済み or キャッシュ済みの場合\n // addCustomIcon で登録された CustomIconLoader は常にこっちを通る\n const registeredLoader = loaders.get(name)\n if (registeredLoader) {\n return registeredLoader\n }\n\n // `@charcoal-ui/icon-files` に収録されているアイコンにはこれを返す\n if (isKnownIconFile(name)) {\n const charcoalIconFilesLoader = new CharcoalIconFilesLoader(name)\n\n loaders.set(name, charcoalIconFilesLoader)\n return charcoalIconFilesLoader\n }\n\n // 存在しないアイコンにはこれを返す\n return null\n}\n","export const __SERVER__ = typeof window === 'undefined'\n\nconst CAN_USE_DOM = typeof HTMLElement !== 'undefined'\n\n// Workaround: `extends HTMLELement` の形式でないとbabelのトランスパイルがおかしくなる\nif (__SERVER__ || !CAN_USE_DOM) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n globalThis.HTMLElement = class {} as any\n}\n","import type React from 'react'\nimport warning from 'warning'\nimport { KnownIconFile } from './charcoalIconFiles'\nimport { getIcon, addCustomIcon } from './loaders'\nimport { __SERVER__ } from './ssr'\nimport DOMPurify from 'dompurify'\n\nconst attributes = ['name', 'scale', 'unsafe-non-guideline-scale'] as const\n\nconst ROOT_MARGIN = 50\n\nexport interface KnownIconType extends Record<KnownIconFile, unknown> {}\n\nexport interface Props\n extends Omit<\n React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>,\n 'className' | 'css'\n > {\n name: keyof KnownIconType\n scale?: 1 | 2 | 3 | '1' | '2' | '3'\n 'unsafe-non-guideline-scale'?: number | string\n\n // CustomElements は className が使えない。class と書く必要がある\n // https://ja.reactjs.org/docs/web-components.html#using-web-components-in-react\n class?: string\n}\n\ntype ExtendedIconFile = Exclude<keyof KnownIconType, KnownIconFile>\ntype Extended = [ExtendedIconFile] extends [never] // NOTE: ExtendedIconFileがneverならKnownIconTypeは拡張されていない\n ? false\n : true\n\nexport class PixivIcon extends HTMLElement {\n static readonly tagName = 'pixiv-icon'\n\n static extend(\n map: Extended extends true\n ? Record<ExtendedIconFile, string>\n : Record<string, string>\n ) {\n warning(!__SERVER__, 'Using `PixivIcon.extend()` on server has no effect')\n if (__SERVER__) {\n return\n }\n\n Object.entries(map).forEach(([name, filePathOrUrl]) => {\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n addCustomIcon(name, filePathOrUrl)\n })\n }\n\n static get observedAttributes() {\n return attributes\n }\n\n private svgContent?: string\n private observer?: IntersectionObserver\n private isVisible = false\n\n get props() {\n const partial = Object.fromEntries(\n attributes.map((attribute) => [attribute, this.getAttribute(attribute)])\n ) as Record<typeof attributes[number], string | null>\n\n const name = partial.name\n\n if (name === null) {\n throw new TypeError('property \"name\" is required.')\n }\n\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n return {\n ...partial,\n name,\n }\n }\n\n get forceResizedSize() {\n if (this.props['unsafe-non-guideline-scale'] === null) {\n return null\n }\n\n const [size] = this.props.name.split('/')\n const scale = Number(this.props['unsafe-non-guideline-scale'])\n\n switch (size) {\n case 'Inline': {\n return 16 * scale\n }\n\n default: {\n return Number(size) * scale\n }\n }\n }\n\n get scaledSize() {\n const [size] = this.props.name.split('/')\n\n const scale = Number(this.props.scale ?? '1')\n\n switch (size) {\n case 'Inline': {\n switch (scale) {\n case 2: {\n return 32\n }\n\n default: {\n return 16\n }\n }\n }\n\n case '24': {\n return Number(size) * scale\n }\n\n default: {\n return Number(size)\n }\n }\n }\n\n constructor() {\n super()\n this.attachShadow({ mode: 'open' })\n }\n\n async connectedCallback() {\n this.render()\n await this.waitUntilVisible()\n this.isVisible = true\n await this.loadSvg(this.props.name)\n }\n\n disconnectedCallback() {\n this.observer?.disconnect()\n this.observer = undefined\n this.isVisible = false\n }\n\n attributeChangedCallback(\n attr: string,\n _oldValue: string | null,\n newValue: string\n ) {\n // 非表示の場合はロードしない\n if (!this.isVisible) {\n return\n }\n\n // name が変更された場合必ず再読み込みを試みる\n if (attr === 'name') {\n void this.loadSvg(newValue)\n return\n }\n\n // SVG が読み込み済み && scale などの変更だけならそこだけ反映すればいい\n if (this.svgContent !== undefined) {\n this.render()\n return\n }\n\n // まだ SVG が読み込めてないなら load\n void this.loadSvg(this.props.name)\n }\n\n render() {\n const size = this.forceResizedSize ?? this.scaledSize\n\n const style = DOMPurify.sanitize(\n `<style>\n :host {\n display: inline-flex;\n --size: ${size}px;\n }\n\n svg {\n width: var(--size);\n height: var(--size);\n }\n</style>`,\n { ALLOWED_TAGS: ['style'], FORCE_BODY: true }\n )\n\n const svg = DOMPurify.sanitize(\n this.svgContent !== undefined\n ? this.svgContent\n : `<svg viewBox=\"0 0 ${size} ${size}\"></svg>`,\n { USE_PROFILES: { svg: true, svgFilters: true } }\n )\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.shadowRoot!.innerHTML = style + svg\n }\n\n private async loadSvg(name: string) {\n this.svgContent = await getIcon(name)\n this.render()\n }\n\n private waitUntilVisible() {\n return new Promise<void>((resolve) => {\n this.observer = new IntersectionObserver(\n ([first]) => {\n if (first.isIntersecting) {\n this.observer?.disconnect()\n this.observer = undefined\n resolve()\n }\n },\n { rootMargin: `${ROOT_MARGIN}px` }\n )\n\n this.observer.observe(this)\n })\n }\n}\n","import { PixivIcon, Props } from './PixivIcon'\nimport { __SERVER__ } from './ssr'\nexport { PixivIcon, type KnownIconType, type Props } from './PixivIcon'\nexport { KNOWN_ICON_FILES } from './charcoalIconFiles'\nexport { PixivIconLoadError } from './loaders/PixivIconLoadError'\n\ndeclare global {\n interface Window {\n PixivIcon: typeof PixivIcon\n }\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n export namespace JSX {\n interface IntrinsicElements {\n 'pixiv-icon': Props\n }\n }\n}\n\nif (!__SERVER__) {\n // TODO: HMR対応\n if (!window.customElements.get(PixivIcon.tagName)) {\n window.PixivIcon = PixivIcon\n window.customElements.define(PixivIcon.tagName, PixivIcon)\n }\n}\n"],"names":["KNOWN_ICON_FILES","Object","keys","charcoalIconFiles","isKnownIconFile","name","PixivIconLoadError","cause","message","formatMessage","setPrototypeOf","Error","toString","JSON","stringify","CharcoalIconFilesLoader","_name","_resultSvg","undefined","_promise","fetch","importIconFile","then","svg","e","CustomIconLoader","filePathOrUrl","_filePathOrUrl","response","ok","text","getIcon","loader","resolveIconLoader","loaders","Map","addCustomIcon","set","registeredLoader","get","charcoalIconFilesLoader","__SERVER__","window","CAN_USE_DOM","HTMLElement","globalThis","attributes","ROOT_MARGIN","PixivIcon","extend","map","warning","entries","forEach","includes","TypeError","svgContent","observer","isVisible","attachShadow","mode","connectedCallback","render","waitUntilVisible","loadSvg","props","disconnectedCallback","disconnect","attributeChangedCallback","attr","_oldValue","newValue","size","forceResizedSize","scaledSize","style","DOMPurify","sanitize","ALLOWED_TAGS","FORCE_BODY","USE_PROFILES","svgFilters","shadowRoot","innerHTML","Promise","resolve","IntersectionObserver","first","isIntersecting","rootMargin","observe","partial","fromEntries","attribute","getAttribute","split","scale","Number","tagName","customElements","define"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIaA,gBAAgB,GAAGC,MAAM,CAACC,IAAP,CAC9BC,iBAD8B;SAIhBC,gBAAgBC;AAC9B,SAAOA,IAAI,IAAIF,iBAAf;AACD;;ICVYG,kBAAb;AAAA;;AACE,8BAAYD,IAAZ,EAA0BE,KAA1B;;;AACE,QAAMC,OAAO,GAAGC,aAAa,CAACJ,IAAD,EAAOE,KAAP,CAA7B;;AAGA,8BAAMC,OAAN;AACAP,IAAAA,MAAM,CAACS,cAAP;;AACD;;AAPH;AAAA,iCAAwCC,KAAxC;;AAUA,SAASF,aAAT,CAAuBJ,IAAvB,EAAqCE,KAArC;AACE,MAAMC,OAAO,2CAAwCH,IAAxC,QAAb;;AACA,MAAIE,KAAK,IAAI,IAAb,EAAmB;AACjB,WAAOC,OAAP;AACD;;AAED,MAAID,KAAK,YAAYI,KAArB,EAA4B;AAC1B,WAAUH,OAAV,UAAsBD,KAAK,CAACK,QAAN,EAAtB;AACD;;AAED,SAAUJ,OAAV,UAAsBK,IAAI,CAACC,SAAL,CAAeP,KAAf,CAAtB;AACD;;ACjBD;;;;IAGaQ,uBAAb;AAKE,mCAAYV,IAAZ;SAJQW;SACAC,aAAiCC;SACjCC,WAAwCD;AAG9C,SAAKF,KAAL,GAAaX,IAAb;AACD;;AAPH;;AAAA,SAaQe,KAbR;AAAA;mBAcQ;;AAAJ,UAAI,OAAKH,UAAL,KAAoBC,SAAxB,EAAmC;AACjC,+BAAO,OAAKD,UAAZ;AACD;;AAED,UAAI,OAAKE,QAAT,EAAmB;AACjB,+BAAO,OAAKA,QAAZ;AACD;;AAED,aAAKA,QAAL,GAAgB,OAAKE,cAAL,GACbC,IADa,CACR,UAACC,GAAD;AACJ,eAAKN,UAAL,GAAkBM,GAAlB;AACA,eAAO,OAAKN,UAAZ;AACD,OAJa,WAKP,UAACO,CAAD;AACL,cAAM,IAAIlB,kBAAJ,CAAuB,OAAKU,KAA5B,EAAmCQ,CAAnC,CAAN;AACD,OAPa,aAQL;AACP,eAAKL,QAAL,GAAgBD,SAAhB;AACD,OAVa,CAAhB;AAYA,6BAAO,OAAKC,QAAZ;AACD,KAnCH;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,SASE;AACE,aAAOhB,iBAAiB,CAAC,KAAKa,KAAN,CAAxB;AACD;AAXH;;AAAA;AAAA;;ACJA;;;;IAGaS,gBAAb;AAME,4BAAYpB,IAAZ,EAA0BqB,aAA1B;SALQV;SACAW;SACAV,aAAiCC;SACjCC,WAAwCD;AAG9C,SAAKF,KAAL,GAAaX,IAAb;AACA,SAAKsB,cAAL,GAAsBD,aAAtB;AACD;;AATH;;AAAA,SAWQN,KAXR;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;mBAYQ;;AAAJ,UAAI,OAAKH,UAAL,KAAoBC,SAAxB,EAAmC;AACjC,+BAAO,OAAKD,UAAZ;AACD;;AAED,UAAI,OAAKE,QAAT,EAAmB;AACjB,+BAAO,OAAKA,QAAZ;AACD;;AAED,aAAKA,QAAL,GAAgBC,KAAK,CAAC,OAAKO,cAAN,CAAL,CACbL,IADa,CACR,UAACM,QAAD;AACJ,YAAI,CAACA,QAAQ,CAACC,EAAd,EAAkB;AAChB,gBAAM,IAAIvB,kBAAJ,CAAuB,OAAKU,KAA5B,EAAmC,oBAAnC,CAAN;AACD;;AAED,eAAOY,QAAQ,CAACE,IAAT,EAAP;AACD,OAPa,EAQbR,IARa,CAQR,UAACC,GAAD;AACJ,eAAKN,UAAL,GAAkBM,GAAlB;AACA,eAAO,OAAKN,UAAZ;AACD,OAXa,WAYP,UAACO,CAAD;AACL,cAAM,IAAIlB,kBAAJ,CAAuB,OAAKU,KAA5B,EAAmCQ,CAAnC,CAAN;AACD,OAda,aAeL;AACP,eAAKL,QAAL,GAAgBD,SAAhB;AACD,OAjBa,CAAhB;AAmBA,6BAAO,OAAKC,QAAZ;AACD,KAxCH;AAAA;AAAA;AAAA;;AAAA;AAAA;;ACAA;;;;;;IAWsBY,OAAtB,YAAsBA,OAAtB,CAA8B1B,IAA9B;AAAA;AACE,QAAM2B,MAAM,GAAGC,iBAAiB,CAAC5B,IAAD,CAAhC;;AACA,QAAI2B,MAAM,IAAI,IAAd,EAAoB;AAClB,YAAM,IAAI1B,kBAAJ,CAAuBD,IAAvB,EAA6B,sBAA7B,CAAN;AACD;;AAED,2BAAO2B,MAAM,CAACZ,KAAP,YAAqB,UAACI,CAAD;AAC1B,UAAIA,CAAC,YAAYlB,kBAAjB,EAAqC;AACnC,cAAMkB,CAAN;AACD;;AAED,YAAM,IAAIlB,kBAAJ,CAAuBD,IAAvB,EAA6BmB,CAA7B,CAAN;AACD,KANM,CAAP;AAOD,GAbD;AAAA;AAAA;AAAA;AANA,IAAMU,OAAO,GAAG,IAAIC,GAAJ,EAAhB;SAEgBC,cAAc/B,MAAcqB;AAC1CQ,EAAAA,OAAO,CAACG,GAAR,CAAYhC,IAAZ,EAAkB,IAAIoB,gBAAJ,CAAqBpB,IAArB,EAA2BqB,aAA3B,CAAlB;AACD;;AAiBD,SAASO,iBAAT,CAA2B5B,IAA3B;AACE;AACA;AACA,MAAMiC,gBAAgB,GAAGJ,OAAO,CAACK,GAAR,CAAYlC,IAAZ,CAAzB;;AACA,MAAIiC,gBAAJ,EAAsB;AACpB,WAAOA,gBAAP;AACD;;;AAGD,MAAIlC,eAAe,CAACC,IAAD,CAAnB,EAA2B;AACzB,QAAMmC,uBAAuB,GAAG,IAAIzB,uBAAJ,CAA4BV,IAA5B,CAAhC;AAEA6B,IAAAA,OAAO,CAACG,GAAR,CAAYhC,IAAZ,EAAkBmC,uBAAlB;AACA,WAAOA,uBAAP;AACD;;;AAGD,SAAO,IAAP;AACD;;AClDM,IAAMC,UAAU,GAAG,OAAOC,MAAP,KAAkB,WAArC;AAEP,IAAMC,WAAW,GAAG,OAAOC,WAAP,KAAuB,WAA3C;;AAGA,IAAIH,UAAU,IAAI,CAACE,WAAnB,EAAgC;AAC9B;AACAE,EAAAA,UAAU,CAACD,WAAX;AAAA;;AAAA;AAAA;AACD;;ACDD,IAAME,UAAU,GAAG,CAAC,MAAD,EAAS,OAAT,EAAkB,4BAAlB,CAAnB;AAEA,IAAMC,WAAW,GAAG,EAApB;IAuBaC,SAAb;AAAA;;AAAA,YAGSC,MAHT,GAGE,gBACEC,GADF;AAKEC,IAAAA,OAAO,CAAC,CAACV,UAAF,EAAc,oDAAd,CAAP;;AACA,QAAIA,UAAJ,EAAgB;AACd;AACD;;AAEDxC,IAAAA,MAAM,CAACmD,OAAP,CAAeF,GAAf,EAAoBG,OAApB,CAA4B;UAAEhD;UAAMqB;;AAClC,UAAI,CAACrB,IAAI,CAACiD,QAAL,CAAc,GAAd,CAAL,EAAyB;AACvB,cAAM,IAAIC,SAAJ,CACDlD,IADC,2EAAN;AAGD;;AAED+B,MAAAA,aAAa,CAAC/B,IAAD,EAAOqB,aAAP,CAAb;AACD,KARD;AASD,GAtBH;;AAsGE;;;AACE;UA3EM8B;UACAC;UACAC,YAAY;;AA0ElB,UAAKC,YAAL,CAAkB;AAAEC,MAAAA,IAAI,EAAE;AAAR,KAAlB;;;AACD;;AAzGH;;AAAA,SA2GQC,iBA3GR;AAAA;mBA4GI;;AAAA,aAAKC,MAAL;;6BACM,OAAKC,gBAAL;AACN,eAAKL,SAAL,GAAiB,IAAjB;+BACM,OAAKM,OAAL,CAAa,OAAKC,KAAL,CAAW5D,IAAxB;;AACP,KAhHH;AAAA;AAAA;AAAA;;AAAA,SAkHE6D,oBAlHF,GAkHE;;;AACE,2BAAKT,QAAL,oCAAeU,UAAf;AACA,SAAKV,QAAL,GAAgBvC,SAAhB;AACA,SAAKwC,SAAL,GAAiB,KAAjB;AACD,GAtHH;;AAAA,SAwHEU,wBAxHF,GAwHE,kCACEC,IADF,EAEEC,SAFF,EAGEC,QAHF;AAKE;AACA,QAAI,CAAC,KAAKb,SAAV,EAAqB;AACnB;AACD;;;AAGD,QAAIW,IAAI,KAAK,MAAb,EAAqB;AACnB,WAAK,KAAKL,OAAL,CAAaO,QAAb,CAAL;AACA;AACD;;;AAGD,QAAI,KAAKf,UAAL,KAAoBtC,SAAxB,EAAmC;AACjC,WAAK4C,MAAL;AACA;AACD;;;AAGD,SAAK,KAAKE,OAAL,CAAa,KAAKC,KAAL,CAAW5D,IAAxB,CAAL;AACD,GAhJH;;AAAA,SAkJEyD,MAlJF,GAkJE;;;AACE,QAAMU,IAAI,4BAAG,KAAKC,gBAAR,oCAA4B,KAAKC,UAA3C;AAEA,QAAMC,KAAK,GAAGC,SAAS,CAACC,QAAV,iEAIJL,IAJI,4FAYZ;AAAEM,MAAAA,YAAY,EAAE,CAAC,OAAD,CAAhB;AAA2BC,MAAAA,UAAU,EAAE;AAAvC,KAZY,CAAd;AAeA,QAAMxD,GAAG,GAAGqD,SAAS,CAACC,QAAV,CACV,KAAKrB,UAAL,KAAoBtC,SAApB,GACI,KAAKsC,UADT,2BAEyBgB,IAFzB,SAEiCA,IAFjC,cADU,EAIV;AAAEQ,MAAAA,YAAY,EAAE;AAAEzD,QAAAA,GAAG,EAAE,IAAP;AAAa0D,QAAAA,UAAU,EAAE;AAAzB;AAAhB,KAJU,CAAZ;;AAQA,SAAKC,UAAL,CAAiBC,SAAjB,GAA6BR,KAAK,GAAGpD,GAArC;AACD,GA7KH;;AAAA,SA+KgByC,OA/KhB,oBA+KwB3D,IA/KxB;AAAA;mBAgLI;;6BAAwB0B,OAAO,CAAC1B,IAAD;AAA/B,eAAKmD,UAAL;;AACA,eAAKM,MAAL;;AACD,KAlLH;AAAA;AAAA;AAAA;;AAAA,SAoLUC,gBApLV,GAoLU;;;AACN,WAAO,IAAIqB,OAAJ,CAAkB,UAACC,OAAD;AACvB,MAAA,MAAI,CAAC5B,QAAL,GAAgB,IAAI6B,oBAAJ,CACd;YAAEC;;AACA,YAAIA,KAAK,CAACC,cAAV,EAA0B;AAAA;;AACxB,6BAAA,MAAI,CAAC/B,QAAL,qCAAeU,UAAf;AACA,UAAA,MAAI,CAACV,QAAL,GAAgBvC,SAAhB;AACAmE,UAAAA,OAAO;AACR;AACF,OAPa,EAQd;AAAEI,QAAAA,UAAU,EAAK1C,WAAL;AAAZ,OARc,CAAhB;;AAWA,MAAA,MAAI,CAACU,QAAL,CAAciC,OAAd,CAAsB,MAAtB;AACD,KAbM,CAAP;AAcD,GAnMH;;AAAA;AAAA;AAAA,SAgCE;;;AACE,UAAMC,OAAO,GAAG1F,MAAM,CAAC2F,WAAP,CACd9C,UAAU,CAACI,GAAX,CAAe,UAAC2C,SAAD;AAAA,eAAe,CAACA,SAAD,EAAY,MAAI,CAACC,YAAL,CAAkBD,SAAlB,CAAZ,CAAf;AAAA,OAAf,CADc,CAAhB;AAIA,UAAMxF,IAAI,GAAGsF,OAAO,CAACtF,IAArB;;AAEA,UAAIA,IAAI,KAAK,IAAb,EAAmB;AACjB,cAAM,IAAIkD,SAAJ,CAAc,8BAAd,CAAN;AACD;;AAED,UAAI,CAAClD,IAAI,CAACiD,QAAL,CAAc,GAAd,CAAL,EAAyB;AACvB,cAAM,IAAIC,SAAJ,CACDlD,IADC,2EAAN;AAGD;;AAED,0BACKsF,OADL;AAEEtF,QAAAA,IAAI,EAAJA;AAFF;AAID;AArDH;AAAA;AAAA,SAuDE;AACE,UAAI,KAAK4D,KAAL,CAAW,4BAAX,MAA6C,IAAjD,EAAuD;AACrD,eAAO,IAAP;AACD;;AAED,kCAAe,KAAKA,KAAL,CAAW5D,IAAX,CAAgB0F,KAAhB,CAAsB,GAAtB,CAAf;AAAA,UAAOvB,IAAP;;AACA,UAAMwB,KAAK,GAAGC,MAAM,CAAC,KAAKhC,KAAL,CAAW,4BAAX,CAAD,CAApB;;AAEA,cAAQO,IAAR;AACE,aAAK,QAAL;AAAe;AACb,mBAAO,KAAKwB,KAAZ;AACD;;AAED;AAAS;AACP,mBAAOC,MAAM,CAACzB,IAAD,CAAN,GAAewB,KAAtB;AACD;AAPH;AASD;AAxEH;AAAA;AAAA,SA0EE;;;AACE,mCAAe,KAAK/B,KAAL,CAAW5D,IAAX,CAAgB0F,KAAhB,CAAsB,GAAtB,CAAf;AAAA,UAAOvB,IAAP;;AAEA,UAAMwB,KAAK,GAAGC,MAAM,sBAAC,KAAKhC,KAAL,CAAW+B,KAAZ,gCAAqB,GAArB,CAApB;;AAEA,cAAQxB,IAAR;AACE,aAAK,QAAL;AAAe;AACb,oBAAQwB,KAAR;AACE,mBAAK,CAAL;AAAQ;AACN,yBAAO,EAAP;AACD;;AAED;AAAS;AACP,yBAAO,EAAP;AACD;AAPH;AASD;;AAED,aAAK,IAAL;AAAW;AACT,mBAAOC,MAAM,CAACzB,IAAD,CAAN,GAAewB,KAAtB;AACD;;AAED;AAAS;AACP,mBAAOC,MAAM,CAACzB,IAAD,CAAb;AACD;AAnBH;AAqBD;AApGH;AAAA;AAAA,SAwBE;AACE,aAAO1B,UAAP;AACD;AA1BH;;AAAA;AAAA,iCAA+BF,WAA/B;AAAaI,UACKkD,UAAU;;ACd5B,IAAI,CAACzD,UAAL,EAAiB;AACf;AACA,MAAI,CAACC,MAAM,CAACyD,cAAP,CAAsB5D,GAAtB,CAA0BS,SAAS,CAACkD,OAApC,CAAL,EAAmD;AACjDxD,IAAAA,MAAM,CAACM,SAAP,GAAmBA,SAAnB;AACAN,IAAAA,MAAM,CAACyD,cAAP,CAAsBC,MAAtB,CAA6BpD,SAAS,CAACkD,OAAvC,EAAgDlD,SAAhD;AACD;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"index.module.js","sources":["../src/charcoalIconFiles.ts","../src/loaders/PixivIconLoadError.ts","../src/loaders/CharcoalIconFilesLoader.ts","../src/loaders/CustomIconLoader.ts","../src/loaders/index.ts","../src/ssr.ts","../src/PixivIcon.ts","../src/index.ts"],"sourcesContent":["import charcoalIconFiles from '@charcoal-ui/icon-files'\n\nexport default charcoalIconFiles\nexport type KnownIconFile = keyof typeof charcoalIconFiles\nexport const KNOWN_ICON_FILES = Object.keys(\n charcoalIconFiles\n) as KnownIconFile[]\n\nexport function isKnownIconFile(name: string): name is KnownIconFile {\n return name in charcoalIconFiles\n}\n","export class PixivIconLoadError extends Error {\n constructor(name: string, cause: unknown) {\n const message = formatMessage(name, cause)\n\n // TODO: TypeScript 4.6+ になるとここに `{ cause }` が渡せる\n super(message)\n this.name = 'PixivIconLoadError'\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nfunction formatMessage(name: string, cause: unknown) {\n const message = `Failed to fetch <pixiv-icon name=\"${name}\">`\n if (cause == null) {\n return message\n }\n\n if (cause instanceof Error) {\n return `${message}: ${cause.toString()})`\n }\n\n return `${message}: ${JSON.stringify(cause)})`\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\nimport charcoalIconFiles, { KnownIconFile } from '../charcoalIconFiles'\n\n/**\n * `@charcoal-ui/icon-files` に収録されているアイコンを取ってくる\n */\nexport class CharcoalIconFilesLoader implements Loadable {\n private _name: KnownIconFile\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: KnownIconFile) {\n this._name = name\n }\n\n get importIconFile() {\n return charcoalIconFiles[this._name]\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = this.importIconFile()\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { PixivIconLoadError } from './PixivIconLoadError'\nimport { Loadable } from './Loadable'\n\n/**\n * `PixivIcon.extend()` で登録されたカスタムのアイコンを取得する\n */\nexport class CustomIconLoader implements Loadable {\n private _name: string\n private _filePathOrUrl: string\n private _resultSvg: string | undefined = undefined\n private _promise: Promise<string> | undefined = undefined\n\n constructor(name: string, filePathOrUrl: string) {\n this._name = name\n this._filePathOrUrl = filePathOrUrl\n }\n\n async fetch(): Promise<string> {\n if (this._resultSvg !== undefined) {\n return this._resultSvg\n }\n\n if (this._promise) {\n return this._promise\n }\n\n this._promise = fetch(this._filePathOrUrl)\n .then((response) => {\n if (!response.ok) {\n throw new PixivIconLoadError(this._name, 'Response is not ok')\n }\n\n return response.text()\n })\n .then((svg) => {\n this._resultSvg = svg\n return this._resultSvg\n })\n .catch((e) => {\n if (e instanceof PixivIconLoadError) {\n throw e\n }\n throw new PixivIconLoadError(this._name, e)\n })\n .finally(() => {\n this._promise = undefined\n })\n\n return this._promise\n }\n}\n","import { isKnownIconFile } from '../charcoalIconFiles'\nimport { CharcoalIconFilesLoader } from './CharcoalIconFilesLoader'\nimport { CustomIconLoader } from './CustomIconLoader'\nimport { Loadable } from './Loadable'\nimport { PixivIconLoadError } from './PixivIconLoadError'\n\n/**\n * icon をロードするオブジェクトのプール。Loader のインスタンスは作り次第ここに入れる\n *\n * 同じアイコンへの複数回のリクエストが起きないためには、Loader がこの中でユニークでないと行けない\n */\nconst loaders = new Map<string, Loadable>()\n\nexport function addCustomIcon(name: string, filePathOrUrl: string) {\n loaders.set(name, new CustomIconLoader(name, filePathOrUrl))\n}\n\nexport async function getIcon(name: string) {\n const loader = resolveIconLoader(name)\n if (loader == null) {\n throw new PixivIconLoadError(name, 'Loader was not found')\n }\n\n return loader.fetch().catch((e) => {\n if (e instanceof PixivIconLoadError) {\n throw e\n }\n\n throw new PixivIconLoadError(name, e)\n })\n}\n\nfunction resolveIconLoader(name: string) {\n // 登録済み or キャッシュ済みの場合\n // addCustomIcon で登録された CustomIconLoader は常にこっちを通る\n const registeredLoader = loaders.get(name)\n if (registeredLoader) {\n return registeredLoader\n }\n\n // `@charcoal-ui/icon-files` に収録されているアイコンにはこれを返す\n if (isKnownIconFile(name)) {\n const charcoalIconFilesLoader = new CharcoalIconFilesLoader(name)\n\n loaders.set(name, charcoalIconFilesLoader)\n return charcoalIconFilesLoader\n }\n\n // 存在しないアイコンにはこれを返す\n return null\n}\n","export const __SERVER__ = typeof window === 'undefined'\n\nconst CAN_USE_DOM = typeof HTMLElement !== 'undefined'\n\n// Workaround: `extends HTMLELement` の形式でないとbabelのトランスパイルがおかしくなる\nif (__SERVER__ || !CAN_USE_DOM) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n globalThis.HTMLElement = class {} as any\n}\n","import type React from 'react'\nimport warning from 'warning'\nimport { KnownIconFile } from './charcoalIconFiles'\nimport { getIcon, addCustomIcon } from './loaders'\nimport { __SERVER__ } from './ssr'\nimport DOMPurify from 'dompurify'\n\nconst attributes = ['name', 'scale', 'unsafe-non-guideline-scale'] as const\n\nconst ROOT_MARGIN = 50\n\nexport interface KnownIconType extends Record<KnownIconFile, unknown> {}\n\nexport interface Props\n extends Omit<\n React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>,\n 'className' | 'css'\n > {\n name: keyof KnownIconType\n scale?: 1 | 2 | 3 | '1' | '2' | '3'\n 'unsafe-non-guideline-scale'?: number | string\n\n // CustomElements は className が使えない。class と書く必要がある\n // https://ja.reactjs.org/docs/web-components.html#using-web-components-in-react\n class?: string\n}\n\ntype ExtendedIconFile = Exclude<keyof KnownIconType, KnownIconFile>\ntype Extended = [ExtendedIconFile] extends [never] // NOTE: ExtendedIconFileがneverならKnownIconTypeは拡張されていない\n ? false\n : true\n\nexport class PixivIcon extends HTMLElement {\n static readonly tagName = 'pixiv-icon'\n\n static extend(\n map: Extended extends true\n ? Record<ExtendedIconFile, string>\n : Record<string, string>\n ) {\n warning(!__SERVER__, 'Using `PixivIcon.extend()` on server has no effect')\n if (__SERVER__) {\n return\n }\n\n Object.entries(map).forEach(([name, filePathOrUrl]) => {\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n addCustomIcon(name, filePathOrUrl)\n })\n }\n\n static get observedAttributes() {\n return attributes\n }\n\n private svgContent?: string\n private observer?: IntersectionObserver\n private isVisible = false\n\n get props() {\n const partial = Object.fromEntries(\n attributes.map((attribute) => [attribute, this.getAttribute(attribute)])\n ) as Record<typeof attributes[number], string | null>\n\n const name = partial.name\n\n if (name === null) {\n throw new TypeError('property \"name\" is required.')\n }\n\n if (!name.includes('/')) {\n throw new TypeError(\n `${name} is not a valid icon name. \"name\" must be named like [size]/[Name].`\n )\n }\n\n return {\n ...partial,\n name,\n }\n }\n\n get forceResizedSize() {\n if (this.props['unsafe-non-guideline-scale'] === null) {\n return null\n }\n\n const [size] = this.props.name.split('/')\n const scale = Number(this.props['unsafe-non-guideline-scale'])\n\n switch (size) {\n case 'Inline': {\n return 16 * scale\n }\n\n default: {\n return Number(size) * scale\n }\n }\n }\n\n get scaledSize() {\n const [size] = this.props.name.split('/')\n\n const scale = Number(this.props.scale ?? '1')\n\n switch (size) {\n case 'Inline': {\n switch (scale) {\n case 2: {\n return 32\n }\n\n default: {\n return 16\n }\n }\n }\n\n case '24': {\n return Number(size) * scale\n }\n\n default: {\n return Number(size)\n }\n }\n }\n\n constructor() {\n super()\n this.attachShadow({ mode: 'open' })\n }\n\n async connectedCallback() {\n this.render()\n await this.waitUntilVisible()\n this.isVisible = true\n await this.loadSvg(this.props.name)\n }\n\n disconnectedCallback() {\n this.observer?.disconnect()\n this.observer = undefined\n this.isVisible = false\n }\n\n attributeChangedCallback(\n attr: string,\n _oldValue: string | null,\n newValue: string\n ) {\n // 非表示の場合はロードしない\n if (!this.isVisible) {\n return\n }\n\n // name が変更された場合必ず再読み込みを試みる\n if (attr === 'name') {\n void this.loadSvg(newValue)\n return\n }\n\n // SVG が読み込み済み && scale などの変更だけならそこだけ反映すればいい\n if (this.svgContent !== undefined) {\n this.render()\n return\n }\n\n // まだ SVG が読み込めてないなら load\n void this.loadSvg(this.props.name)\n }\n\n render() {\n const size = this.forceResizedSize ?? this.scaledSize\n\n const style = DOMPurify.sanitize(\n `<style>\n :host {\n display: inline-flex;\n --size: ${size}px;\n }\n\n svg {\n width: var(--size);\n height: var(--size);\n }\n</style>`,\n { ALLOWED_TAGS: ['style'], FORCE_BODY: true }\n )\n\n const svg = DOMPurify.sanitize(\n this.svgContent !== undefined\n ? this.svgContent\n : `<svg viewBox=\"0 0 ${size} ${size}\"></svg>`,\n { USE_PROFILES: { svg: true, svgFilters: true } }\n )\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.shadowRoot!.innerHTML = style + svg\n }\n\n private async loadSvg(name: string) {\n this.svgContent = await getIcon(name)\n this.render()\n }\n\n private waitUntilVisible() {\n return new Promise<void>((resolve) => {\n this.observer = new IntersectionObserver(\n ([first]) => {\n if (first.isIntersecting) {\n this.observer?.disconnect()\n this.observer = undefined\n resolve()\n }\n },\n { rootMargin: `${ROOT_MARGIN}px` }\n )\n\n this.observer.observe(this)\n })\n }\n}\n","import { PixivIcon, Props } from './PixivIcon'\nimport { __SERVER__ } from './ssr'\nexport { PixivIcon, type KnownIconType, type Props } from './PixivIcon'\nexport { KNOWN_ICON_FILES } from './charcoalIconFiles'\nexport { PixivIconLoadError } from './loaders/PixivIconLoadError'\n\ndeclare global {\n interface Window {\n PixivIcon: typeof PixivIcon\n }\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n export namespace JSX {\n interface IntrinsicElements {\n 'pixiv-icon': Props\n }\n }\n}\n\nif (!__SERVER__) {\n // TODO: HMR対応\n if (!window.customElements.get(PixivIcon.tagName)) {\n window.PixivIcon = PixivIcon\n window.customElements.define(PixivIcon.tagName, PixivIcon)\n }\n}\n"],"names":["KNOWN_ICON_FILES","Object","keys","charcoalIconFiles","isKnownIconFile","name","PixivIconLoadError","cause","message","formatMessage","setPrototypeOf","prototype","Error","toString","JSON","stringify","CharcoalIconFilesLoader","_name","_resultSvg","undefined","_promise","fetch","importIconFile","then","svg","e","CustomIconLoader","filePathOrUrl","_filePathOrUrl","response","ok","text","getIcon","loader","resolveIconLoader","loaders","Map","addCustomIcon","set","registeredLoader","get","charcoalIconFilesLoader","__SERVER__","window","CAN_USE_DOM","HTMLElement","globalThis","attributes","ROOT_MARGIN","PixivIcon","extend","map","warning","entries","forEach","includes","TypeError","svgContent","observer","isVisible","attachShadow","mode","connectedCallback","render","waitUntilVisible","loadSvg","props","disconnectedCallback","disconnect","attributeChangedCallback","attr","_oldValue","newValue","size","forceResizedSize","scaledSize","style","DOMPurify","sanitize","ALLOWED_TAGS","FORCE_BODY","USE_PROFILES","svgFilters","shadowRoot","innerHTML","Promise","resolve","IntersectionObserver","first","isIntersecting","rootMargin","observe","partial","fromEntries","attribute","getAttribute","split","scale","Number","tagName","customElements","define"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomIconLoader.d.ts","sourceRoot":"","sources":["../../src/loaders/CustomIconLoader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC;;GAEG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,QAAQ,CAAyC;gBAE7C,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAKzC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"CustomIconLoader.d.ts","sourceRoot":"","sources":["../../src/loaders/CustomIconLoader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC;;GAEG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,QAAQ,CAAyC;gBAE7C,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAKzC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAiC/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PixivIconLoadError.d.ts","sourceRoot":"","sources":["../../src/loaders/PixivIconLoadError.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"PixivIconLoadError.d.ts","sourceRoot":"","sources":["../../src/loaders/PixivIconLoadError.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAQzC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@charcoal-ui/icons",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"source": "./src/index.ts",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"typescript": "^4.5.5"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@charcoal-ui/icon-files": "^2.
|
|
32
|
+
"@charcoal-ui/icon-files": "^2.1.0",
|
|
33
33
|
"dompurify": "^2.3.6",
|
|
34
34
|
"warning": "^4.0.3"
|
|
35
35
|
},
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"url": "https://github.com/pixiv/charcoal.git",
|
|
47
47
|
"directory": "packages/icons"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "ad3c5f816dfc2ad8b5d6e3a4102fc664db1d9606"
|
|
50
50
|
}
|