usage-board 3.0.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +1 -1
- package/dist/public/_nuxt/{y3weNNd-.js → B6C9KBQ4.js} +2 -2
- package/dist/public/_nuxt/Bv6agYS5.js +119 -0
- package/dist/public/_nuxt/BvRyOET7.js +1 -0
- package/dist/public/_nuxt/CMWftE4h.js +1 -0
- package/dist/public/_nuxt/{Be3rizqy.js → COIbUy5w.js} +1 -1
- package/dist/public/_nuxt/CXLmM1yO.js +25 -0
- package/dist/public/_nuxt/DFqWEFN4.js +1 -0
- package/dist/public/_nuxt/DUoLvn3A.js +6 -0
- package/dist/public/_nuxt/D_W11Quh.js +21 -0
- package/dist/public/_nuxt/DgKrPjze.js +4 -0
- package/dist/public/_nuxt/DkxY2YMp.js +1 -0
- package/dist/public/_nuxt/{7Dy4NLP8.js → DtbPvE6R.js} +24 -24
- package/dist/public/_nuxt/HiqUua3-.js +1 -0
- package/dist/public/_nuxt/builds/latest.json +1 -1
- package/dist/public/_nuxt/builds/meta/6f98f1cb-266c-475e-a249-dad346a55f24.json +1 -0
- package/dist/public/_nuxt/entry.vHfFzkyD.css +1 -0
- package/dist/public/_nuxt/error-404.CFBEg71j.css +1 -0
- package/dist/public/_nuxt/error-500.BqCnH31G.css +1 -0
- package/dist/public/_nuxt/uHQwCIHg.js +1 -0
- package/dist/server/chunks/_/error-500.mjs +2 -20
- package/dist/server/chunks/build/client.precomputed.mjs +1 -1
- package/dist/server/chunks/nitro/nitro.mjs +2303 -3614
- package/dist/server/chunks/routes/api/analysis/agent/session.json.mjs +21 -0
- package/dist/server/chunks/routes/api/analysis/agent/token.json.mjs +24 -0
- package/dist/server/chunks/routes/api/analysis/cache.json.mjs +24 -0
- package/dist/server/chunks/routes/api/analysis/hot-project.json.mjs +24 -0
- package/dist/server/chunks/routes/api/analysis/model.json.mjs +24 -0
- package/dist/server/chunks/routes/api/analysis/overview-cards.json.mjs +24 -0
- package/dist/server/chunks/routes/api/analysis/session.json.mjs +21 -0
- package/dist/server/chunks/routes/api/analysis/token/daily.json.mjs +21 -0
- package/dist/server/chunks/routes/api/analysis/token.json.mjs +24 -0
- package/dist/server/chunks/routes/api/payload.json.mjs +9 -10
- package/dist/server/chunks/routes/api/projects/_project/modules.get.mjs +9 -10
- package/dist/server/chunks/routes/api/projects/catalog.get.mjs +9 -10
- package/dist/server/chunks/routes/renderer.mjs +17 -39183
- package/dist/server/chunks/routes/ws.mjs +9 -10
- package/dist/server/index.mjs +9 -10
- package/dist/server/node_modules/@babel/parser/lib/index.js +14582 -0
- package/dist/server/node_modules/@babel/parser/package.json +50 -0
- package/dist/server/node_modules/@iconify/utils/lib/colors/index.js +292 -0
- package/dist/server/node_modules/@iconify/utils/lib/colors/keywords.js +702 -0
- package/dist/server/node_modules/@iconify/utils/lib/css/common.js +76 -0
- package/dist/server/node_modules/@iconify/utils/lib/css/format.js +40 -0
- package/dist/server/node_modules/@iconify/utils/lib/css/icon.js +52 -0
- package/dist/server/node_modules/@iconify/utils/lib/css/icons.js +133 -0
- package/dist/server/node_modules/@iconify/utils/lib/customisations/bool.js +20 -0
- package/dist/server/node_modules/@iconify/utils/lib/customisations/defaults.js +15 -0
- package/dist/server/node_modules/@iconify/utils/lib/customisations/flip.js +18 -0
- package/dist/server/node_modules/@iconify/utils/lib/customisations/merge.js +18 -0
- package/dist/server/node_modules/@iconify/utils/lib/customisations/rotate.js +31 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/cleanup.js +80 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/convert.js +102 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/data.js +29 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/format.js +60 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/parse.js +50 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/regex/base.js +204 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/regex/create.js +35 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/regex/numbers.js +134 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/regex/similar.js +167 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/regex/tree.js +81 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/replace/find.js +94 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/replace/replace.js +28 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/test/components.js +78 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/test/missing.js +68 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/test/name.js +47 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/test/parse.js +105 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/test/similar.js +38 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/test/tree.js +94 -0
- package/dist/server/node_modules/@iconify/utils/lib/emoji/test/variations.js +64 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon/defaults.js +26 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon/merge.js +18 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon/name.js +58 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon/square.js +34 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon/transformations.js +13 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon-set/convert-info.js +126 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon-set/expand.js +21 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon-set/get-icon.js +27 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon-set/get-icons.js +38 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon-set/minify.js +93 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon-set/parse.js +48 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon-set/tree.js +24 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon-set/validate-basic.js +44 -0
- package/dist/server/node_modules/@iconify/utils/lib/icon-set/validate.js +125 -0
- package/dist/server/node_modules/@iconify/utils/lib/index.js +53 -0
- package/dist/server/node_modules/@iconify/utils/lib/loader/custom.js +32 -0
- package/dist/server/node_modules/@iconify/utils/lib/loader/loader.js +28 -0
- package/dist/server/node_modules/@iconify/utils/lib/loader/modern.js +42 -0
- package/dist/server/node_modules/@iconify/utils/lib/loader/utils.js +63 -0
- package/dist/server/node_modules/@iconify/utils/lib/misc/objects.js +27 -0
- package/dist/server/node_modules/@iconify/utils/lib/misc/strings.js +27 -0
- package/dist/server/node_modules/@iconify/utils/lib/misc/title.js +10 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/build.js +115 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/defs.js +32 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/encode-svg-for-css.js +15 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/html.js +10 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/id.js +42 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/inner-html.js +23 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/parse.js +69 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/pretty.js +55 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/size.js +28 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/trim.js +8 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/url.js +23 -0
- package/dist/server/node_modules/@iconify/utils/lib/svg/viewbox.js +9 -0
- package/dist/server/node_modules/@iconify/utils/package.json +118 -0
- package/dist/server/node_modules/@lonewolfyx/utils/dist/index.mjs +63 -0
- package/dist/server/node_modules/@lonewolfyx/utils/package.json +64 -0
- package/dist/server/node_modules/@vue/compiler-core/dist/compiler-core.cjs.prod.js +6763 -0
- package/dist/server/node_modules/@vue/compiler-core/package.json +58 -0
- package/dist/server/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js +689 -0
- package/dist/server/node_modules/@vue/compiler-dom/package.json +57 -0
- package/dist/server/node_modules/@vue/compiler-ssr/dist/compiler-ssr.cjs.js +1413 -0
- package/dist/server/node_modules/@vue/compiler-ssr/package.json +34 -0
- package/dist/server/node_modules/@vue/reactivity/dist/reactivity.cjs.prod.js +1877 -0
- package/dist/server/node_modules/@vue/reactivity/package.json +55 -0
- package/dist/server/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js +6856 -0
- package/dist/server/node_modules/@vue/runtime-core/package.json +52 -0
- package/dist/server/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.prod.js +1796 -0
- package/dist/server/node_modules/@vue/runtime-dom/package.json +60 -0
- package/dist/server/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +883 -0
- package/dist/server/node_modules/@vue/server-renderer/package.json +55 -0
- package/dist/server/{chunks/_/shared.cjs.prod.mjs → node_modules/@vue/shared/dist/shared.cjs.prod.js} +76 -81
- package/dist/server/node_modules/@vue/shared/package.json +47 -0
- package/dist/server/node_modules/better-sqlite3/build/Release/better_sqlite3.node +0 -0
- package/dist/server/node_modules/better-sqlite3/lib/database.js +90 -0
- package/dist/server/node_modules/better-sqlite3/lib/index.js +3 -0
- package/dist/server/node_modules/better-sqlite3/lib/methods/aggregate.js +43 -0
- package/dist/server/node_modules/better-sqlite3/lib/methods/backup.js +67 -0
- package/dist/server/node_modules/better-sqlite3/lib/methods/function.js +31 -0
- package/dist/server/node_modules/better-sqlite3/lib/methods/inspect.js +7 -0
- package/dist/server/node_modules/better-sqlite3/lib/methods/pragma.js +12 -0
- package/dist/server/node_modules/better-sqlite3/lib/methods/serialize.js +16 -0
- package/dist/server/node_modules/better-sqlite3/lib/methods/table.js +189 -0
- package/dist/server/node_modules/better-sqlite3/lib/methods/transaction.js +78 -0
- package/dist/server/node_modules/better-sqlite3/lib/methods/wrappers.js +54 -0
- package/dist/server/node_modules/better-sqlite3/lib/sqlite-error.js +20 -0
- package/dist/server/node_modules/better-sqlite3/lib/util.js +12 -0
- package/dist/server/node_modules/better-sqlite3/package.json +59 -0
- package/dist/server/node_modules/bindings/bindings.js +221 -0
- package/dist/server/node_modules/bindings/package.json +28 -0
- package/dist/server/node_modules/chokidar/handler.js +632 -0
- package/dist/server/node_modules/chokidar/index.js +822 -0
- package/dist/server/node_modules/chokidar/package.json +63 -0
- package/dist/server/{chunks/_ → node_modules/consola/dist/chunks}/prompt.mjs +2 -1
- package/dist/server/node_modules/consola/dist/core.mjs +512 -0
- package/dist/server/node_modules/consola/dist/index.mjs +651 -0
- package/dist/server/node_modules/consola/dist/shared/consola.DRwqZj3T.mjs +72 -0
- package/dist/server/node_modules/consola/dist/shared/consola.DXBYu-KD.mjs +288 -0
- package/dist/server/node_modules/consola/package.json +136 -0
- package/dist/server/node_modules/devalue/index.js +4 -0
- package/dist/server/node_modules/devalue/package.json +40 -0
- package/dist/server/node_modules/devalue/src/base64.js +60 -0
- package/dist/server/node_modules/devalue/src/constants.js +7 -0
- package/dist/server/node_modules/devalue/src/parse.js +268 -0
- package/dist/server/node_modules/devalue/src/stringify.js +335 -0
- package/dist/server/node_modules/devalue/src/uneval.js +552 -0
- package/dist/server/node_modules/devalue/src/utils.js +144 -0
- package/dist/server/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
- package/dist/server/node_modules/entities/dist/commonjs/decode.js +568 -0
- package/dist/server/node_modules/entities/dist/commonjs/generated/decode-data-html.js +7 -0
- package/dist/server/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +7 -0
- package/dist/server/node_modules/entities/dist/commonjs/internal/bin-trie-flags.js +21 -0
- package/dist/server/node_modules/entities/dist/commonjs/internal/decode-shared.js +31 -0
- package/dist/server/node_modules/entities/dist/commonjs/package.json +3 -0
- package/dist/server/node_modules/entities/package.json +120 -0
- package/dist/server/node_modules/estree-walker/dist/umd/estree-walker.js +344 -0
- package/dist/server/node_modules/estree-walker/package.json +37 -0
- package/dist/server/node_modules/file-uri-to-path/index.js +66 -0
- package/dist/server/node_modules/file-uri-to-path/package.json +32 -0
- package/dist/server/node_modules/glob/dist/esm/index.min.js +4 -0
- package/dist/server/node_modules/glob/dist/esm/package.json +3 -0
- package/dist/server/node_modules/glob/package.json +98 -0
- package/dist/server/node_modules/hookable/dist/index.mjs +257 -0
- package/dist/server/node_modules/hookable/package.json +53 -0
- package/dist/server/node_modules/md5-typescript/dist/bundles/bundle.umd.js +208 -0
- package/dist/server/node_modules/md5-typescript/package.json +31 -0
- package/dist/server/node_modules/path-type/index.js +42 -0
- package/dist/server/node_modules/path-type/package.json +51 -0
- package/dist/server/node_modules/readdirp/index.js +272 -0
- package/dist/server/node_modules/readdirp/package.json +66 -0
- package/dist/server/node_modules/source-map-js/lib/array-set.js +121 -0
- package/dist/server/node_modules/source-map-js/lib/base64-vlq.js +140 -0
- package/dist/server/node_modules/source-map-js/lib/base64.js +67 -0
- package/dist/server/node_modules/source-map-js/lib/binary-search.js +111 -0
- package/dist/server/node_modules/source-map-js/lib/mapping-list.js +79 -0
- package/dist/server/node_modules/source-map-js/lib/quick-sort.js +132 -0
- package/dist/server/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
- package/dist/server/node_modules/source-map-js/lib/source-map-generator.js +444 -0
- package/dist/server/node_modules/source-map-js/lib/source-node.js +413 -0
- package/dist/server/node_modules/source-map-js/lib/util.js +594 -0
- package/dist/server/node_modules/source-map-js/package.json +71 -0
- package/dist/server/node_modules/source-map-js/source-map.js +8 -0
- package/dist/server/node_modules/ufo/dist/index.mjs +645 -0
- package/dist/server/node_modules/ufo/package.json +48 -0
- package/dist/server/node_modules/unhead/dist/parser.mjs +508 -0
- package/dist/server/node_modules/unhead/dist/plugins.mjs +101 -0
- package/dist/server/node_modules/unhead/dist/server.mjs +180 -0
- package/dist/server/node_modules/unhead/dist/shared/unhead.B5FWS6X0.mjs +207 -0
- package/dist/server/node_modules/unhead/dist/shared/unhead.BYvz9V1x.mjs +43 -0
- package/dist/server/node_modules/unhead/dist/shared/unhead.CbpEuj3y.mjs +71 -0
- package/dist/server/node_modules/unhead/dist/shared/unhead.Ct24BOby.mjs +182 -0
- package/dist/server/node_modules/unhead/dist/shared/unhead.D4vSFytZ.mjs +236 -0
- package/dist/server/node_modules/unhead/dist/shared/unhead.DQc16pHI.mjs +196 -0
- package/dist/server/node_modules/unhead/dist/shared/unhead.TxTMM7cM.mjs +166 -0
- package/dist/server/node_modules/unhead/dist/shared/unhead.yem5I2v_.mjs +38 -0
- package/dist/server/node_modules/unhead/dist/utils.mjs +5 -0
- package/dist/server/node_modules/unhead/package.json +105 -0
- package/dist/server/node_modules/vue/dist/vue.cjs.js +80 -0
- package/dist/server/node_modules/vue/dist/vue.cjs.prod.js +66 -0
- package/dist/server/node_modules/vue/index.js +7 -0
- package/dist/server/node_modules/vue/index.mjs +1 -0
- package/dist/server/node_modules/vue/package.json +112 -0
- package/dist/server/node_modules/vue/server-renderer/index.mjs +1 -0
- package/dist/server/node_modules/vue-bundle-renderer/dist/runtime.mjs +301 -0
- package/dist/server/node_modules/vue-bundle-renderer/package.json +55 -0
- package/dist/server/package.json +37 -0
- package/package.json +3 -1
- package/dist/public/_nuxt/B-VlGWDb.js +0 -21
- package/dist/public/_nuxt/C0azgqnZ.js +0 -1
- package/dist/public/_nuxt/CMNdiQCa.js +0 -1
- package/dist/public/_nuxt/CPuXQJE_.js +0 -1
- package/dist/public/_nuxt/DenksPSi.js +0 -119
- package/dist/public/_nuxt/Dkya5WaL.js +0 -9
- package/dist/public/_nuxt/HN9OZyaQ.js +0 -25
- package/dist/public/_nuxt/JtK-nXxy.js +0 -1
- package/dist/public/_nuxt/builds/meta/37e8bb21-a086-45bf-93dc-47eeeada7299.json +0 -1
- package/dist/public/_nuxt/entry.r-q4oQC0.css +0 -1
- package/dist/public/_nuxt/error-404.B0EXnOcv.css +0 -1
- package/dist/public/_nuxt/error-500.CnSNZoEG.css +0 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { defaultExtendedIconProps, defaultIconDimensions, defaultIconProps, defaultIconTransformations } from "./icon/defaults.js";
|
|
2
|
+
import { defaultIconCustomisations, defaultIconSizeCustomisations } from "./customisations/defaults.js";
|
|
3
|
+
import { mergeCustomisations } from "./customisations/merge.js";
|
|
4
|
+
import { toBoolean } from "./customisations/bool.js";
|
|
5
|
+
import { flipFromString } from "./customisations/flip.js";
|
|
6
|
+
import { rotateFromString } from "./customisations/rotate.js";
|
|
7
|
+
import { matchIconName, stringToIcon, validateIconName } from "./icon/name.js";
|
|
8
|
+
import { mergeIconTransformations } from "./icon/transformations.js";
|
|
9
|
+
import { mergeIconData } from "./icon/merge.js";
|
|
10
|
+
import { makeIconSquare } from "./icon/square.js";
|
|
11
|
+
import { getIconsTree } from "./icon-set/tree.js";
|
|
12
|
+
import { getIconData } from "./icon-set/get-icon.js";
|
|
13
|
+
import { parseIconSet, parseIconSetAsync } from "./icon-set/parse.js";
|
|
14
|
+
import { validateIconSet } from "./icon-set/validate.js";
|
|
15
|
+
import { quicklyValidateIconSet } from "./icon-set/validate-basic.js";
|
|
16
|
+
import { expandIconSet } from "./icon-set/expand.js";
|
|
17
|
+
import { minifyIconSet } from "./icon-set/minify.js";
|
|
18
|
+
import { getIcons } from "./icon-set/get-icons.js";
|
|
19
|
+
import { convertIconSetInfo } from "./icon-set/convert-info.js";
|
|
20
|
+
import { calculateSize } from "./svg/size.js";
|
|
21
|
+
import { mergeDefsAndContent, splitSVGDefs, wrapSVGContent } from "./svg/defs.js";
|
|
22
|
+
import { iconToSVG } from "./svg/build.js";
|
|
23
|
+
import { clearIDCache, replaceIDs } from "./svg/id.js";
|
|
24
|
+
import { svgToData, svgToURL } from "./svg/url.js";
|
|
25
|
+
import { encodeSvgForCss } from "./svg/encode-svg-for-css.js";
|
|
26
|
+
import { trimSVG } from "./svg/trim.js";
|
|
27
|
+
import { prettifySVG } from "./svg/pretty.js";
|
|
28
|
+
import { iconToHTML } from "./svg/html.js";
|
|
29
|
+
import { cleanUpInnerHTML } from "./svg/inner-html.js";
|
|
30
|
+
import { getSVGViewBox } from "./svg/viewbox.js";
|
|
31
|
+
import { buildParsedSVG, convertParsedSVG, parseSVGContent } from "./svg/parse.js";
|
|
32
|
+
import { colorKeywords } from "./colors/keywords.js";
|
|
33
|
+
import { colorToString, compareColors, stringToColor } from "./colors/index.js";
|
|
34
|
+
import { getIconCSS, getIconContentCSS } from "./css/icon.js";
|
|
35
|
+
import { getIconsCSS, getIconsContentCSS } from "./css/icons.js";
|
|
36
|
+
import { mergeIconProps } from "./loader/utils.js";
|
|
37
|
+
import { getCustomIcon } from "./loader/custom.js";
|
|
38
|
+
import { searchForIcon } from "./loader/modern.js";
|
|
39
|
+
import { loadIcon } from "./loader/loader.js";
|
|
40
|
+
import { convertEmojiSequenceToUTF16, convertEmojiSequenceToUTF32, getEmojiCodePoint, getEmojiUnicode, isUTF32SplitNumber, mergeUTF32Numbers, splitUTF32Number } from "./emoji/convert.js";
|
|
41
|
+
import { getEmojiSequenceFromString, getUnqualifiedEmojiSequence } from "./emoji/cleanup.js";
|
|
42
|
+
import { getEmojiSequenceKeyword, getEmojiSequenceString, getEmojiUnicodeString } from "./emoji/format.js";
|
|
43
|
+
import { parseEmojiTestFile } from "./emoji/test/parse.js";
|
|
44
|
+
import { getQualifiedEmojiVariations } from "./emoji/test/variations.js";
|
|
45
|
+
import { findMissingEmojis } from "./emoji/test/missing.js";
|
|
46
|
+
import { createOptimisedRegex, createOptimisedRegexForEmojiSequences } from "./emoji/regex/create.js";
|
|
47
|
+
import { prepareEmojiForIconSet, prepareEmojiForIconsList } from "./emoji/parse.js";
|
|
48
|
+
import { findAndReplaceEmojisInText } from "./emoji/replace/replace.js";
|
|
49
|
+
import { camelToKebab, camelize, pascalize, snakelize } from "./misc/strings.js";
|
|
50
|
+
import { commonObjectProps, compareObjects, unmergeObjects } from "./misc/objects.js";
|
|
51
|
+
import { sanitiseTitleAttribute } from "./misc/title.js";
|
|
52
|
+
|
|
53
|
+
export { buildParsedSVG, calculateSize, camelToKebab, camelize, cleanUpInnerHTML, clearIDCache, colorKeywords, colorToString, commonObjectProps, compareColors, compareObjects, convertEmojiSequenceToUTF16, convertEmojiSequenceToUTF32, convertIconSetInfo, convertParsedSVG, createOptimisedRegex, createOptimisedRegexForEmojiSequences, defaultExtendedIconProps, defaultIconCustomisations, defaultIconDimensions, defaultIconProps, defaultIconSizeCustomisations, defaultIconTransformations, encodeSvgForCss, expandIconSet, findAndReplaceEmojisInText, findMissingEmojis, flipFromString, getCustomIcon, getEmojiCodePoint, getEmojiSequenceFromString, getEmojiSequenceKeyword, getEmojiSequenceString, getEmojiUnicode, getEmojiUnicodeString, getIconCSS, getIconContentCSS, getIconData, getIcons, getIconsCSS, getIconsContentCSS, getIconsTree, getQualifiedEmojiVariations, getSVGViewBox, getUnqualifiedEmojiSequence, iconToHTML, iconToSVG, isUTF32SplitNumber, loadIcon, makeIconSquare, matchIconName, mergeCustomisations, mergeDefsAndContent, mergeIconData, mergeIconProps, mergeIconTransformations, mergeUTF32Numbers, minifyIconSet, parseEmojiTestFile, parseIconSet, parseIconSetAsync, parseSVGContent, pascalize, prepareEmojiForIconSet, prepareEmojiForIconsList, prettifySVG, quicklyValidateIconSet, replaceIDs, rotateFromString, sanitiseTitleAttribute, searchForIcon, snakelize, splitSVGDefs, splitUTF32Number, stringToColor, stringToIcon, svgToData, svgToURL, toBoolean, trimSVG, unmergeObjects, validateIconName, validateIconSet, wrapSVGContent };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { trimSVG } from "../svg/trim.js";
|
|
2
|
+
import { mergeIconProps } from "./utils.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Get custom icon from inline collection or using loader
|
|
6
|
+
*/
|
|
7
|
+
async function getCustomIcon(custom, collection, icon, options) {
|
|
8
|
+
let result;
|
|
9
|
+
try {
|
|
10
|
+
if (typeof custom === "function") result = await custom(icon);
|
|
11
|
+
else {
|
|
12
|
+
const inline = custom[icon];
|
|
13
|
+
result = typeof inline === "function" ? await inline() : inline;
|
|
14
|
+
}
|
|
15
|
+
} catch (err) {
|
|
16
|
+
console.warn(`Failed to load custom icon "${icon}" in "${collection}":`, err);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (result) {
|
|
20
|
+
const cleanupIdx = result.indexOf("<svg");
|
|
21
|
+
if (cleanupIdx > 0) result = result.slice(cleanupIdx);
|
|
22
|
+
const { transform } = options?.customizations ?? {};
|
|
23
|
+
result = typeof transform === "function" ? await transform(result, collection, icon) : result;
|
|
24
|
+
if (!result.startsWith("<svg")) {
|
|
25
|
+
console.warn(`Custom icon "${icon}" in "${collection}" is not a valid SVG`);
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
return await mergeIconProps(options?.customizations?.trimCustomSvg === true ? trimSVG(result) : result, collection, icon, options, void 0);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { getCustomIcon };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { getCustomIcon } from "./custom.js";
|
|
2
|
+
import { searchForIcon } from "./modern.js";
|
|
3
|
+
|
|
4
|
+
const loadIcon = async (collection, icon, options) => {
|
|
5
|
+
const custom = options?.customCollections?.[collection];
|
|
6
|
+
if (custom) if (typeof custom === "function") {
|
|
7
|
+
let result;
|
|
8
|
+
try {
|
|
9
|
+
result = await custom(icon);
|
|
10
|
+
} catch (err) {
|
|
11
|
+
console.warn(`Failed to load custom icon "${icon}" in "${collection}":`, err);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (result) {
|
|
15
|
+
if (typeof result === "string") return await getCustomIcon(() => result, collection, icon, options);
|
|
16
|
+
if ("icons" in result) {
|
|
17
|
+
const ids = [
|
|
18
|
+
icon,
|
|
19
|
+
icon.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(),
|
|
20
|
+
icon.replace(/([a-z])(\d+)/g, "$1-$2")
|
|
21
|
+
];
|
|
22
|
+
return await searchForIcon(result, collection, ids, options);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
} else return await getCustomIcon(custom, collection, icon, options);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export { loadIcon };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { defaultIconCustomisations } from "../customisations/defaults.js";
|
|
2
|
+
import { getIconData } from "../icon-set/get-icon.js";
|
|
3
|
+
import { calculateSize } from "../svg/size.js";
|
|
4
|
+
import { iconToSVG, isUnsetKeyword } from "../svg/build.js";
|
|
5
|
+
import { mergeIconProps } from "./utils.js";
|
|
6
|
+
|
|
7
|
+
async function searchForIcon(iconSet, collection, ids, options) {
|
|
8
|
+
let iconData;
|
|
9
|
+
const { customize } = options?.customizations ?? {};
|
|
10
|
+
for (const id of ids) {
|
|
11
|
+
iconData = getIconData(iconSet, id);
|
|
12
|
+
if (iconData) {
|
|
13
|
+
let defaultCustomizations = { ...defaultIconCustomisations };
|
|
14
|
+
if (typeof customize === "function") {
|
|
15
|
+
iconData = Object.assign({}, iconData);
|
|
16
|
+
defaultCustomizations = customize(defaultCustomizations, iconData, `${collection}:${id}`) ?? defaultCustomizations;
|
|
17
|
+
}
|
|
18
|
+
const { attributes: { width, height, ...restAttributes }, body } = iconToSVG(iconData, defaultCustomizations);
|
|
19
|
+
const scale = options?.scale;
|
|
20
|
+
return await mergeIconProps(`<svg >${body}</svg>`, collection, id, options, () => {
|
|
21
|
+
return { ...restAttributes };
|
|
22
|
+
}, (props) => {
|
|
23
|
+
const check = (prop, defaultValue) => {
|
|
24
|
+
const propValue = props[prop];
|
|
25
|
+
let value;
|
|
26
|
+
if (!isUnsetKeyword(propValue)) {
|
|
27
|
+
if (propValue) return;
|
|
28
|
+
if (typeof scale === "number") {
|
|
29
|
+
if (scale) value = calculateSize(defaultValue ?? "1em", scale);
|
|
30
|
+
} else value = defaultValue;
|
|
31
|
+
}
|
|
32
|
+
if (!value) delete props[prop];
|
|
33
|
+
else props[prop] = value;
|
|
34
|
+
};
|
|
35
|
+
check("width", width);
|
|
36
|
+
check("height", height);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { searchForIcon };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { calculateSize } from "../svg/size.js";
|
|
2
|
+
import { isUnsetKeyword } from "../svg/build.js";
|
|
3
|
+
|
|
4
|
+
const svgWidthRegex = /\swidth\s*=\s*["']([\w.]+)["']/;
|
|
5
|
+
const svgHeightRegex = /\sheight\s*=\s*["']([\w.]+)["']/;
|
|
6
|
+
const svgTagRegex = /<svg\s+/;
|
|
7
|
+
function configureSvgSize(svg, props, scale) {
|
|
8
|
+
const svgNode = svg.slice(0, svg.indexOf(">"));
|
|
9
|
+
const check = (prop, regex) => {
|
|
10
|
+
const result = regex.exec(svgNode);
|
|
11
|
+
const isSet = result != null;
|
|
12
|
+
const propValue = props[prop];
|
|
13
|
+
if (!propValue && !isUnsetKeyword(propValue)) {
|
|
14
|
+
if (typeof scale === "number") {
|
|
15
|
+
if (scale > 0) props[prop] = calculateSize(result?.[1] ?? "1em", scale);
|
|
16
|
+
} else if (result) props[prop] = result[1];
|
|
17
|
+
}
|
|
18
|
+
return isSet;
|
|
19
|
+
};
|
|
20
|
+
return [check("width", svgWidthRegex), check("height", svgHeightRegex)];
|
|
21
|
+
}
|
|
22
|
+
async function mergeIconProps(svg, collection, icon, options, propsProvider, afterCustomizations) {
|
|
23
|
+
const { scale, addXmlNs = false } = options ?? {};
|
|
24
|
+
const { additionalProps = {}, iconCustomizer } = options?.customizations ?? {};
|
|
25
|
+
const props = await propsProvider?.() ?? {};
|
|
26
|
+
await iconCustomizer?.(collection, icon, props);
|
|
27
|
+
Object.keys(additionalProps).forEach((p) => {
|
|
28
|
+
const v = additionalProps[p];
|
|
29
|
+
if (v !== void 0 && v !== null) props[p] = v;
|
|
30
|
+
});
|
|
31
|
+
afterCustomizations?.(props);
|
|
32
|
+
const [widthOnSvg, heightOnSvg] = configureSvgSize(svg, props, scale);
|
|
33
|
+
if (addXmlNs) {
|
|
34
|
+
if (!svg.includes("xmlns=") && !props["xmlns"]) props["xmlns"] = "http://www.w3.org/2000/svg";
|
|
35
|
+
if (!svg.includes("xmlns:xlink=") && svg.includes("xlink:") && !props["xmlns:xlink"]) props["xmlns:xlink"] = "http://www.w3.org/1999/xlink";
|
|
36
|
+
}
|
|
37
|
+
const propsToAdd = Object.keys(props).map((p) => p === "width" && widthOnSvg || p === "height" && heightOnSvg ? null : `${p}="${props[p]}"`).filter((p) => p != null);
|
|
38
|
+
if (propsToAdd.length) svg = svg.replace(svgTagRegex, `<svg ${propsToAdd.join(" ")} `);
|
|
39
|
+
if (options) {
|
|
40
|
+
const { defaultStyle, defaultClass } = options;
|
|
41
|
+
if (defaultClass && !svg.includes("class=")) svg = svg.replace(svgTagRegex, `<svg class="${defaultClass}" `);
|
|
42
|
+
if (defaultStyle && !svg.includes("style=")) svg = svg.replace(svgTagRegex, `<svg style="${defaultStyle}" `);
|
|
43
|
+
}
|
|
44
|
+
const usedProps = options?.usedProps;
|
|
45
|
+
if (usedProps) {
|
|
46
|
+
Object.keys(additionalProps).forEach((p) => {
|
|
47
|
+
const v = props[p];
|
|
48
|
+
if (v !== void 0 && v !== null) usedProps[p] = v;
|
|
49
|
+
});
|
|
50
|
+
if (typeof props.width !== "undefined" && props.width !== null) usedProps.width = props.width;
|
|
51
|
+
if (typeof props.height !== "undefined" && props.height !== null) usedProps.height = props.height;
|
|
52
|
+
}
|
|
53
|
+
return svg;
|
|
54
|
+
}
|
|
55
|
+
function getPossibleIconNames(icon) {
|
|
56
|
+
return [
|
|
57
|
+
icon,
|
|
58
|
+
icon.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(),
|
|
59
|
+
icon.replace(/([a-z])(\d+)/g, "$1-$2")
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export { getPossibleIconNames, mergeIconProps };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compares two objects, returns true if identical
|
|
3
|
+
*
|
|
4
|
+
* Reference object contains keys
|
|
5
|
+
*/
|
|
6
|
+
function compareObjects(obj1, obj2, ref = obj1) {
|
|
7
|
+
for (const key in ref) if (obj1[key] !== obj2[key]) return false;
|
|
8
|
+
return Object.keys(obj1).length === Object.keys(obj2).length;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Unmerge objects, removing items that match in both objects
|
|
12
|
+
*/
|
|
13
|
+
function unmergeObjects(obj1, obj2) {
|
|
14
|
+
const result = { ...obj1 };
|
|
15
|
+
for (const key in obj2) if (result[key] === obj2[key]) delete result[key];
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get common properties in 2 objects
|
|
20
|
+
*/
|
|
21
|
+
function commonObjectProps(item, reference) {
|
|
22
|
+
const result = Object.create(null);
|
|
23
|
+
for (const key in reference) if (key in item) result[key] = item[key];
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { commonObjectProps, compareObjects, unmergeObjects };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert string to camelCase
|
|
3
|
+
*/
|
|
4
|
+
function camelize(str) {
|
|
5
|
+
return str.replace(/-([a-z0-9])/g, (g) => g[1].toUpperCase());
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Convert string to PascaleCase
|
|
9
|
+
*/
|
|
10
|
+
function pascalize(str) {
|
|
11
|
+
const camel = camelize(str);
|
|
12
|
+
return camel.slice(0, 1).toUpperCase() + camel.slice(1);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Convert camelCase string to kebab-case
|
|
16
|
+
*/
|
|
17
|
+
function camelToKebab(key) {
|
|
18
|
+
return key.replace(/:/g, "-").replace(/([A-Z])/g, " $1").trim().split(/\s+/g).join("-").toLowerCase();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Convert camelCase string to snake-case
|
|
22
|
+
*/
|
|
23
|
+
function snakelize(str) {
|
|
24
|
+
return camelToKebab(str).replace(/-/g, "_");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { camelToKebab, camelize, pascalize, snakelize };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitises title, removing any unwanted characters that might break XML.
|
|
3
|
+
*
|
|
4
|
+
* This is a very basic funciton, not full parser.
|
|
5
|
+
*/
|
|
6
|
+
function sanitiseTitleAttribute(content) {
|
|
7
|
+
return content.replace(/[<>&]+/g, "");
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { sanitiseTitleAttribute };
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { defaultIconProps } from "../icon/defaults.js";
|
|
2
|
+
import { defaultIconCustomisations } from "../customisations/defaults.js";
|
|
3
|
+
import { calculateSize } from "./size.js";
|
|
4
|
+
import { wrapSVGContent } from "./defs.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Check if value should be unset. Allows multiple keywords
|
|
8
|
+
*/
|
|
9
|
+
const isUnsetKeyword = (value) => value === "unset" || value === "undefined" || value === "none";
|
|
10
|
+
/**
|
|
11
|
+
* Get SVG attributes and content from icon + customisations
|
|
12
|
+
*
|
|
13
|
+
* Does not generate style to make it compatible with frameworks that use objects for style, such as React.
|
|
14
|
+
* Instead, it generates 'inline' value. If true, rendering engine should add verticalAlign: -0.125em to icon.
|
|
15
|
+
*
|
|
16
|
+
* Customisations should be normalised by platform specific parser.
|
|
17
|
+
* Result should be converted to <svg> by platform specific parser.
|
|
18
|
+
* Use replaceIDs to generate unique IDs for body.
|
|
19
|
+
*/
|
|
20
|
+
function iconToSVG(icon, customisations) {
|
|
21
|
+
const fullIcon = {
|
|
22
|
+
...defaultIconProps,
|
|
23
|
+
...icon
|
|
24
|
+
};
|
|
25
|
+
const fullCustomisations = {
|
|
26
|
+
...defaultIconCustomisations,
|
|
27
|
+
...customisations
|
|
28
|
+
};
|
|
29
|
+
const box = {
|
|
30
|
+
left: fullIcon.left,
|
|
31
|
+
top: fullIcon.top,
|
|
32
|
+
width: fullIcon.width,
|
|
33
|
+
height: fullIcon.height
|
|
34
|
+
};
|
|
35
|
+
let body = fullIcon.body;
|
|
36
|
+
[fullIcon, fullCustomisations].forEach((props) => {
|
|
37
|
+
const transformations = [];
|
|
38
|
+
const hFlip = props.hFlip;
|
|
39
|
+
const vFlip = props.vFlip;
|
|
40
|
+
let rotation = props.rotate;
|
|
41
|
+
if (hFlip) if (vFlip) rotation += 2;
|
|
42
|
+
else {
|
|
43
|
+
transformations.push("translate(" + (box.width + box.left).toString() + " " + (0 - box.top).toString() + ")");
|
|
44
|
+
transformations.push("scale(-1 1)");
|
|
45
|
+
box.top = box.left = 0;
|
|
46
|
+
}
|
|
47
|
+
else if (vFlip) {
|
|
48
|
+
transformations.push("translate(" + (0 - box.left).toString() + " " + (box.height + box.top).toString() + ")");
|
|
49
|
+
transformations.push("scale(1 -1)");
|
|
50
|
+
box.top = box.left = 0;
|
|
51
|
+
}
|
|
52
|
+
let tempValue;
|
|
53
|
+
if (rotation < 0) rotation -= Math.floor(rotation / 4) * 4;
|
|
54
|
+
rotation = rotation % 4;
|
|
55
|
+
switch (rotation) {
|
|
56
|
+
case 1:
|
|
57
|
+
tempValue = box.height / 2 + box.top;
|
|
58
|
+
transformations.unshift("rotate(90 " + tempValue.toString() + " " + tempValue.toString() + ")");
|
|
59
|
+
break;
|
|
60
|
+
case 2:
|
|
61
|
+
transformations.unshift("rotate(180 " + (box.width / 2 + box.left).toString() + " " + (box.height / 2 + box.top).toString() + ")");
|
|
62
|
+
break;
|
|
63
|
+
case 3:
|
|
64
|
+
tempValue = box.width / 2 + box.left;
|
|
65
|
+
transformations.unshift("rotate(-90 " + tempValue.toString() + " " + tempValue.toString() + ")");
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
if (rotation % 2 === 1) {
|
|
69
|
+
if (box.left !== box.top) {
|
|
70
|
+
tempValue = box.left;
|
|
71
|
+
box.left = box.top;
|
|
72
|
+
box.top = tempValue;
|
|
73
|
+
}
|
|
74
|
+
if (box.width !== box.height) {
|
|
75
|
+
tempValue = box.width;
|
|
76
|
+
box.width = box.height;
|
|
77
|
+
box.height = tempValue;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (transformations.length) body = wrapSVGContent(body, "<g transform=\"" + transformations.join(" ") + "\">", "</g>");
|
|
81
|
+
});
|
|
82
|
+
const customisationsWidth = fullCustomisations.width;
|
|
83
|
+
const customisationsHeight = fullCustomisations.height;
|
|
84
|
+
const boxWidth = box.width;
|
|
85
|
+
const boxHeight = box.height;
|
|
86
|
+
let width;
|
|
87
|
+
let height;
|
|
88
|
+
if (customisationsWidth === null) {
|
|
89
|
+
height = customisationsHeight === null ? "1em" : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
|
|
90
|
+
width = calculateSize(height, boxWidth / boxHeight);
|
|
91
|
+
} else {
|
|
92
|
+
width = customisationsWidth === "auto" ? boxWidth : customisationsWidth;
|
|
93
|
+
height = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
|
|
94
|
+
}
|
|
95
|
+
const attributes = {};
|
|
96
|
+
const setAttr = (prop, value) => {
|
|
97
|
+
if (!isUnsetKeyword(value)) attributes[prop] = value.toString();
|
|
98
|
+
};
|
|
99
|
+
setAttr("width", width);
|
|
100
|
+
setAttr("height", height);
|
|
101
|
+
const viewBox = [
|
|
102
|
+
box.left,
|
|
103
|
+
box.top,
|
|
104
|
+
boxWidth,
|
|
105
|
+
boxHeight
|
|
106
|
+
];
|
|
107
|
+
attributes.viewBox = viewBox.join(" ");
|
|
108
|
+
return {
|
|
109
|
+
attributes,
|
|
110
|
+
viewBox,
|
|
111
|
+
body
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export { iconToSVG, isUnsetKeyword };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
function splitSVGDefs(content, tag = "defs") {
|
|
2
|
+
let defs = "";
|
|
3
|
+
const index = content.indexOf("<" + tag);
|
|
4
|
+
while (index >= 0) {
|
|
5
|
+
const start = content.indexOf(">", index);
|
|
6
|
+
const end = content.indexOf("</" + tag);
|
|
7
|
+
if (start === -1 || end === -1) break;
|
|
8
|
+
const endEnd = content.indexOf(">", end);
|
|
9
|
+
if (endEnd === -1) break;
|
|
10
|
+
defs += content.slice(start + 1, end).trim();
|
|
11
|
+
content = content.slice(0, index).trim() + content.slice(endEnd + 1);
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
defs,
|
|
15
|
+
content
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Merge defs and content
|
|
20
|
+
*/
|
|
21
|
+
function mergeDefsAndContent(defs, content) {
|
|
22
|
+
return defs ? "<defs>" + defs + "</defs>" + content : content;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Wrap SVG content, without wrapping definitions
|
|
26
|
+
*/
|
|
27
|
+
function wrapSVGContent(body, start, end) {
|
|
28
|
+
const split = splitSVGDefs(body);
|
|
29
|
+
return mergeDefsAndContent(split.defs, start + split.content + end);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { mergeDefsAndContent, splitSVGDefs, wrapSVGContent };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { encodeSVGforURL } from "./url.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Encode the `SVG` to be used on `CSS`: https://bl.ocks.org/jennyknuth/222825e315d45a738ed9d6e04c7a88d0.
|
|
5
|
+
*
|
|
6
|
+
* @param svg The `SVG` source.
|
|
7
|
+
*/
|
|
8
|
+
function encodeSvgForCss(svg) {
|
|
9
|
+
let useSvg = svg.startsWith("<svg>") ? svg.replace("<svg>", "<svg >") : svg;
|
|
10
|
+
if (!useSvg.includes(" xmlns:xlink=") && useSvg.includes(" xlink:")) useSvg = useSvg.replace("<svg ", "<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" ");
|
|
11
|
+
if (!useSvg.includes(" xmlns=")) useSvg = useSvg.replace("<svg ", "<svg xmlns=\"http://www.w3.org/2000/svg\" ");
|
|
12
|
+
return encodeSVGforURL(useSvg);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { encodeSvgForCss };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate <svg>
|
|
3
|
+
*/
|
|
4
|
+
function iconToHTML(body, attributes) {
|
|
5
|
+
let renderAttribsHTML = body.indexOf("xlink:") === -1 ? "" : " xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
|
|
6
|
+
for (const attr in attributes) renderAttribsHTML += " " + attr + "=\"" + attributes[attr] + "\"";
|
|
7
|
+
return "<svg xmlns=\"http://www.w3.org/2000/svg\"" + renderAttribsHTML + ">" + body + "</svg>";
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { iconToHTML };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regular expression for finding ids
|
|
3
|
+
*/
|
|
4
|
+
const regex = /\sid="(\S+)"/g;
|
|
5
|
+
/**
|
|
6
|
+
* Counters
|
|
7
|
+
*/
|
|
8
|
+
const counters = /* @__PURE__ */ new Map();
|
|
9
|
+
/**
|
|
10
|
+
* Get unique new ID
|
|
11
|
+
*/
|
|
12
|
+
function nextID(id) {
|
|
13
|
+
id = id.replace(/[0-9]+$/, "") || "a";
|
|
14
|
+
const count = counters.get(id) || 0;
|
|
15
|
+
counters.set(id, count + 1);
|
|
16
|
+
return count ? `${id}${count}` : id;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Replace IDs in SVG output with unique IDs
|
|
20
|
+
*/
|
|
21
|
+
function replaceIDs(body) {
|
|
22
|
+
const ids = [];
|
|
23
|
+
let match;
|
|
24
|
+
while (match = regex.exec(body)) ids.push(match[1]);
|
|
25
|
+
if (!ids.length) return body;
|
|
26
|
+
const suffix = "suffix" + (Math.random() * 16777216 | Date.now()).toString(16);
|
|
27
|
+
ids.forEach((id) => {
|
|
28
|
+
const newID = nextID(id);
|
|
29
|
+
const escapedID = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
30
|
+
body = body.replace(new RegExp("([#;\"])(" + escapedID + ")([\")]|\\.[a-z])", "g"), "$1" + newID + suffix + "$3");
|
|
31
|
+
});
|
|
32
|
+
body = body.replace(new RegExp(suffix, "g"), "");
|
|
33
|
+
return body;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Clear ID cache
|
|
37
|
+
*/
|
|
38
|
+
function clearIDCache() {
|
|
39
|
+
counters.clear();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { clearIDCache, replaceIDs };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
let policy;
|
|
2
|
+
/**
|
|
3
|
+
* Attempt to create policy
|
|
4
|
+
*/
|
|
5
|
+
function createPolicy() {
|
|
6
|
+
try {
|
|
7
|
+
policy = window.trustedTypes.createPolicy("iconify", { createHTML: (s) => s });
|
|
8
|
+
} catch (err) {
|
|
9
|
+
policy = null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Clean up value for innerHTML assignment
|
|
14
|
+
*
|
|
15
|
+
* This code doesn't actually clean up anything.
|
|
16
|
+
* It is intended be used with Iconify icon data, which has already been validated
|
|
17
|
+
*/
|
|
18
|
+
function cleanUpInnerHTML(html) {
|
|
19
|
+
if (policy === void 0) createPolicy();
|
|
20
|
+
return policy ? policy.createHTML(html) : html;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { cleanUpInnerHTML };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { wrapSVGContent } from "./defs.js";
|
|
2
|
+
import { getSVGViewBox } from "./viewbox.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Extract attributes and content from SVG
|
|
6
|
+
*/
|
|
7
|
+
function parseSVGContent(content) {
|
|
8
|
+
const match = content.trim().match(/(?:<(?:\?xml|!DOCTYPE)[^>]+>\s*)*<svg([^>]+)>([\s\S]+)<\/svg[^>]*>/);
|
|
9
|
+
if (!match) return;
|
|
10
|
+
const body = match[2].trim();
|
|
11
|
+
const attribsList = match[1].match(/[\w:-]+="[^"]*"/g);
|
|
12
|
+
const attribs = Object.create(null);
|
|
13
|
+
attribsList?.forEach((row) => {
|
|
14
|
+
const match$1 = row.match(/([\w:-]+)="([^"]*)"/);
|
|
15
|
+
if (match$1) attribs[match$1[1]] = match$1[2];
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
attribs,
|
|
19
|
+
body
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function build(data) {
|
|
23
|
+
const attribs = data.attribs;
|
|
24
|
+
const viewBox = getSVGViewBox(attribs["viewBox"] ?? "");
|
|
25
|
+
if (!viewBox) return;
|
|
26
|
+
const groupAttributes = [];
|
|
27
|
+
for (const key in attribs) if (key === "style" || key.startsWith("fill") || key.startsWith("stroke")) groupAttributes.push(`${key}="${attribs[key]}"`);
|
|
28
|
+
let body = data.body;
|
|
29
|
+
if (groupAttributes.length) body = wrapSVGContent(body, "<g " + groupAttributes.join(" ") + ">", "</g>");
|
|
30
|
+
return {
|
|
31
|
+
width: attribs.width,
|
|
32
|
+
height: attribs.height,
|
|
33
|
+
viewBox,
|
|
34
|
+
body
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Convert parsed SVG to IconifyIconBuildResult
|
|
39
|
+
*/
|
|
40
|
+
function buildParsedSVG(data) {
|
|
41
|
+
const result = build(data);
|
|
42
|
+
if (result) return {
|
|
43
|
+
attributes: {
|
|
44
|
+
width: result.width,
|
|
45
|
+
height: result.height,
|
|
46
|
+
viewBox: result.viewBox.join(" ")
|
|
47
|
+
},
|
|
48
|
+
viewBox: result.viewBox,
|
|
49
|
+
body: result.body
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Convert parsed SVG to IconifyIcon
|
|
54
|
+
*/
|
|
55
|
+
function convertParsedSVG(data) {
|
|
56
|
+
const result = build(data);
|
|
57
|
+
if (result) {
|
|
58
|
+
const viewBox = result.viewBox;
|
|
59
|
+
return {
|
|
60
|
+
left: viewBox[0],
|
|
61
|
+
top: viewBox[1],
|
|
62
|
+
width: viewBox[2],
|
|
63
|
+
height: viewBox[3],
|
|
64
|
+
body: result.body
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { buildParsedSVG, convertParsedSVG, parseSVGContent };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tags to skip
|
|
3
|
+
*/
|
|
4
|
+
const skipTags = ["script", "style"];
|
|
5
|
+
/**
|
|
6
|
+
* Prettify SVG
|
|
7
|
+
*/
|
|
8
|
+
function prettifySVG(content, tab = " ", depth = 0) {
|
|
9
|
+
let result = "";
|
|
10
|
+
let level = 0;
|
|
11
|
+
content = content.replace(/(\s)*\/>/g, " />");
|
|
12
|
+
while (content.length > 0) {
|
|
13
|
+
const openIndex = content.indexOf("<");
|
|
14
|
+
let closeIndex = content.indexOf(">");
|
|
15
|
+
if (openIndex === -1 && closeIndex === -1) return result;
|
|
16
|
+
if (openIndex === -1 || closeIndex === -1 || closeIndex < openIndex) return null;
|
|
17
|
+
const text = content.slice(0, openIndex);
|
|
18
|
+
const trimmedText = text.trim();
|
|
19
|
+
if (trimmedText.length) if (text.trimStart() !== text && text.trimEnd() !== text) result += trimmedText + "\n" + tab.repeat(level + depth);
|
|
20
|
+
else result = result.trim() + text;
|
|
21
|
+
content = content.slice(openIndex);
|
|
22
|
+
closeIndex -= openIndex;
|
|
23
|
+
const lastChar = content.slice(closeIndex - 1, closeIndex);
|
|
24
|
+
const isClosing = content.slice(0, 2) === "</";
|
|
25
|
+
let isSelfClosing = lastChar === "/" || lastChar === "?";
|
|
26
|
+
if (isClosing && isSelfClosing) return null;
|
|
27
|
+
const tagName = content.slice(isClosing ? 2 : 1).split(/[\s>]/).shift();
|
|
28
|
+
const ignoreTagContent = !isSelfClosing && !isClosing && skipTags.includes(tagName);
|
|
29
|
+
if (!ignoreTagContent) {
|
|
30
|
+
const nextOpenIndex = content.indexOf("<", 1);
|
|
31
|
+
if (nextOpenIndex !== -1 && nextOpenIndex < closeIndex) return null;
|
|
32
|
+
}
|
|
33
|
+
if (isClosing && tab.length) {
|
|
34
|
+
if (result.slice(0 - tab.length) === tab) result = result.slice(0, result.length - tab.length);
|
|
35
|
+
}
|
|
36
|
+
result += content.slice(0, closeIndex + 1);
|
|
37
|
+
content = content.slice(closeIndex + 1);
|
|
38
|
+
if (ignoreTagContent) {
|
|
39
|
+
const closingIndex = content.indexOf("</" + tagName);
|
|
40
|
+
const closingEnd = content.indexOf(">", closingIndex);
|
|
41
|
+
if (closingIndex < 0 || closingEnd < 0) return null;
|
|
42
|
+
result += content.slice(0, closingEnd + 1);
|
|
43
|
+
content = content.slice(closingEnd + 1);
|
|
44
|
+
isSelfClosing = true;
|
|
45
|
+
}
|
|
46
|
+
if (isClosing) {
|
|
47
|
+
level--;
|
|
48
|
+
if (level < 0) return null;
|
|
49
|
+
} else if (!isSelfClosing) level++;
|
|
50
|
+
result += "\n" + tab.repeat(level + depth);
|
|
51
|
+
}
|
|
52
|
+
return level === 0 ? result : null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { prettifySVG };
|