@pine-ds/icons 3.3.0-rc.0 → 3.3.1-rc.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/components/package.json +1 -1
- package/components/pds-icon.js +33 -13
- package/components/pds-icon.js.map +1 -1
- package/components/utils.js +5 -1
- package/components/utils.js.map +1 -1
- package/dist/cheatsheet.html +4 -4
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/pds-icon.cjs.entry.js +32 -14
- package/dist/cjs/pds-icon.cjs.entry.js.map +1 -1
- package/dist/cjs/pds-icons.cjs.js +1 -1
- package/dist/cjs/{utils-8c57ce6a.js → utils-66fa4942.js} +6 -2
- package/dist/cjs/utils-66fa4942.js.map +1 -0
- package/dist/collection/components/pds-icon/pds-icon.js +21 -0
- package/dist/collection/components/pds-icon/pds-icon.js.map +1 -1
- package/dist/collection/components/pds-icon/request.js +27 -13
- package/dist/collection/components/pds-icon/request.js.map +1 -1
- package/dist/collection/components/pds-icon/svg/blog-filled.svg +1 -1
- package/dist/collection/components/pds-icon/utils.js +5 -1
- package/dist/collection/components/pds-icon/utils.js.map +1 -1
- package/dist/collection/components/pds-icon/validate.js +3 -1
- package/dist/collection/components/pds-icon/validate.js.map +1 -1
- package/dist/docs.json +22 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/pds-icon.entry.js +32 -14
- package/dist/esm/pds-icon.entry.js.map +1 -1
- package/dist/esm/pds-icons.js +1 -1
- package/dist/esm/{utils-15462a67.js → utils-c7e6be67.js} +6 -2
- package/dist/esm/utils-c7e6be67.js.map +1 -0
- package/dist/pds-icons/index.esm.js +1 -1
- package/dist/pds-icons/p-7ef171e4.js +2 -0
- package/dist/pds-icons/p-7ef171e4.js.map +1 -0
- package/dist/pds-icons/p-c34805d3.entry.js +2 -0
- package/dist/pds-icons/p-c34805d3.entry.js.map +1 -0
- package/dist/pds-icons/pds-icons.esm.js +1 -1
- package/dist/pds-icons/pds-icons.esm.js.map +1 -1
- package/dist/pds-icons/svg/access-key.svg +1 -0
- package/dist/pds-icons/svg/add-circle.svg +1 -0
- package/dist/pds-icons/svg/add-image.svg +1 -0
- package/dist/pds-icons/svg/add-small.svg +1 -0
- package/dist/pds-icons/svg/add.svg +1 -0
- package/dist/pds-icons/svg/ai-sparkle.svg +1 -0
- package/dist/pds-icons/svg/ai-writer-filled.svg +1 -0
- package/dist/pds-icons/svg/ai-writer.svg +1 -0
- package/dist/pds-icons/svg/align-center.svg +1 -0
- package/dist/pds-icons/svg/align-justify.svg +1 -0
- package/dist/pds-icons/svg/align-left.svg +1 -0
- package/dist/pds-icons/svg/align-right.svg +1 -0
- package/dist/pds-icons/svg/analytics-filled.svg +1 -0
- package/dist/pds-icons/svg/analytics-outline.svg +1 -0
- package/dist/pds-icons/svg/app-store.svg +1 -0
- package/dist/pds-icons/svg/archive.svg +1 -0
- package/dist/pds-icons/svg/arrow-corner.svg +1 -0
- package/dist/pds-icons/svg/arrow-down.svg +1 -0
- package/dist/pds-icons/svg/arrow-left.svg +1 -0
- package/dist/pds-icons/svg/arrow-right.svg +1 -0
- package/dist/pds-icons/svg/arrow-up.svg +1 -0
- package/dist/pds-icons/svg/assessment.svg +1 -0
- package/dist/pds-icons/svg/at-sign.svg +1 -0
- package/dist/pds-icons/svg/attach.svg +1 -0
- package/dist/pds-icons/svg/automations.svg +1 -0
- package/dist/pds-icons/svg/ban.svg +1 -0
- package/dist/pds-icons/svg/bank.svg +1 -0
- package/dist/pds-icons/svg/bell.svg +1 -0
- package/dist/pds-icons/svg/blog-filled.svg +1 -0
- package/dist/pds-icons/svg/blog.svg +1 -0
- package/dist/pds-icons/svg/bold.svg +1 -0
- package/dist/pds-icons/svg/broadcast.svg +1 -0
- package/dist/pds-icons/svg/calendar-date.svg +1 -0
- package/dist/pds-icons/svg/calendar-schedule.svg +1 -0
- package/dist/pds-icons/svg/calendar-simple.svg +1 -0
- package/dist/pds-icons/svg/card-bw-amex.svg +1 -0
- package/dist/pds-icons/svg/card-bw-apple-card.svg +1 -0
- package/dist/pds-icons/svg/card-bw-diners-club.svg +1 -0
- package/dist/pds-icons/svg/card-bw-discover.svg +1 -0
- package/dist/pds-icons/svg/card-bw-gpay-card.svg +1 -0
- package/dist/pds-icons/svg/card-bw-mastercard.svg +1 -0
- package/dist/pds-icons/svg/card-bw-paypal.svg +1 -0
- package/dist/pds-icons/svg/card-bw-stripe.svg +1 -0
- package/dist/pds-icons/svg/card-bw-visa.svg +1 -0
- package/dist/pds-icons/svg/card-update.svg +1 -0
- package/dist/pds-icons/svg/caret-down.svg +1 -0
- package/dist/pds-icons/svg/caret-left.svg +1 -0
- package/dist/pds-icons/svg/caret-right.svg +1 -0
- package/dist/pds-icons/svg/caret-up.svg +1 -0
- package/dist/pds-icons/svg/cart-add.svg +1 -0
- package/dist/pds-icons/svg/cart.svg +1 -0
- package/dist/pds-icons/svg/certificate.svg +1 -0
- package/dist/pds-icons/svg/check-circle-filled.svg +1 -0
- package/dist/pds-icons/svg/check-circle.svg +1 -0
- package/dist/pds-icons/svg/check.svg +1 -0
- package/dist/pds-icons/svg/circle-1.svg +1 -0
- package/dist/pds-icons/svg/circle-2.svg +1 -0
- package/dist/pds-icons/svg/circle-3.svg +1 -0
- package/dist/pds-icons/svg/circle-4.svg +1 -0
- package/dist/pds-icons/svg/circle-5.svg +1 -0
- package/dist/pds-icons/svg/circle-6.svg +1 -0
- package/dist/pds-icons/svg/circle-7.svg +1 -0
- package/dist/pds-icons/svg/circle-8.svg +1 -0
- package/dist/pds-icons/svg/circle-9.svg +1 -0
- package/dist/pds-icons/svg/clock.svg +1 -0
- package/dist/pds-icons/svg/closed-captions.svg +1 -0
- package/dist/pds-icons/svg/cloud-upload.svg +1 -0
- package/dist/pds-icons/svg/code.svg +1 -0
- package/dist/pds-icons/svg/color.svg +1 -0
- package/dist/pds-icons/svg/columns.svg +1 -0
- package/dist/pds-icons/svg/comment.svg +1 -0
- package/dist/pds-icons/svg/connect.svg +1 -0
- package/dist/pds-icons/svg/contact.svg +1 -0
- package/dist/pds-icons/svg/contacts-filled.svg +1 -0
- package/dist/pds-icons/svg/contacts-outline.svg +1 -0
- package/dist/pds-icons/svg/conversation.svg +1 -0
- package/dist/pds-icons/svg/copy.svg +1 -0
- package/dist/pds-icons/svg/coupon.svg +1 -0
- package/dist/pds-icons/svg/course.svg +1 -0
- package/dist/pds-icons/svg/creator-studio-filled.svg +1 -0
- package/dist/pds-icons/svg/creator-studio.svg +1 -0
- package/dist/pds-icons/svg/credit-card.svg +1 -0
- package/dist/pds-icons/svg/custom-field.svg +1 -0
- package/dist/pds-icons/svg/customize.svg +1 -0
- package/dist/pds-icons/svg/danger-filled.svg +1 -0
- package/dist/pds-icons/svg/danger.svg +1 -0
- package/dist/pds-icons/svg/dashboard-filled.svg +1 -0
- package/dist/pds-icons/svg/dashboard-outline.svg +1 -0
- package/dist/pds-icons/svg/delete-circle.svg +1 -0
- package/dist/pds-icons/svg/delete-key.svg +1 -0
- package/dist/pds-icons/svg/delete-x.svg +1 -0
- package/dist/pds-icons/svg/dollar-sign.svg +1 -0
- package/dist/pds-icons/svg/dot-menu-horizontal.svg +1 -0
- package/dist/pds-icons/svg/down-small.svg +1 -0
- package/dist/pds-icons/svg/download.svg +1 -0
- package/dist/pds-icons/svg/downsell.svg +1 -0
- package/dist/pds-icons/svg/draft.svg +1 -0
- package/dist/pds-icons/svg/drop.svg +1 -0
- package/dist/pds-icons/svg/duplicate.svg +1 -0
- package/dist/pds-icons/svg/email-activity.svg +1 -0
- package/dist/pds-icons/svg/emoji.svg +1 -0
- package/dist/pds-icons/svg/enlarge-vertical.svg +1 -0
- package/dist/pds-icons/svg/enlarge.svg +1 -0
- package/dist/pds-icons/svg/expand.svg +1 -0
- package/dist/pds-icons/svg/facebook-2.svg +1 -0
- package/dist/pds-icons/svg/facebook.svg +1 -0
- package/dist/pds-icons/svg/favorite.svg +1 -0
- package/dist/pds-icons/svg/feedback.svg +1 -0
- package/dist/pds-icons/svg/file-money.svg +1 -0
- package/dist/pds-icons/svg/file.svg +1 -0
- package/dist/pds-icons/svg/filter.svg +1 -0
- package/dist/pds-icons/svg/flag.svg +1 -0
- package/dist/pds-icons/svg/flash-filled.svg +1 -0
- package/dist/pds-icons/svg/flash.svg +1 -0
- package/dist/pds-icons/svg/folder-group.svg +1 -0
- package/dist/pds-icons/svg/folder.svg +1 -0
- package/dist/pds-icons/svg/form-field.svg +1 -0
- package/dist/pds-icons/svg/form-filled.svg +1 -0
- package/dist/pds-icons/svg/form.svg +1 -0
- package/dist/pds-icons/svg/fullscreen.svg +1 -0
- package/dist/pds-icons/svg/funnel.svg +1 -0
- package/dist/pds-icons/svg/grant-offer.svg +1 -0
- package/dist/pds-icons/svg/handle-2-vertical.svg +1 -0
- package/dist/pds-icons/svg/handle-2.svg +1 -0
- package/dist/pds-icons/svg/handle.svg +1 -0
- package/dist/pds-icons/svg/hashtag.svg +1 -0
- package/dist/pds-icons/svg/hd-video.svg +1 -0
- package/dist/pds-icons/svg/heading-large.svg +1 -0
- package/dist/pds-icons/svg/heading-small.svg +1 -0
- package/dist/pds-icons/svg/headset.svg +1 -0
- package/dist/pds-icons/svg/help-filled.svg +1 -0
- package/dist/pds-icons/svg/help-outline.svg +1 -0
- package/dist/pds-icons/svg/home-alt.svg +1 -0
- package/dist/pds-icons/svg/horizontal-line.svg +1 -0
- package/dist/pds-icons/svg/image.svg +1 -0
- package/dist/pds-icons/svg/info-circle-filled.svg +1 -0
- package/dist/pds-icons/svg/info-circle.svg +1 -0
- package/dist/pds-icons/svg/instagram.svg +1 -0
- package/dist/pds-icons/svg/ios-battery.svg +1 -0
- package/dist/pds-icons/svg/ios-data.svg +1 -0
- package/dist/pds-icons/svg/ios-wifi.svg +1 -0
- package/dist/pds-icons/svg/italic.svg +1 -0
- package/dist/pds-icons/svg/kajabi-filled.svg +1 -0
- package/dist/pds-icons/svg/kajabi-outlined.svg +1 -0
- package/dist/pds-icons/svg/lab.svg +1 -0
- package/dist/pds-icons/svg/launch.svg +1 -0
- package/dist/pds-icons/svg/layout-grid.svg +1 -0
- package/dist/pds-icons/svg/layout-list.svg +1 -0
- package/dist/pds-icons/svg/left-small.svg +1 -0
- package/dist/pds-icons/svg/linkedin.svg +1 -0
- package/dist/pds-icons/svg/list-bullet.svg +1 -0
- package/dist/pds-icons/svg/list-numbers.svg +1 -0
- package/dist/pds-icons/svg/location.svg +1 -0
- package/dist/pds-icons/svg/lock-alt.svg +1 -0
- package/dist/pds-icons/svg/lock.svg +1 -0
- package/dist/pds-icons/svg/logo-afterpay.svg +1 -0
- package/dist/pds-icons/svg/loop.svg +1 -0
- package/dist/pds-icons/svg/mail-filled.svg +1 -0
- package/dist/pds-icons/svg/mail.svg +1 -0
- package/dist/pds-icons/svg/map.svg +1 -0
- package/dist/pds-icons/svg/mapped.svg +1 -0
- package/dist/pds-icons/svg/margin-left.svg +1 -0
- package/dist/pds-icons/svg/margin-right.svg +1 -0
- package/dist/pds-icons/svg/marker-filled.svg +1 -0
- package/dist/pds-icons/svg/marker.svg +1 -0
- package/dist/pds-icons/svg/marketing-filled.svg +1 -0
- package/dist/pds-icons/svg/marketing-outline.svg +1 -0
- package/dist/pds-icons/svg/menu-2.svg +1 -0
- package/dist/pds-icons/svg/menu-alt.svg +1 -0
- package/dist/pds-icons/svg/menu.svg +1 -0
- package/dist/pds-icons/svg/merge.svg +1 -0
- package/dist/pds-icons/svg/microphone-off.svg +1 -0
- package/dist/pds-icons/svg/microphone.svg +1 -0
- package/dist/pds-icons/svg/move-left.svg +1 -0
- package/dist/pds-icons/svg/move-right.svg +1 -0
- package/dist/pds-icons/svg/multi-pay.svg +1 -0
- package/dist/pds-icons/svg/newsletter.svg +1 -0
- package/dist/pds-icons/svg/one-off-session.svg +1 -0
- package/dist/pds-icons/svg/one-time.svg +1 -0
- package/dist/pds-icons/svg/partners-filled.svg +1 -0
- package/dist/pds-icons/svg/partners-outline.svg +1 -0
- package/dist/pds-icons/svg/pause-circle.svg +1 -0
- package/dist/pds-icons/svg/pause.svg +1 -0
- package/dist/pds-icons/svg/payout.svg +1 -0
- package/dist/pds-icons/svg/pen.svg +1 -0
- package/dist/pds-icons/svg/phone-portrait.svg +1 -0
- package/dist/pds-icons/svg/phone-toolbar.svg +1 -0
- package/dist/pds-icons/svg/play-circle.svg +1 -0
- package/dist/pds-icons/svg/play-outline.svg +1 -0
- package/dist/pds-icons/svg/play-store.svg +1 -0
- package/dist/pds-icons/svg/play.svg +1 -0
- package/dist/pds-icons/svg/plug.svg +1 -0
- package/dist/pds-icons/svg/premium.svg +1 -0
- package/dist/pds-icons/svg/present.svg +1 -0
- package/dist/pds-icons/svg/preview-off.svg +1 -0
- package/dist/pds-icons/svg/preview-on.svg +1 -0
- package/dist/pds-icons/svg/products-filled.svg +1 -0
- package/dist/pds-icons/svg/products-outline.svg +1 -0
- package/dist/pds-icons/svg/question-circle.svg +1 -0
- package/dist/pds-icons/svg/quote.svg +1 -0
- package/dist/pds-icons/svg/redo.svg +1 -0
- package/dist/pds-icons/svg/refresh.svg +1 -0
- package/dist/pds-icons/svg/remove-circle.svg +1 -0
- package/dist/pds-icons/svg/remove.svg +1 -0
- package/dist/pds-icons/svg/rename.svg +1 -0
- package/dist/pds-icons/svg/reset-password.svg +1 -0
- package/dist/pds-icons/svg/restore.svg +1 -0
- package/dist/pds-icons/svg/right-small.svg +1 -0
- package/dist/pds-icons/svg/round-dollar.svg +1 -0
- package/dist/pds-icons/svg/rows.svg +1 -0
- package/dist/pds-icons/svg/sales-filled.svg +1 -0
- package/dist/pds-icons/svg/sales-outline.svg +1 -0
- package/dist/pds-icons/svg/scissor.svg +1 -0
- package/dist/pds-icons/svg/screen-share-off.svg +1 -0
- package/dist/pds-icons/svg/screen-share-on.svg +1 -0
- package/dist/pds-icons/svg/search-small.svg +1 -0
- package/dist/pds-icons/svg/search.svg +1 -0
- package/dist/pds-icons/svg/send-message.svg +1 -0
- package/dist/pds-icons/svg/sequences.svg +1 -0
- package/dist/pds-icons/svg/series.svg +1 -0
- package/dist/pds-icons/svg/settings-filled.svg +1 -0
- package/dist/pds-icons/svg/settings-outline.svg +1 -0
- package/dist/pds-icons/svg/share.svg +1 -0
- package/dist/pds-icons/svg/skipped.svg +1 -0
- package/dist/pds-icons/svg/slash-divider.svg +1 -0
- package/dist/pds-icons/svg/sparkle-filled.svg +1 -0
- package/dist/pds-icons/svg/sparkle.svg +1 -0
- package/dist/pds-icons/svg/speaker.svg +1 -0
- package/dist/pds-icons/svg/stack.svg +1 -0
- package/dist/pds-icons/svg/star.svg +1 -0
- package/dist/pds-icons/svg/stop.svg +1 -0
- package/dist/pds-icons/svg/stopwatch.svg +1 -0
- package/dist/pds-icons/svg/strikethrough.svg +1 -0
- package/dist/pds-icons/svg/subscript.svg +1 -0
- package/dist/pds-icons/svg/subscriptions.svg +1 -0
- package/dist/pds-icons/svg/super-admin.svg +1 -0
- package/dist/pds-icons/svg/superscript.svg +1 -0
- package/dist/pds-icons/svg/sync.svg +1 -0
- package/dist/pds-icons/svg/tablet-landscape.svg +1 -0
- package/dist/pds-icons/svg/tablet-portrait.svg +1 -0
- package/dist/pds-icons/svg/text-styles.svg +1 -0
- package/dist/pds-icons/svg/theme-store-filled.svg +1 -0
- package/dist/pds-icons/svg/theme-store.svg +1 -0
- package/dist/pds-icons/svg/thumbs-down-filled.svg +1 -0
- package/dist/pds-icons/svg/thumbs-down.svg +1 -0
- package/dist/pds-icons/svg/thumbs-up-filled.svg +1 -0
- package/dist/pds-icons/svg/thumbs-up.svg +1 -0
- package/dist/pds-icons/svg/tiktok.svg +1 -0
- package/dist/pds-icons/svg/trash.svg +1 -0
- package/dist/pds-icons/svg/twitter.svg +1 -0
- package/dist/pds-icons/svg/underline.svg +1 -0
- package/dist/pds-icons/svg/undo.svg +1 -0
- package/dist/pds-icons/svg/unlock.svg +1 -0
- package/dist/pds-icons/svg/unmapped.svg +1 -0
- package/dist/pds-icons/svg/up-small.svg +1 -0
- package/dist/pds-icons/svg/upload.svg +1 -0
- package/dist/pds-icons/svg/url.svg +1 -0
- package/dist/pds-icons/svg/user-filled.svg +1 -0
- package/dist/pds-icons/svg/user.svg +1 -0
- package/dist/pds-icons/svg/users-wm.svg +1 -0
- package/dist/pds-icons/svg/users.svg +1 -0
- package/dist/pds-icons/svg/video-off.svg +1 -0
- package/dist/pds-icons/svg/video-on.svg +1 -0
- package/dist/pds-icons/svg/warning-filled.svg +1 -0
- package/dist/pds-icons/svg/warning.svg +1 -0
- package/dist/pds-icons/svg/website-filled.svg +1 -0
- package/dist/pds-icons/svg/website-outline.svg +1 -0
- package/dist/pds-icons/svg/window-paragraph.svg +1 -0
- package/dist/pds-icons/svg/world.svg +1 -0
- package/dist/pds-icons/svg/wrench.svg +1 -0
- package/dist/pds-icons/svg/youtube.svg +1 -0
- package/dist/pds-icons.json +1 -1
- package/dist/pds-icons.symbols.svg +2 -2
- package/dist/svg/blog-filled.svg +1 -1
- package/dist/types/components/pds-icon/pds-icon.d.ts +5 -0
- package/dist/types/components/pds-icon/validate.d.ts +2 -0
- package/dist/types/components.d.ts +8 -0
- package/icons/index.d.ts +1 -1
- package/icons/index.js +2 -2
- package/icons/index.mjs +2 -2
- package/icons/package.json +2 -2
- package/package.json +1 -1
- package/dist/cjs/utils-8c57ce6a.js.map +0 -1
- package/dist/esm/utils-15462a67.js.map +0 -1
- package/dist/pds-icons/p-229b8f4e.entry.js +0 -2
- package/dist/pds-icons/p-229b8f4e.entry.js.map +0 -1
- package/dist/pds-icons/p-f0b1dbd6.js +0 -2
- package/dist/pds-icons/p-f0b1dbd6.js.map +0 -1
package/components/package.json
CHANGED
package/components/pds-icon.js
CHANGED
|
@@ -14,7 +14,7 @@ const validateContent = (svgContent) => {
|
|
|
14
14
|
const svgElm = div.firstElementChild;
|
|
15
15
|
if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {
|
|
16
16
|
const svgClass = svgElm.getAttribute('class') || '';
|
|
17
|
-
svgElm.setAttribute('class', (svgClass + ' s-
|
|
17
|
+
svgElm.setAttribute('class', (svgClass + ' s-pds-icon').trim());
|
|
18
18
|
// root element must be an svg
|
|
19
19
|
// lets double check we've got valid elements
|
|
20
20
|
// do not allow scripts
|
|
@@ -43,26 +43,42 @@ const isValid = (elm) => {
|
|
|
43
43
|
}
|
|
44
44
|
return true;
|
|
45
45
|
};
|
|
46
|
+
const isSvgDataUrl = (url) => url.startsWith('data:image/svg+xml');
|
|
47
|
+
const isEncodedDataUrl = (url) => url.indexOf(';utf8,') !== -1;
|
|
46
48
|
|
|
47
49
|
const pdsIconContent = new Map();
|
|
48
50
|
const requests = new Map(); // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
51
|
+
let parser;
|
|
49
52
|
const getSvgContent = (url, sanitize = false) => {
|
|
50
53
|
let req = requests.get(url);
|
|
51
54
|
if (!req) {
|
|
52
55
|
if (typeof fetch != 'undefined' && typeof document !== 'undefined') {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return rsp.text().then((svgContent) => {
|
|
57
|
-
if (svgContent && sanitize !== false) {
|
|
58
|
-
svgContent = validateContent(svgContent);
|
|
59
|
-
}
|
|
60
|
-
pdsIconContent.set(url, svgContent || '');
|
|
61
|
-
});
|
|
56
|
+
if (isSvgDataUrl(url) && isEncodedDataUrl(url)) {
|
|
57
|
+
if (!parser) {
|
|
58
|
+
parser = new DOMParser();
|
|
62
59
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
const doc = parser.parseFromString(url, 'text/html');
|
|
61
|
+
const svg = doc.querySelector('svg');
|
|
62
|
+
if (svg) {
|
|
63
|
+
pdsIconContent.set(url, svg.outerHTML);
|
|
64
|
+
}
|
|
65
|
+
return Promise.resolve();
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// we don't have a request
|
|
69
|
+
req = fetch(url).then((rsp) => {
|
|
70
|
+
if (rsp.ok) {
|
|
71
|
+
return rsp.text().then((svgContent) => {
|
|
72
|
+
if (svgContent && sanitize !== false) {
|
|
73
|
+
svgContent = validateContent(svgContent);
|
|
74
|
+
}
|
|
75
|
+
pdsIconContent.set(url, svgContent || '');
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
pdsIconContent.set(url, '');
|
|
79
|
+
});
|
|
80
|
+
requests.set(url, req);
|
|
81
|
+
}
|
|
66
82
|
}
|
|
67
83
|
else {
|
|
68
84
|
pdsIconContent.set(url, '');
|
|
@@ -91,6 +107,7 @@ const PdsIcon$1 = /*@__PURE__*/ proxyCustomElement(class PdsIcon extends HTMLEle
|
|
|
91
107
|
this.icon = undefined;
|
|
92
108
|
this.name = undefined;
|
|
93
109
|
this.size = 'regular';
|
|
110
|
+
this.src = undefined;
|
|
94
111
|
}
|
|
95
112
|
iconSize() {
|
|
96
113
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -172,6 +189,7 @@ const PdsIcon$1 = /*@__PURE__*/ proxyCustomElement(class PdsIcon extends HTMLEle
|
|
|
172
189
|
get el() { return this; }
|
|
173
190
|
static get watchers() { return {
|
|
174
191
|
"name": ["loadIcon"],
|
|
192
|
+
"src": ["loadIcon"],
|
|
175
193
|
"icon": ["loadIcon"]
|
|
176
194
|
}; }
|
|
177
195
|
static get style() { return pdsIconCss; }
|
|
@@ -180,11 +198,13 @@ const PdsIcon$1 = /*@__PURE__*/ proxyCustomElement(class PdsIcon extends HTMLEle
|
|
|
180
198
|
"icon": [8],
|
|
181
199
|
"name": [513],
|
|
182
200
|
"size": [513],
|
|
201
|
+
"src": [1],
|
|
183
202
|
"ariaLabel": [32],
|
|
184
203
|
"isVisible": [32],
|
|
185
204
|
"svgContent": [32]
|
|
186
205
|
}, undefined, {
|
|
187
206
|
"name": ["loadIcon"],
|
|
207
|
+
"src": ["loadIcon"],
|
|
188
208
|
"icon": ["loadIcon"]
|
|
189
209
|
}]);
|
|
190
210
|
const createColorClasses = (color) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"pds-icon.js","mappings":"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","names":["PdsIcon"],"sources":["src/components/pds-icon/validate.ts","src/components/pds-icon/request.ts","src/components/pds-icon/pds-icon.scss?tag=pds-icon&encapsulation=shadow","src/components/pds-icon/pds-icon.tsx"],"sourcesContent":["import { isStr } from './utils';\n\nexport const validateContent = (svgContent: string) => {\n const div = document.createElement('div');\n div.innerHTML = svgContent;\n\n // setup this way to ensure it works on our buddy IE\n for (let i = div.childNodes.length - 1; i >= 0; i--) {\n if (div.childNodes[i].nodeName.toLowerCase() !== 'svg') {\n div.removeChild(div.childNodes[i]);\n }\n }\n\n // must only have 1 root element\n const svgElm = div.firstElementChild;\n if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {\n const svgClass = svgElm.getAttribute('class') || '';\n svgElm.setAttribute('class', (svgClass + ' s-ion-icon').trim());\n\n // root element must be an svg\n // lets double check we've got valid elements\n // do not allow scripts\n if (isValid(svgElm as HTMLElement)) {\n return div.innerHTML;\n }\n }\n return '';\n};\n\nexport const isValid = (elm: HTMLElement) => {\n if (elm.nodeType === 1) {\n if (elm.nodeName.toLowerCase() === 'script') {\n return false;\n }\n\n for (let i = 0; i < elm.attributes.length; i++) {\n const name = elm.attributes[i].name;\n if (isStr(name) && name.toLowerCase().indexOf('on') === 0) {\n return false;\n }\n }\n\n for (let i = 0; i < elm.childNodes.length; i++) {\n if (!isValid(elm.childNodes[i] as HTMLElement)) {\n return false;\n }\n }\n }\n return true;\n};\n","import { validateContent } from './validate';\n\nexport const pdsIconContent = new Map<string, string>();\nconst requests = new Map<string, Promise<any>>(); // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport const getSvgContent = (url: string, sanitize = false) => {\n let req = requests.get(url);\n\n if(!req) {\n if (typeof fetch != 'undefined' && typeof document !== 'undefined') {\n // we don't have a request\n req = fetch(url).then((rsp) => {\n if (rsp.ok) {\n return rsp.text().then((svgContent) => {\n if (svgContent && sanitize !== false) {\n svgContent = validateContent(svgContent);\n }\n pdsIconContent.set(url, svgContent || '');\n });\n }\n pdsIconContent.set(url, '');\n });\n\n requests.set(url, req);\n } else {\n pdsIconContent.set(url, '');\n return Promise.resolve();\n }\n }\n return req;\n}\n",":host {\n contain: strict;\n display: inline-block;\n fill: currentColor;\n height: 1em;\n width: 1em;\n\n .pdsicon {\n fill: currentColor;\n }\n}\n\n.pds-icon-fill-none {\n fill: none;\n}\n\n.icon-inner,\n.pds-icon,\nsvg {\n display: block;\n height: 100%;\n width: 100%;\n}\n","import { Build, Component, Element, Host, Prop, State, Watch, h } from '@stencil/core';\nimport { getSvgContent, pdsIconContent } from './request';\nimport { getName, getUrl, inheritAttributes } from './utils';\n\n@Component({\n tag: 'pds-icon',\n assetsDirs: ['svg'],\n styleUrl: 'pds-icon.scss',\n shadow: true,\n})\nexport class PdsIcon {\n private io?: IntersectionObserver;\n private inheritedAttributes: { [k: string]: any } = {}; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n @Element() el!: HTMLPdsIconElement;\n\n @State() private ariaLabel?: string;\n @State() private isVisible = false;\n @State() private svgContent?: string;\n\n /**\n *\n * The color of the icon\n *\n */\n @Prop() color?: string;\n\n /**\n * This a combination of both `name` and `src`. If a `src` url is detected\n * it will set the `src` property. Otherwise it assumes it's a built-in named\n * SVG and set the `name` property.\n */\n @Prop() icon?: any;\n\n /**\n * The name of the icon to use from\n * the built-in set.\n */\n @Prop({ reflect: true }) name?: string;\n\n /**\n * The size of the icon. This can be\n * 'small', 'regular', 'medium', large, or a\n * custom value (40px, 1rem, etc)\n *\n */\n @Prop({ reflect: true }) size?:\n | 'small' // 12px\n | 'regular' // 16px\n | 'medium' // 20px\n | 'large' // 24px\n | 'auto'\n | string = 'regular'\n\n private iconSize() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sizes: { [key: string]: any } = {\n small: '12px',\n regular: '16px',\n medium: '20px',\n large: '24px',\n }\n\n if (sizes[this.size]) {\n return sizes[this.size];\n } else {\n return this.size;\n }\n }\n componentWillLoad() {\n this.inheritedAttributes = inheritAttributes(this.el, ['aria-label']);\n }\n\n connectedCallback() {\n this.waitUntilVisible(this.el, '50px', () => {\n this.isVisible = true;\n this.loadIcon();\n })\n }\n\n disconnectedCallback() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n }\n\n @Watch('name')\n @Watch('icon')\n loadIcon() {\n if (Build.isBrowser && this.isVisible) {\n const url = getUrl(this);\n if (url) {\n if (pdsIconContent.has(url)) {\n this.svgContent = pdsIconContent.get(url);\n } else {\n getSvgContent(url).then(() => (this.svgContent = pdsIconContent.get(url)));\n }\n }\n }\n\n const label = getName(this.name, this.icon);\n\n if (label) {\n this.ariaLabel = label.replace(/\\-/g, ' ');\n }\n }\n\n render() {\n const { ariaLabel, inheritedAttributes } = this;\n\n const style = {\n height: this.iconSize(),\n width: this.iconSize(),\n color: this.color,\n }\n\n return (\n\n <Host\n aria-label={ariaLabel !== undefined && !this.hasAriaHidden() ? ariaLabel : null }\n role=\"img\"\n style={style}\n class={{\n ...createColorClasses(this.color),\n }}\n {...inheritedAttributes}\n >\n {Build.isBrowser && this.svgContent ? (\n <div class=\"icon-inner\" innerHTML={this.svgContent}></div>\n ) : (\n <div class=\"icon-inner\"></div>\n )}\n </Host>\n )\n }\n\n /*****\n * Private Methods\n ****/\n\n private waitUntilVisible(el: HTMLElement, rootMargin: string, cb: () => void) {\n if (Build.isBrowser && typeof window !== 'undefined' && (window).IntersectionObserver) {\n const io = (this.io = new (window).IntersectionObserver(\n (data: IntersectionObserverEntry[]) => {\n if (data[0].isIntersecting) {\n io.disconnect();\n this.io = undefined;\n cb();\n }\n },\n { rootMargin },\n ));\n\n io.observe(el);\n } else {\n // browser doesn't support IntersectionObserver\n // so just fallback to always show it\n cb();\n }\n }\n\n private hasAriaHidden = () => {\n const { el } = this;\n\n return el.hasAttribute('aria-hidden') && el.getAttribute('aria-hidden') === 'true';\n }\n}\n\nconst createColorClasses = (color: string | undefined) => {\n return color\n ? {\n 'pds-color': true,\n [`pds-color-${color}`]: true,\n }\n : null;\n };\n"],"version":3}
|
|
1
|
+
{"file":"pds-icon.js","mappings":"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","names":["PdsIcon"],"sources":["src/components/pds-icon/validate.ts","src/components/pds-icon/request.ts","src/components/pds-icon/pds-icon.scss?tag=pds-icon&encapsulation=shadow","src/components/pds-icon/pds-icon.tsx"],"sourcesContent":["import { isStr } from './utils';\n\nexport const validateContent = (svgContent: string) => {\n const div = document.createElement('div');\n div.innerHTML = svgContent;\n\n // setup this way to ensure it works on our buddy IE\n for (let i = div.childNodes.length - 1; i >= 0; i--) {\n if (div.childNodes[i].nodeName.toLowerCase() !== 'svg') {\n div.removeChild(div.childNodes[i]);\n }\n }\n\n // must only have 1 root element\n const svgElm = div.firstElementChild;\n if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {\n const svgClass = svgElm.getAttribute('class') || '';\n svgElm.setAttribute('class', (svgClass + ' s-pds-icon').trim());\n\n // root element must be an svg\n // lets double check we've got valid elements\n // do not allow scripts\n if (isValid(svgElm as HTMLElement)) {\n return div.innerHTML;\n }\n }\n return '';\n};\n\nexport const isValid = (elm: HTMLElement) => {\n if (elm.nodeType === 1) {\n if (elm.nodeName.toLowerCase() === 'script') {\n return false;\n }\n\n for (let i = 0; i < elm.attributes.length; i++) {\n const name = elm.attributes[i].name;\n if (isStr(name) && name.toLowerCase().indexOf('on') === 0) {\n return false;\n }\n }\n\n for (let i = 0; i < elm.childNodes.length; i++) {\n if (!isValid(elm.childNodes[i] as HTMLElement)) {\n return false;\n }\n }\n }\n return true;\n};\n\nexport const isSvgDataUrl = (url: string) => url.startsWith('data:image/svg+xml');\nexport const isEncodedDataUrl = (url: string) => url.indexOf(';utf8,') !== -1;\n","import { isEncodedDataUrl, isSvgDataUrl, validateContent } from './validate';\n\nexport const pdsIconContent = new Map<string, string>();\nconst requests = new Map<string, Promise<any>>(); // eslint-disable-line @typescript-eslint/no-explicit-any\n\nlet parser: DOMParser;\n\nexport const getSvgContent = (url: string, sanitize = false) => {\n let req = requests.get(url);\n\n if(!req) {\n if (typeof fetch != 'undefined' && typeof document !== 'undefined') {\n if (isSvgDataUrl(url) && isEncodedDataUrl(url)) {\n if (!parser) {\n parser = new DOMParser();\n }\n\n const doc = parser.parseFromString(url, 'text/html');\n const svg = doc.querySelector('svg');\n\n if (svg) {\n pdsIconContent.set(url, svg.outerHTML);\n }\n\n return Promise.resolve();\n } else {\n // we don't have a request\n req = fetch(url).then((rsp) => {\n if (rsp.ok) {\n return rsp.text().then((svgContent) => {\n if (svgContent && sanitize !== false) {\n svgContent = validateContent(svgContent);\n }\n pdsIconContent.set(url, svgContent || '');\n });\n }\n pdsIconContent.set(url, '');\n });\n\n requests.set(url, req);\n }\n } else {\n pdsIconContent.set(url, '');\n return Promise.resolve();\n }\n }\n\n return req;\n}\n",":host {\n contain: strict;\n display: inline-block;\n fill: currentColor;\n height: 1em;\n width: 1em;\n\n .pdsicon {\n fill: currentColor;\n }\n}\n\n.pds-icon-fill-none {\n fill: none;\n}\n\n.icon-inner,\n.pds-icon,\nsvg {\n display: block;\n height: 100%;\n width: 100%;\n}\n","import { Build, Component, Element, Host, Prop, State, Watch, h } from '@stencil/core';\nimport { getSvgContent, pdsIconContent } from './request';\nimport { getName, getUrl, inheritAttributes } from './utils';\n\n@Component({\n tag: 'pds-icon',\n assetsDirs: ['svg'],\n styleUrl: 'pds-icon.scss',\n shadow: true,\n})\nexport class PdsIcon {\n private io?: IntersectionObserver;\n private inheritedAttributes: { [k: string]: any } = {}; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n @Element() el!: HTMLPdsIconElement;\n\n @State() private ariaLabel?: string;\n @State() private isVisible = false;\n @State() private svgContent?: string;\n\n /**\n *\n * The color of the icon\n *\n */\n @Prop() color?: string;\n\n /**\n * This a combination of both `name` and `src`. If a `src` url is detected\n * it will set the `src` property. Otherwise it assumes it's a built-in named\n * SVG and set the `name` property.\n */\n @Prop() icon?: any;\n\n /**\n * The name of the icon to use from\n * the built-in set.\n */\n @Prop({ reflect: true }) name?: string;\n\n /**\n * The size of the icon. This can be\n * 'small', 'regular', 'medium', large, or a\n * custom value (40px, 1rem, etc)\n *\n */\n @Prop({ reflect: true }) size?:\n | 'small' // 12px\n | 'regular' // 16px\n | 'medium' // 20px\n | 'large' // 24px\n | 'auto'\n | string = 'regular'\n\n /**\n *\n * Specifies the exact `src` of an SVG file to use.\n */\n @Prop() src?: string;\n\n private iconSize() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sizes: { [key: string]: any } = {\n small: '12px',\n regular: '16px',\n medium: '20px',\n large: '24px',\n }\n\n if (sizes[this.size]) {\n return sizes[this.size];\n } else {\n return this.size;\n }\n }\n componentWillLoad() {\n this.inheritedAttributes = inheritAttributes(this.el, ['aria-label']);\n }\n\n connectedCallback() {\n this.waitUntilVisible(this.el, '50px', () => {\n this.isVisible = true;\n this.loadIcon();\n })\n }\n\n disconnectedCallback() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n }\n\n @Watch('name')\n @Watch('src')\n @Watch('icon')\n loadIcon() {\n if (Build.isBrowser && this.isVisible) {\n const url = getUrl(this);\n if (url) {\n if (pdsIconContent.has(url)) {\n this.svgContent = pdsIconContent.get(url);\n } else {\n getSvgContent(url).then(() => (this.svgContent = pdsIconContent.get(url)));\n }\n }\n }\n\n const label = getName(this.name, this.icon);\n\n if (label) {\n this.ariaLabel = label.replace(/\\-/g, ' ');\n }\n }\n\n render() {\n const { ariaLabel, inheritedAttributes } = this;\n\n const style = {\n height: this.iconSize(),\n width: this.iconSize(),\n color: this.color,\n }\n\n return (\n\n <Host\n aria-label={ariaLabel !== undefined && !this.hasAriaHidden() ? ariaLabel : null }\n role=\"img\"\n style={style}\n class={{\n ...createColorClasses(this.color),\n }}\n {...inheritedAttributes}\n >\n {Build.isBrowser && this.svgContent ? (\n <div class=\"icon-inner\" innerHTML={this.svgContent}></div>\n ) : (\n <div class=\"icon-inner\"></div>\n )}\n </Host>\n )\n }\n\n /*****\n * Private Methods\n ****/\n\n private waitUntilVisible(el: HTMLElement, rootMargin: string, cb: () => void) {\n if (Build.isBrowser && typeof window !== 'undefined' && (window).IntersectionObserver) {\n const io = (this.io = new (window).IntersectionObserver(\n (data: IntersectionObserverEntry[]) => {\n if (data[0].isIntersecting) {\n io.disconnect();\n this.io = undefined;\n cb();\n }\n },\n { rootMargin },\n ));\n\n io.observe(el);\n } else {\n // browser doesn't support IntersectionObserver\n // so just fallback to always show it\n cb();\n }\n }\n\n private hasAriaHidden = () => {\n const { el } = this;\n\n return el.hasAttribute('aria-hidden') && el.getAttribute('aria-hidden') === 'true';\n }\n}\n\nconst createColorClasses = (color: string | undefined) => {\n return color\n ? {\n 'pds-color': true,\n [`pds-color-${color}`]: true,\n }\n : null;\n };\n"],"version":3}
|
package/components/utils.js
CHANGED
|
@@ -51,7 +51,11 @@ const getSrc = (src) => {
|
|
|
51
51
|
return null;
|
|
52
52
|
};
|
|
53
53
|
const getUrl = (pdsIcon) => {
|
|
54
|
-
let url =
|
|
54
|
+
let url = getSrc(pdsIcon.src);
|
|
55
|
+
if (url) {
|
|
56
|
+
return url;
|
|
57
|
+
}
|
|
58
|
+
url = getName(pdsIcon.name, pdsIcon.icon);
|
|
55
59
|
if (url) {
|
|
56
60
|
return getNamedUrl(url);
|
|
57
61
|
}
|
package/components/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"utils.js","mappings":";;AAGA,IAAI,UAA+B,CAAC;MAEvB,QAAQ,GAAG,CAAC,KAAkC;IACzD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjE,EAAC;AAEM,MAAM,UAAU,GAAG;IACxB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,OAAO,IAAI,GAAG,EAAE,CAAC;KAClB;SAAO;QACN,IAAI,CAAC,UAAU,EAAE;YACf,MAAM,GAAG,GAAG,MAAa,CAAC;YAC1B,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;YAClC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;SAC/D;QAED,OAAO,UAAU,CAAC;KACnB;AACH,CAAC,CAAA;MAEY,OAAO,GAAG,CACrB,QAA4B,EAC5B,IAAwB;IAGxB,IAAG,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QACpC,QAAQ,GAAG,IAAI,CAAC;KACjB;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;QACnB,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;KAC9B;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC9C,OAAO,IAAI,CAAC;KACb;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAC,EAAE,CAAC,CAAC;IACzD,IAAI,YAAY,IAAI,EAAE,EAAE;QAAE,OAAO,IAAI,CAAC;KAAE;IAExC,OAAO,QAAQ,CAAC;AAClB,EAAC;AAED,MAAM,WAAW,GAAG,CAAC,QAAgB;IACnC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,GAAG,EAAE;QACP,OAAO,GAAG,CAAC;KACZ;IAED,OAAO,YAAY,CAAC,OAAO,QAAQ,MAAM,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEK,MAAM,MAAM,GAAG,CAAC,GAAuB;IAC5C,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;QACd,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;YACd,OAAO,GAAG,CAAC;SACZ;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAA;MAEY,MAAM,GAAG,CAAC,OAAgB;IACrC,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"file":"utils.js","mappings":"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","names":[],"sources":["src/components/pds-icon/utils.ts"],"sourcesContent":["import { getAssetPath } from '@stencil/core';\nimport { PdsIcon } from './pds-icon';\n\nlet CACHED_MAP: Map<string, string>;\n\nexport const addIcons = (icons: { [name: string]: string; }) => {\n const map = getIconMap();\n Object.keys(icons).forEach(name => map.set(name, icons[name]));\n}\n\nexport const getIconMap = (): Map<string, string> => {\n if (typeof window === 'undefined') {\n return new Map();\n } else {\n if (!CACHED_MAP) {\n const win = window as any; // eslint-disable-line @typescript-eslint/no-explicit-any\n win.PdsIcons = win.PdsIcons || {};\n CACHED_MAP = win.PdsIcons.map = win.PdsIcons.map || new Map();\n }\n\n return CACHED_MAP;\n }\n}\n\nexport const getName = (\n iconName: string | undefined,\n icon: string | undefined\n ) => {\n\n if(!iconName && icon && !isSrc(icon)) {\n iconName = icon;\n }\n\n if (isStr(iconName)) {\n iconName = toLower(iconName);\n }\n\n if (!isStr(iconName) || iconName.trim() === '') {\n return null;\n }\n\n const invalidChars = iconName.replace(/[a-z]|-|\\d/gi,'');\n if (invalidChars != '') { return null; }\n\n return iconName;\n}\n\nconst getNamedUrl = (iconName: string) => {\n const url = getIconMap().get(iconName);\n if (url) {\n return url;\n }\n\n return getAssetPath(`svg/${iconName}.svg`);\n};\n\nexport const getSrc = (src: string | undefined) => {\n if (isStr(src)) {\n src = src.trim();\n\n if (isSrc(src)) {\n return src;\n }\n }\n\n return null;\n}\n\nexport const getUrl = (pdsIcon: PdsIcon) => {\n let url = getSrc(pdsIcon.src);\n if (url) {\n return url;\n }\n\n url = getName(pdsIcon.name, pdsIcon.icon);\n if (url) {\n return getNamedUrl(url);\n }\n\n if (pdsIcon.icon) {\n url = getSrc(pdsIcon.icon);\n\n if(url) {\n return url;\n }\n }\n\n return null;\n};\n\n\nexport const isSrc = (str: string) => str.length > 0 && /(\\/|\\.)/.test(str);\nexport const isStr = (val: any): val is string => typeof val === 'string'; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport const toLower = (val: string) => val.toLowerCase();\n\n/**\n * Elements inside of web components sometimes need to inherit global attributes\n * set on the host. For example, the inner input in `ion-input` should inherit\n * the `title` attribute that developers set directly on `ion-input`. This\n * helper function should be called in componentWillLoad and assigned to a variable\n * that is later used in the render function.\n *\n * This does not need to be reactive as changing attributes on the host element\n * does not trigger a re-render.\n */\n export const inheritAttributes = (el: HTMLElement, attributes: string[] = []) => {\n const attributeObject: { [k: string]: any } = {}; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n attributes.forEach(attr => {\n if (el.hasAttribute(attr)) {\n const value = el.getAttribute(attr);\n if (value !== null) {\n attributeObject[attr] = el.getAttribute(attr);\n }\n el.removeAttribute(attr);\n }\n });\n\n return attributeObject;\n}\n"],"version":3}
|
package/dist/cheatsheet.html
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<html>
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8">
|
|
5
|
-
<title>Pine icons 3.3.
|
|
5
|
+
<title>Pine icons 3.3.1-rc.0 Cheatsheet</title>
|
|
6
6
|
<style>
|
|
7
7
|
body {
|
|
8
8
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
</style>
|
|
34
34
|
</head>
|
|
35
35
|
<body>
|
|
36
|
-
<h1>Pine Icons 3.3.
|
|
36
|
+
<h1>Pine Icons 3.3.1-rc.0 Cheatsheet</h1>
|
|
37
37
|
<h3>271 icons</h3>
|
|
38
38
|
|
|
39
39
|
<a href="./svg/access-key.svg"><svg><use href="#access-key" xlink:href="#access-key"/></svg></a>
|
|
@@ -307,7 +307,7 @@
|
|
|
307
307
|
<a href="./svg/world.svg"><svg><use href="#world" xlink:href="#world"/></svg></a>
|
|
308
308
|
<a href="./svg/wrench.svg"><svg><use href="#wrench" xlink:href="#wrench"/></svg></a>
|
|
309
309
|
<a href="./svg/youtube.svg"><svg><use href="#youtube" xlink:href="#youtube"/></svg></a>
|
|
310
|
-
<svg data-pdsicons="3.3.
|
|
310
|
+
<svg data-pdsicons="3.3.1-rc.0" style="display:none">
|
|
311
311
|
<style>
|
|
312
312
|
.pdsicon {
|
|
313
313
|
fill: currentColor;
|
|
@@ -348,7 +348,7 @@
|
|
|
348
348
|
<symbol id="bank" viewBox="0 0 16 16" class="pdsicon"><path fill-rule="evenodd" d="M15.602 4.41 8.348.435a.634.634 0 0 0-.596 0L.497 4.41c-.398.1-.497.397-.497.596v1.988a.68.68 0 0 0 .696.695h14.608c.298 0 .597-.298.597-.695V5.006c0-.199-.1-.497-.299-.596ZM1.292 6.298v-.894L7.95 1.826l6.659 3.578v.894H1.292Zm1.391 6.659V8.98a.68.68 0 0 0-.695-.695.68.68 0 0 0-.696.695v3.976a.68.68 0 0 0 .696.695.68.68 0 0 0 .695-.695ZM6.658 8.98v3.976a.68.68 0 0 1-.695.695.68.68 0 0 1-.696-.695V8.98a.68.68 0 0 1 .696-.695.68.68 0 0 1 .695.695Zm3.975 3.976V8.98a.68.68 0 0 0-.695-.695.68.68 0 0 0-.696.695v3.976a.68.68 0 0 0 .696.695.68.68 0 0 0 .695-.695ZM14.61 8.98v3.976a.68.68 0 0 1-.696.695.68.68 0 0 1-.696-.695V8.98a.68.68 0 0 1 .696-.695.68.68 0 0 1 .696.695ZM.696 14.248a.68.68 0 0 0-.696.696.68.68 0 0 0 .696.696h14.608a.68.68 0 0 0 .696-.696c0-.397-.398-.696-.795-.696H.695Zm7.95-9.937a.696.696 0 1 1-1.391 0 .696.696 0 0 1 1.39 0Z"/></symbol>
|
|
349
349
|
<symbol id="bell" viewBox="0 0 16 16" class="pdsicon"><path fill-rule="evenodd" d="M8 0a5.333 5.333 0 0 0-5.333 5.333v2c0 .857-.372 1.386-.834 1.91l-.173.192a7.698 7.698 0 0 0-.557.66c-.231.325-.436.73-.436 1.238 0 .566.329 1.006.725 1.316.396.31.934.555 1.553.746C4.189 13.78 5.929 14 8 14c2.071 0 3.81-.22 5.055-.605.62-.191 1.157-.436 1.553-.746.396-.31.725-.75.725-1.316 0-.508-.205-.913-.436-1.237-.161-.225-.371-.457-.557-.661l-.174-.193c-.461-.523-.833-1.052-.833-1.909v-2A5.333 5.333 0 0 0 8 0ZM5.172 2.505A4 4 0 0 1 12 5.333v2c0 1.344.629 2.181 1.167 2.791.086.099.165.185.237.264.165.182.296.326.408.483.143.2.188.337.188.462 0 .003.002.097-.214.266-.218.171-.585.356-1.125.522-1.072.332-2.666.546-4.661.546-1.995 0-3.59-.214-4.661-.546-.54-.166-.907-.351-1.125-.522-.216-.17-.214-.263-.214-.266 0-.125.045-.261.188-.462.112-.157.243-.3.408-.482.072-.08.15-.166.237-.265C3.371 9.514 4 8.677 4 7.334v-2a4 4 0 0 1 1.172-2.83ZM6.097 14.6c.596.044 1.229.067 1.903.067.674 0 1.307-.023 1.903-.067a1.995 1.995 0 0 1-3.806 0Z"/></symbol>
|
|
350
350
|
<symbol id="blog" viewBox="0 0 16 16" class="pdsicon"><path fill-rule="evenodd" d="M14.667 0H1.333v16h13.334V0Zm-12 14.667V1.333h10.666v13.334H2.667Zm9.333-12H4V8h8V2.667Zm-6.667 4V4h5.334v2.667H5.333ZM4 9.333h8v1.334H4V9.333ZM12 12H4v1.333h8V12Z"/></symbol>
|
|
351
|
-
<symbol id="blog-filled" viewBox="0 0 16 16" class="pdsicon"><path d="
|
|
351
|
+
<symbol id="blog-filled" viewBox="0 0 16 16" class="pdsicon"><path d="M14 0H2a.667.667 0 0 0-.667.667v14.666c0 .368.299.667.667.667h12a.667.667 0 0 0 .667-.667V.667A.667.667 0 0 0 14 0Zm-2 13c0 .184-.15.333-.333.333H4.333A.333.333 0 0 1 4 13v-.667c0-.184.15-.333.333-.333h7.334c.184 0 .333.15.333.333V13Zm0-3.333c0 .184-.15.333-.333.333H4.333A.333.333 0 0 1 4 9.667V9c0-.184.15-.333.333-.333h7.334c.184 0 .333.149.333.333v.667Zm0-3.334c0 .184-.15.334-.333.334H4.333A.333.333 0 0 1 4 6.333V3c0-.184.15-.333.333-.333h7.334c.184 0 .333.149.333.333v3.333Z"/></symbol>
|
|
352
352
|
<symbol id="bold" viewBox="0 0 16 16" class="pdsicon"><path fill-rule="evenodd" d="M1.333.667C1.333.298 1.632 0 2 0h7.333A4 4 0 0 1 11.9 7.07 4.668 4.668 0 0 1 10 16H2a.667.667 0 0 1 0-1.333h.667V1.333H2a.667.667 0 0 1-.667-.666Zm2.667 6h5.333a2.667 2.667 0 1 0 0-5.334H4v5.334ZM4 8v6.667h6A3.333 3.333 0 0 0 10 8H4Z"/></symbol>
|
|
353
353
|
<symbol id="broadcast" viewBox="0 0 16 16" class="pdsicon"><path fill-rule="evenodd" d="M11.056 1.46a.667.667 0 0 1 .277.54v10.667a.667.667 0 0 1-.877.632l-3.123-1.04V14a.667.667 0 0 1-.85.641l-4.666-1.333a.667.667 0 0 1-.484-.641v-2.409l-.877-.292A.667.667 0 0 1 0 9.333v-4c0-.287.184-.541.456-.632l10-3.333a.667.667 0 0 1 .6.091Zm-4.193 9.236a.76.76 0 0 1 .03.01L10 11.742V2.925L1.333 5.814v3.039l5.53 1.843ZM6 13.116v-1.302l-3.333-1.111v1.46L6 13.117Zm8-6.45A.667.667 0 1 0 14 8h1.333a.667.667 0 1 0 0-1.333H14Zm.908-3.337a.667.667 0 0 1-.237.912l-1.133.667a.667.667 0 1 1-.676-1.15l1.133-.666a.667.667 0 0 1 .913.237Zm-1.37 6.43a.667.667 0 1 0-.676 1.149l1.133.667a.667.667 0 1 0 .676-1.15l-1.133-.666Z"/></symbol>
|
|
354
354
|
<symbol id="calendar-date" viewBox="0 0 16 16" class="pdsicon"><path d="M3.333 7.667a.667.667 0 0 0-.666.666V9c0 .368.298.667.666.667h1.334A.667.667 0 0 0 5.333 9v-.667a.667.667 0 0 0-.666-.666H3.333ZM7.333 7.667a.667.667 0 0 0-.666.666V9c0 .368.298.667.666.667h1.334A.667.667 0 0 0 9.333 9v-.667a.667.667 0 0 0-.666-.666H7.333ZM2.667 11.667c0-.368.298-.667.666-.667h1.334c.368 0 .666.299.666.667v.666a.667.667 0 0 1-.666.667H3.333a.667.667 0 0 1-.666-.667v-.666ZM7.333 11a.667.667 0 0 0-.666.667v.666c0 .368.298.667.666.667h1.334a.667.667 0 0 0 .666-.667v-.666A.667.667 0 0 0 8.667 11H7.333ZM10.667 8.333c0-.368.298-.666.666-.666h1.334c.368 0 .666.298.666.666V9a.667.667 0 0 1-.666.667h-1.334A.667.667 0 0 1 10.667 9v-.667Z"/><path fill-rule="evenodd" d="M12 1a.667.667 0 0 0-1.333 0v1.333H5.333V1A.667.667 0 1 0 4 1v1.333H.667A.667.667 0 0 0 0 3v12c0 .368.298.667.667.667h14.666A.667.667 0 0 0 16 15V3a.667.667 0 0 0-.667-.667H12V1Zm2.667 4V3.667H1.333V5h13.334ZM1.333 6.333h13.334v8H1.333v-8Z"/></symbol>
|
package/dist/cjs/index.cjs.js
CHANGED
package/dist/cjs/loader.cjs.js
CHANGED
|
@@ -6,7 +6,7 @@ const index = require('./index-17212f65.js');
|
|
|
6
6
|
|
|
7
7
|
const defineCustomElements = (win, options) => {
|
|
8
8
|
if (typeof window === 'undefined') return undefined;
|
|
9
|
-
return index.bootstrapLazy([["pds-icon.cjs",[[1,"pds-icon",{"color":[1],"icon":[8],"name":[513],"size":[513],"ariaLabel":[32],"isVisible":[32],"svgContent":[32]},null,{"name":["loadIcon"],"icon":["loadIcon"]}]]]], options);
|
|
9
|
+
return index.bootstrapLazy([["pds-icon.cjs",[[1,"pds-icon",{"color":[1],"icon":[8],"name":[513],"size":[513],"src":[1],"ariaLabel":[32],"isVisible":[32],"svgContent":[32]},null,{"name":["loadIcon"],"src":["loadIcon"],"icon":["loadIcon"]}]]]], options);
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
exports.setNonce = index.setNonce;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
const index = require('./index-17212f65.js');
|
|
6
|
-
const utils = require('./utils-
|
|
6
|
+
const utils = require('./utils-66fa4942.js');
|
|
7
7
|
|
|
8
8
|
const validateContent = (svgContent) => {
|
|
9
9
|
const div = document.createElement('div');
|
|
@@ -18,7 +18,7 @@ const validateContent = (svgContent) => {
|
|
|
18
18
|
const svgElm = div.firstElementChild;
|
|
19
19
|
if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {
|
|
20
20
|
const svgClass = svgElm.getAttribute('class') || '';
|
|
21
|
-
svgElm.setAttribute('class', (svgClass + ' s-
|
|
21
|
+
svgElm.setAttribute('class', (svgClass + ' s-pds-icon').trim());
|
|
22
22
|
// root element must be an svg
|
|
23
23
|
// lets double check we've got valid elements
|
|
24
24
|
// do not allow scripts
|
|
@@ -47,26 +47,42 @@ const isValid = (elm) => {
|
|
|
47
47
|
}
|
|
48
48
|
return true;
|
|
49
49
|
};
|
|
50
|
+
const isSvgDataUrl = (url) => url.startsWith('data:image/svg+xml');
|
|
51
|
+
const isEncodedDataUrl = (url) => url.indexOf(';utf8,') !== -1;
|
|
50
52
|
|
|
51
53
|
const pdsIconContent = new Map();
|
|
52
54
|
const requests = new Map(); // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
55
|
+
let parser;
|
|
53
56
|
const getSvgContent = (url, sanitize = false) => {
|
|
54
57
|
let req = requests.get(url);
|
|
55
58
|
if (!req) {
|
|
56
59
|
if (typeof fetch != 'undefined' && typeof document !== 'undefined') {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return rsp.text().then((svgContent) => {
|
|
61
|
-
if (svgContent && sanitize !== false) {
|
|
62
|
-
svgContent = validateContent(svgContent);
|
|
63
|
-
}
|
|
64
|
-
pdsIconContent.set(url, svgContent || '');
|
|
65
|
-
});
|
|
60
|
+
if (isSvgDataUrl(url) && isEncodedDataUrl(url)) {
|
|
61
|
+
if (!parser) {
|
|
62
|
+
parser = new DOMParser();
|
|
66
63
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
const doc = parser.parseFromString(url, 'text/html');
|
|
65
|
+
const svg = doc.querySelector('svg');
|
|
66
|
+
if (svg) {
|
|
67
|
+
pdsIconContent.set(url, svg.outerHTML);
|
|
68
|
+
}
|
|
69
|
+
return Promise.resolve();
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// we don't have a request
|
|
73
|
+
req = fetch(url).then((rsp) => {
|
|
74
|
+
if (rsp.ok) {
|
|
75
|
+
return rsp.text().then((svgContent) => {
|
|
76
|
+
if (svgContent && sanitize !== false) {
|
|
77
|
+
svgContent = validateContent(svgContent);
|
|
78
|
+
}
|
|
79
|
+
pdsIconContent.set(url, svgContent || '');
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
pdsIconContent.set(url, '');
|
|
83
|
+
});
|
|
84
|
+
requests.set(url, req);
|
|
85
|
+
}
|
|
70
86
|
}
|
|
71
87
|
else {
|
|
72
88
|
pdsIconContent.set(url, '');
|
|
@@ -93,6 +109,7 @@ const PdsIcon = class {
|
|
|
93
109
|
this.icon = undefined;
|
|
94
110
|
this.name = undefined;
|
|
95
111
|
this.size = 'regular';
|
|
112
|
+
this.src = undefined;
|
|
96
113
|
}
|
|
97
114
|
iconSize() {
|
|
98
115
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -174,6 +191,7 @@ const PdsIcon = class {
|
|
|
174
191
|
get el() { return index.getElement(this); }
|
|
175
192
|
static get watchers() { return {
|
|
176
193
|
"name": ["loadIcon"],
|
|
194
|
+
"src": ["loadIcon"],
|
|
177
195
|
"icon": ["loadIcon"]
|
|
178
196
|
}; }
|
|
179
197
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"pds-icon.entry.cjs.js","mappings":"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","names":["isStr","inheritAttributes","getUrl","getName","h","Host"],"sources":["src/components/pds-icon/validate.ts","src/components/pds-icon/request.ts","src/components/pds-icon/pds-icon.scss?tag=pds-icon&encapsulation=shadow","src/components/pds-icon/pds-icon.tsx"],"sourcesContent":["import { isStr } from './utils';\n\nexport const validateContent = (svgContent: string) => {\n const div = document.createElement('div');\n div.innerHTML = svgContent;\n\n // setup this way to ensure it works on our buddy IE\n for (let i = div.childNodes.length - 1; i >= 0; i--) {\n if (div.childNodes[i].nodeName.toLowerCase() !== 'svg') {\n div.removeChild(div.childNodes[i]);\n }\n }\n\n // must only have 1 root element\n const svgElm = div.firstElementChild;\n if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {\n const svgClass = svgElm.getAttribute('class') || '';\n svgElm.setAttribute('class', (svgClass + ' s-ion-icon').trim());\n\n // root element must be an svg\n // lets double check we've got valid elements\n // do not allow scripts\n if (isValid(svgElm as HTMLElement)) {\n return div.innerHTML;\n }\n }\n return '';\n};\n\nexport const isValid = (elm: HTMLElement) => {\n if (elm.nodeType === 1) {\n if (elm.nodeName.toLowerCase() === 'script') {\n return false;\n }\n\n for (let i = 0; i < elm.attributes.length; i++) {\n const name = elm.attributes[i].name;\n if (isStr(name) && name.toLowerCase().indexOf('on') === 0) {\n return false;\n }\n }\n\n for (let i = 0; i < elm.childNodes.length; i++) {\n if (!isValid(elm.childNodes[i] as HTMLElement)) {\n return false;\n }\n }\n }\n return true;\n};\n","import { validateContent } from './validate';\n\nexport const pdsIconContent = new Map<string, string>();\nconst requests = new Map<string, Promise<any>>(); // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport const getSvgContent = (url: string, sanitize = false) => {\n let req = requests.get(url);\n\n if(!req) {\n if (typeof fetch != 'undefined' && typeof document !== 'undefined') {\n // we don't have a request\n req = fetch(url).then((rsp) => {\n if (rsp.ok) {\n return rsp.text().then((svgContent) => {\n if (svgContent && sanitize !== false) {\n svgContent = validateContent(svgContent);\n }\n pdsIconContent.set(url, svgContent || '');\n });\n }\n pdsIconContent.set(url, '');\n });\n\n requests.set(url, req);\n } else {\n pdsIconContent.set(url, '');\n return Promise.resolve();\n }\n }\n return req;\n}\n",":host {\n contain: strict;\n display: inline-block;\n fill: currentColor;\n height: 1em;\n width: 1em;\n\n .pdsicon {\n fill: currentColor;\n }\n}\n\n.pds-icon-fill-none {\n fill: none;\n}\n\n.icon-inner,\n.pds-icon,\nsvg {\n display: block;\n height: 100%;\n width: 100%;\n}\n","import { Build, Component, Element, Host, Prop, State, Watch, h } from '@stencil/core';\nimport { getSvgContent, pdsIconContent } from './request';\nimport { getName, getUrl, inheritAttributes } from './utils';\n\n@Component({\n tag: 'pds-icon',\n assetsDirs: ['svg'],\n styleUrl: 'pds-icon.scss',\n shadow: true,\n})\nexport class PdsIcon {\n private io?: IntersectionObserver;\n private inheritedAttributes: { [k: string]: any } = {}; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n @Element() el!: HTMLPdsIconElement;\n\n @State() private ariaLabel?: string;\n @State() private isVisible = false;\n @State() private svgContent?: string;\n\n /**\n *\n * The color of the icon\n *\n */\n @Prop() color?: string;\n\n /**\n * This a combination of both `name` and `src`. If a `src` url is detected\n * it will set the `src` property. Otherwise it assumes it's a built-in named\n * SVG and set the `name` property.\n */\n @Prop() icon?: any;\n\n /**\n * The name of the icon to use from\n * the built-in set.\n */\n @Prop({ reflect: true }) name?: string;\n\n /**\n * The size of the icon. This can be\n * 'small', 'regular', 'medium', large, or a\n * custom value (40px, 1rem, etc)\n *\n */\n @Prop({ reflect: true }) size?:\n | 'small' // 12px\n | 'regular' // 16px\n | 'medium' // 20px\n | 'large' // 24px\n | 'auto'\n | string = 'regular'\n\n private iconSize() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sizes: { [key: string]: any } = {\n small: '12px',\n regular: '16px',\n medium: '20px',\n large: '24px',\n }\n\n if (sizes[this.size]) {\n return sizes[this.size];\n } else {\n return this.size;\n }\n }\n componentWillLoad() {\n this.inheritedAttributes = inheritAttributes(this.el, ['aria-label']);\n }\n\n connectedCallback() {\n this.waitUntilVisible(this.el, '50px', () => {\n this.isVisible = true;\n this.loadIcon();\n })\n }\n\n disconnectedCallback() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n }\n\n @Watch('name')\n @Watch('icon')\n loadIcon() {\n if (Build.isBrowser && this.isVisible) {\n const url = getUrl(this);\n if (url) {\n if (pdsIconContent.has(url)) {\n this.svgContent = pdsIconContent.get(url);\n } else {\n getSvgContent(url).then(() => (this.svgContent = pdsIconContent.get(url)));\n }\n }\n }\n\n const label = getName(this.name, this.icon);\n\n if (label) {\n this.ariaLabel = label.replace(/\\-/g, ' ');\n }\n }\n\n render() {\n const { ariaLabel, inheritedAttributes } = this;\n\n const style = {\n height: this.iconSize(),\n width: this.iconSize(),\n color: this.color,\n }\n\n return (\n\n <Host\n aria-label={ariaLabel !== undefined && !this.hasAriaHidden() ? ariaLabel : null }\n role=\"img\"\n style={style}\n class={{\n ...createColorClasses(this.color),\n }}\n {...inheritedAttributes}\n >\n {Build.isBrowser && this.svgContent ? (\n <div class=\"icon-inner\" innerHTML={this.svgContent}></div>\n ) : (\n <div class=\"icon-inner\"></div>\n )}\n </Host>\n )\n }\n\n /*****\n * Private Methods\n ****/\n\n private waitUntilVisible(el: HTMLElement, rootMargin: string, cb: () => void) {\n if (Build.isBrowser && typeof window !== 'undefined' && (window).IntersectionObserver) {\n const io = (this.io = new (window).IntersectionObserver(\n (data: IntersectionObserverEntry[]) => {\n if (data[0].isIntersecting) {\n io.disconnect();\n this.io = undefined;\n cb();\n }\n },\n { rootMargin },\n ));\n\n io.observe(el);\n } else {\n // browser doesn't support IntersectionObserver\n // so just fallback to always show it\n cb();\n }\n }\n\n private hasAriaHidden = () => {\n const { el } = this;\n\n return el.hasAttribute('aria-hidden') && el.getAttribute('aria-hidden') === 'true';\n }\n}\n\nconst createColorClasses = (color: string | undefined) => {\n return color\n ? {\n 'pds-color': true,\n [`pds-color-${color}`]: true,\n }\n : null;\n };\n"],"version":3}
|
|
1
|
+
{"file":"pds-icon.entry.cjs.js","mappings":"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","names":["isStr","inheritAttributes","getUrl","getName","h","Host"],"sources":["src/components/pds-icon/validate.ts","src/components/pds-icon/request.ts","src/components/pds-icon/pds-icon.scss?tag=pds-icon&encapsulation=shadow","src/components/pds-icon/pds-icon.tsx"],"sourcesContent":["import { isStr } from './utils';\n\nexport const validateContent = (svgContent: string) => {\n const div = document.createElement('div');\n div.innerHTML = svgContent;\n\n // setup this way to ensure it works on our buddy IE\n for (let i = div.childNodes.length - 1; i >= 0; i--) {\n if (div.childNodes[i].nodeName.toLowerCase() !== 'svg') {\n div.removeChild(div.childNodes[i]);\n }\n }\n\n // must only have 1 root element\n const svgElm = div.firstElementChild;\n if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {\n const svgClass = svgElm.getAttribute('class') || '';\n svgElm.setAttribute('class', (svgClass + ' s-pds-icon').trim());\n\n // root element must be an svg\n // lets double check we've got valid elements\n // do not allow scripts\n if (isValid(svgElm as HTMLElement)) {\n return div.innerHTML;\n }\n }\n return '';\n};\n\nexport const isValid = (elm: HTMLElement) => {\n if (elm.nodeType === 1) {\n if (elm.nodeName.toLowerCase() === 'script') {\n return false;\n }\n\n for (let i = 0; i < elm.attributes.length; i++) {\n const name = elm.attributes[i].name;\n if (isStr(name) && name.toLowerCase().indexOf('on') === 0) {\n return false;\n }\n }\n\n for (let i = 0; i < elm.childNodes.length; i++) {\n if (!isValid(elm.childNodes[i] as HTMLElement)) {\n return false;\n }\n }\n }\n return true;\n};\n\nexport const isSvgDataUrl = (url: string) => url.startsWith('data:image/svg+xml');\nexport const isEncodedDataUrl = (url: string) => url.indexOf(';utf8,') !== -1;\n","import { isEncodedDataUrl, isSvgDataUrl, validateContent } from './validate';\n\nexport const pdsIconContent = new Map<string, string>();\nconst requests = new Map<string, Promise<any>>(); // eslint-disable-line @typescript-eslint/no-explicit-any\n\nlet parser: DOMParser;\n\nexport const getSvgContent = (url: string, sanitize = false) => {\n let req = requests.get(url);\n\n if(!req) {\n if (typeof fetch != 'undefined' && typeof document !== 'undefined') {\n if (isSvgDataUrl(url) && isEncodedDataUrl(url)) {\n if (!parser) {\n parser = new DOMParser();\n }\n\n const doc = parser.parseFromString(url, 'text/html');\n const svg = doc.querySelector('svg');\n\n if (svg) {\n pdsIconContent.set(url, svg.outerHTML);\n }\n\n return Promise.resolve();\n } else {\n // we don't have a request\n req = fetch(url).then((rsp) => {\n if (rsp.ok) {\n return rsp.text().then((svgContent) => {\n if (svgContent && sanitize !== false) {\n svgContent = validateContent(svgContent);\n }\n pdsIconContent.set(url, svgContent || '');\n });\n }\n pdsIconContent.set(url, '');\n });\n\n requests.set(url, req);\n }\n } else {\n pdsIconContent.set(url, '');\n return Promise.resolve();\n }\n }\n\n return req;\n}\n",":host {\n contain: strict;\n display: inline-block;\n fill: currentColor;\n height: 1em;\n width: 1em;\n\n .pdsicon {\n fill: currentColor;\n }\n}\n\n.pds-icon-fill-none {\n fill: none;\n}\n\n.icon-inner,\n.pds-icon,\nsvg {\n display: block;\n height: 100%;\n width: 100%;\n}\n","import { Build, Component, Element, Host, Prop, State, Watch, h } from '@stencil/core';\nimport { getSvgContent, pdsIconContent } from './request';\nimport { getName, getUrl, inheritAttributes } from './utils';\n\n@Component({\n tag: 'pds-icon',\n assetsDirs: ['svg'],\n styleUrl: 'pds-icon.scss',\n shadow: true,\n})\nexport class PdsIcon {\n private io?: IntersectionObserver;\n private inheritedAttributes: { [k: string]: any } = {}; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n @Element() el!: HTMLPdsIconElement;\n\n @State() private ariaLabel?: string;\n @State() private isVisible = false;\n @State() private svgContent?: string;\n\n /**\n *\n * The color of the icon\n *\n */\n @Prop() color?: string;\n\n /**\n * This a combination of both `name` and `src`. If a `src` url is detected\n * it will set the `src` property. Otherwise it assumes it's a built-in named\n * SVG and set the `name` property.\n */\n @Prop() icon?: any;\n\n /**\n * The name of the icon to use from\n * the built-in set.\n */\n @Prop({ reflect: true }) name?: string;\n\n /**\n * The size of the icon. This can be\n * 'small', 'regular', 'medium', large, or a\n * custom value (40px, 1rem, etc)\n *\n */\n @Prop({ reflect: true }) size?:\n | 'small' // 12px\n | 'regular' // 16px\n | 'medium' // 20px\n | 'large' // 24px\n | 'auto'\n | string = 'regular'\n\n /**\n *\n * Specifies the exact `src` of an SVG file to use.\n */\n @Prop() src?: string;\n\n private iconSize() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sizes: { [key: string]: any } = {\n small: '12px',\n regular: '16px',\n medium: '20px',\n large: '24px',\n }\n\n if (sizes[this.size]) {\n return sizes[this.size];\n } else {\n return this.size;\n }\n }\n componentWillLoad() {\n this.inheritedAttributes = inheritAttributes(this.el, ['aria-label']);\n }\n\n connectedCallback() {\n this.waitUntilVisible(this.el, '50px', () => {\n this.isVisible = true;\n this.loadIcon();\n })\n }\n\n disconnectedCallback() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n }\n\n @Watch('name')\n @Watch('src')\n @Watch('icon')\n loadIcon() {\n if (Build.isBrowser && this.isVisible) {\n const url = getUrl(this);\n if (url) {\n if (pdsIconContent.has(url)) {\n this.svgContent = pdsIconContent.get(url);\n } else {\n getSvgContent(url).then(() => (this.svgContent = pdsIconContent.get(url)));\n }\n }\n }\n\n const label = getName(this.name, this.icon);\n\n if (label) {\n this.ariaLabel = label.replace(/\\-/g, ' ');\n }\n }\n\n render() {\n const { ariaLabel, inheritedAttributes } = this;\n\n const style = {\n height: this.iconSize(),\n width: this.iconSize(),\n color: this.color,\n }\n\n return (\n\n <Host\n aria-label={ariaLabel !== undefined && !this.hasAriaHidden() ? ariaLabel : null }\n role=\"img\"\n style={style}\n class={{\n ...createColorClasses(this.color),\n }}\n {...inheritedAttributes}\n >\n {Build.isBrowser && this.svgContent ? (\n <div class=\"icon-inner\" innerHTML={this.svgContent}></div>\n ) : (\n <div class=\"icon-inner\"></div>\n )}\n </Host>\n )\n }\n\n /*****\n * Private Methods\n ****/\n\n private waitUntilVisible(el: HTMLElement, rootMargin: string, cb: () => void) {\n if (Build.isBrowser && typeof window !== 'undefined' && (window).IntersectionObserver) {\n const io = (this.io = new (window).IntersectionObserver(\n (data: IntersectionObserverEntry[]) => {\n if (data[0].isIntersecting) {\n io.disconnect();\n this.io = undefined;\n cb();\n }\n },\n { rootMargin },\n ));\n\n io.observe(el);\n } else {\n // browser doesn't support IntersectionObserver\n // so just fallback to always show it\n cb();\n }\n }\n\n private hasAriaHidden = () => {\n const { el } = this;\n\n return el.hasAttribute('aria-hidden') && el.getAttribute('aria-hidden') === 'true';\n }\n}\n\nconst createColorClasses = (color: string | undefined) => {\n return color\n ? {\n 'pds-color': true,\n [`pds-color-${color}`]: true,\n }\n : null;\n };\n"],"version":3}
|
|
@@ -17,7 +17,7 @@ const patchBrowser = () => {
|
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
patchBrowser().then(options => {
|
|
20
|
-
return index.bootstrapLazy([["pds-icon.cjs",[[1,"pds-icon",{"color":[1],"icon":[8],"name":[513],"size":[513],"ariaLabel":[32],"isVisible":[32],"svgContent":[32]},null,{"name":["loadIcon"],"icon":["loadIcon"]}]]]], options);
|
|
20
|
+
return index.bootstrapLazy([["pds-icon.cjs",[[1,"pds-icon",{"color":[1],"icon":[8],"name":[513],"size":[513],"src":[1],"ariaLabel":[32],"isVisible":[32],"svgContent":[32]},null,{"name":["loadIcon"],"src":["loadIcon"],"icon":["loadIcon"]}]]]], options);
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
exports.setNonce = index.setNonce;
|
|
@@ -53,7 +53,11 @@ const getSrc = (src) => {
|
|
|
53
53
|
return null;
|
|
54
54
|
};
|
|
55
55
|
const getUrl = (pdsIcon) => {
|
|
56
|
-
let url =
|
|
56
|
+
let url = getSrc(pdsIcon.src);
|
|
57
|
+
if (url) {
|
|
58
|
+
return url;
|
|
59
|
+
}
|
|
60
|
+
url = getName(pdsIcon.name, pdsIcon.icon);
|
|
57
61
|
if (url) {
|
|
58
62
|
return getNamedUrl(url);
|
|
59
63
|
}
|
|
@@ -98,4 +102,4 @@ exports.getUrl = getUrl;
|
|
|
98
102
|
exports.inheritAttributes = inheritAttributes;
|
|
99
103
|
exports.isStr = isStr;
|
|
100
104
|
|
|
101
|
-
//# sourceMappingURL=utils-
|
|
105
|
+
//# sourceMappingURL=utils-66fa4942.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"file":"utils-66fa4942.js","mappings":"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","names":["getAssetPath"],"sources":["src/components/pds-icon/utils.ts"],"sourcesContent":["import { getAssetPath } from '@stencil/core';\nimport { PdsIcon } from './pds-icon';\n\nlet CACHED_MAP: Map<string, string>;\n\nexport const addIcons = (icons: { [name: string]: string; }) => {\n const map = getIconMap();\n Object.keys(icons).forEach(name => map.set(name, icons[name]));\n}\n\nexport const getIconMap = (): Map<string, string> => {\n if (typeof window === 'undefined') {\n return new Map();\n } else {\n if (!CACHED_MAP) {\n const win = window as any; // eslint-disable-line @typescript-eslint/no-explicit-any\n win.PdsIcons = win.PdsIcons || {};\n CACHED_MAP = win.PdsIcons.map = win.PdsIcons.map || new Map();\n }\n\n return CACHED_MAP;\n }\n}\n\nexport const getName = (\n iconName: string | undefined,\n icon: string | undefined\n ) => {\n\n if(!iconName && icon && !isSrc(icon)) {\n iconName = icon;\n }\n\n if (isStr(iconName)) {\n iconName = toLower(iconName);\n }\n\n if (!isStr(iconName) || iconName.trim() === '') {\n return null;\n }\n\n const invalidChars = iconName.replace(/[a-z]|-|\\d/gi,'');\n if (invalidChars != '') { return null; }\n\n return iconName;\n}\n\nconst getNamedUrl = (iconName: string) => {\n const url = getIconMap().get(iconName);\n if (url) {\n return url;\n }\n\n return getAssetPath(`svg/${iconName}.svg`);\n};\n\nexport const getSrc = (src: string | undefined) => {\n if (isStr(src)) {\n src = src.trim();\n\n if (isSrc(src)) {\n return src;\n }\n }\n\n return null;\n}\n\nexport const getUrl = (pdsIcon: PdsIcon) => {\n let url = getSrc(pdsIcon.src);\n if (url) {\n return url;\n }\n\n url = getName(pdsIcon.name, pdsIcon.icon);\n if (url) {\n return getNamedUrl(url);\n }\n\n if (pdsIcon.icon) {\n url = getSrc(pdsIcon.icon);\n\n if(url) {\n return url;\n }\n }\n\n return null;\n};\n\n\nexport const isSrc = (str: string) => str.length > 0 && /(\\/|\\.)/.test(str);\nexport const isStr = (val: any): val is string => typeof val === 'string'; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport const toLower = (val: string) => val.toLowerCase();\n\n/**\n * Elements inside of web components sometimes need to inherit global attributes\n * set on the host. For example, the inner input in `ion-input` should inherit\n * the `title` attribute that developers set directly on `ion-input`. This\n * helper function should be called in componentWillLoad and assigned to a variable\n * that is later used in the render function.\n *\n * This does not need to be reactive as changing attributes on the host element\n * does not trigger a re-render.\n */\n export const inheritAttributes = (el: HTMLElement, attributes: string[] = []) => {\n const attributeObject: { [k: string]: any } = {}; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n attributes.forEach(attr => {\n if (el.hasAttribute(attr)) {\n const value = el.getAttribute(attr);\n if (value !== null) {\n attributeObject[attr] = el.getAttribute(attr);\n }\n el.removeAttribute(attr);\n }\n });\n\n return attributeObject;\n}\n"],"version":3}
|
|
@@ -15,6 +15,7 @@ export class PdsIcon {
|
|
|
15
15
|
this.icon = undefined;
|
|
16
16
|
this.name = undefined;
|
|
17
17
|
this.size = 'regular';
|
|
18
|
+
this.src = undefined;
|
|
18
19
|
}
|
|
19
20
|
iconSize() {
|
|
20
21
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -175,6 +176,23 @@ export class PdsIcon {
|
|
|
175
176
|
"attribute": "size",
|
|
176
177
|
"reflect": true,
|
|
177
178
|
"defaultValue": "'regular'"
|
|
179
|
+
},
|
|
180
|
+
"src": {
|
|
181
|
+
"type": "string",
|
|
182
|
+
"mutable": false,
|
|
183
|
+
"complexType": {
|
|
184
|
+
"original": "string",
|
|
185
|
+
"resolved": "string",
|
|
186
|
+
"references": {}
|
|
187
|
+
},
|
|
188
|
+
"required": false,
|
|
189
|
+
"optional": true,
|
|
190
|
+
"docs": {
|
|
191
|
+
"tags": [],
|
|
192
|
+
"text": "\nSpecifies the exact `src` of an SVG file to use."
|
|
193
|
+
},
|
|
194
|
+
"attribute": "src",
|
|
195
|
+
"reflect": false
|
|
178
196
|
}
|
|
179
197
|
};
|
|
180
198
|
}
|
|
@@ -190,6 +208,9 @@ export class PdsIcon {
|
|
|
190
208
|
return [{
|
|
191
209
|
"propName": "name",
|
|
192
210
|
"methodName": "loadIcon"
|
|
211
|
+
}, {
|
|
212
|
+
"propName": "src",
|
|
213
|
+
"methodName": "loadIcon"
|
|
193
214
|
}, {
|
|
194
215
|
"propName": "icon",
|
|
195
216
|
"methodName": "loadIcon"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pds-icon.js","sourceRoot":"","sources":["../../../src/components/pds-icon/pds-icon.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAQ7D,MAAM,OAAO,OAAO;;QAEV,wBAAmB,GAAyB,EAAE,CAAC,CAAC,yDAAyD;
|
|
1
|
+
{"version":3,"file":"pds-icon.js","sourceRoot":"","sources":["../../../src/components/pds-icon/pds-icon.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Build, Component, Element, Host, Prop, State, Watch, h } from '@stencil/core';\nimport { getSvgContent, pdsIconContent } from './request';\nimport { getName, getUrl, inheritAttributes } from './utils';\n\n@Component({\n tag: 'pds-icon',\n assetsDirs: ['svg'],\n styleUrl: 'pds-icon.scss',\n shadow: true,\n})\nexport class PdsIcon {\n private io?: IntersectionObserver;\n private inheritedAttributes: { [k: string]: any } = {}; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n @Element() el!: HTMLPdsIconElement;\n\n @State() private ariaLabel?: string;\n @State() private isVisible = false;\n @State() private svgContent?: string;\n\n /**\n *\n * The color of the icon\n *\n */\n @Prop() color?: string;\n\n /**\n * This a combination of both `name` and `src`. If a `src` url is detected\n * it will set the `src` property. Otherwise it assumes it's a built-in named\n * SVG and set the `name` property.\n */\n @Prop() icon?: any;\n\n /**\n * The name of the icon to use from\n * the built-in set.\n */\n @Prop({ reflect: true }) name?: string;\n\n /**\n * The size of the icon. This can be\n * 'small', 'regular', 'medium', large, or a\n * custom value (40px, 1rem, etc)\n *\n */\n @Prop({ reflect: true }) size?:\n | 'small' // 12px\n | 'regular' // 16px\n | 'medium' // 20px\n | 'large' // 24px\n | 'auto'\n | string = 'regular'\n\n /**\n *\n * Specifies the exact `src` of an SVG file to use.\n */\n @Prop() src?: string;\n\n private iconSize() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sizes: { [key: string]: any } = {\n small: '12px',\n regular: '16px',\n medium: '20px',\n large: '24px',\n }\n\n if (sizes[this.size]) {\n return sizes[this.size];\n } else {\n return this.size;\n }\n }\n componentWillLoad() {\n this.inheritedAttributes = inheritAttributes(this.el, ['aria-label']);\n }\n\n connectedCallback() {\n this.waitUntilVisible(this.el, '50px', () => {\n this.isVisible = true;\n this.loadIcon();\n })\n }\n\n disconnectedCallback() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n }\n\n @Watch('name')\n @Watch('src')\n @Watch('icon')\n loadIcon() {\n if (Build.isBrowser && this.isVisible) {\n const url = getUrl(this);\n if (url) {\n if (pdsIconContent.has(url)) {\n this.svgContent = pdsIconContent.get(url);\n } else {\n getSvgContent(url).then(() => (this.svgContent = pdsIconContent.get(url)));\n }\n }\n }\n\n const label = getName(this.name, this.icon);\n\n if (label) {\n this.ariaLabel = label.replace(/\\-/g, ' ');\n }\n }\n\n render() {\n const { ariaLabel, inheritedAttributes } = this;\n\n const style = {\n height: this.iconSize(),\n width: this.iconSize(),\n color: this.color,\n }\n\n return (\n\n <Host\n aria-label={ariaLabel !== undefined && !this.hasAriaHidden() ? ariaLabel : null }\n role=\"img\"\n style={style}\n class={{\n ...createColorClasses(this.color),\n }}\n {...inheritedAttributes}\n >\n {Build.isBrowser && this.svgContent ? (\n <div class=\"icon-inner\" innerHTML={this.svgContent}></div>\n ) : (\n <div class=\"icon-inner\"></div>\n )}\n </Host>\n )\n }\n\n /*****\n * Private Methods\n ****/\n\n private waitUntilVisible(el: HTMLElement, rootMargin: string, cb: () => void) {\n if (Build.isBrowser && typeof window !== 'undefined' && (window).IntersectionObserver) {\n const io = (this.io = new (window).IntersectionObserver(\n (data: IntersectionObserverEntry[]) => {\n if (data[0].isIntersecting) {\n io.disconnect();\n this.io = undefined;\n cb();\n }\n },\n { rootMargin },\n ));\n\n io.observe(el);\n } else {\n // browser doesn't support IntersectionObserver\n // so just fallback to always show it\n cb();\n }\n }\n\n private hasAriaHidden = () => {\n const { el } = this;\n\n return el.hasAttribute('aria-hidden') && el.getAttribute('aria-hidden') === 'true';\n }\n}\n\nconst createColorClasses = (color: string | undefined) => {\n return color\n ? {\n 'pds-color': true,\n [`pds-color-${color}`]: true,\n }\n : null;\n };\n"]}
|
|
@@ -1,23 +1,37 @@
|
|
|
1
|
-
import { validateContent } from "./validate";
|
|
1
|
+
import { isEncodedDataUrl, isSvgDataUrl, validateContent } from "./validate";
|
|
2
2
|
export const pdsIconContent = new Map();
|
|
3
3
|
const requests = new Map(); // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
4
|
+
let parser;
|
|
4
5
|
export const getSvgContent = (url, sanitize = false) => {
|
|
5
6
|
let req = requests.get(url);
|
|
6
7
|
if (!req) {
|
|
7
8
|
if (typeof fetch != 'undefined' && typeof document !== 'undefined') {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return rsp.text().then((svgContent) => {
|
|
12
|
-
if (svgContent && sanitize !== false) {
|
|
13
|
-
svgContent = validateContent(svgContent);
|
|
14
|
-
}
|
|
15
|
-
pdsIconContent.set(url, svgContent || '');
|
|
16
|
-
});
|
|
9
|
+
if (isSvgDataUrl(url) && isEncodedDataUrl(url)) {
|
|
10
|
+
if (!parser) {
|
|
11
|
+
parser = new DOMParser();
|
|
17
12
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
const doc = parser.parseFromString(url, 'text/html');
|
|
14
|
+
const svg = doc.querySelector('svg');
|
|
15
|
+
if (svg) {
|
|
16
|
+
pdsIconContent.set(url, svg.outerHTML);
|
|
17
|
+
}
|
|
18
|
+
return Promise.resolve();
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
// we don't have a request
|
|
22
|
+
req = fetch(url).then((rsp) => {
|
|
23
|
+
if (rsp.ok) {
|
|
24
|
+
return rsp.text().then((svgContent) => {
|
|
25
|
+
if (svgContent && sanitize !== false) {
|
|
26
|
+
svgContent = validateContent(svgContent);
|
|
27
|
+
}
|
|
28
|
+
pdsIconContent.set(url, svgContent || '');
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
pdsIconContent.set(url, '');
|
|
32
|
+
});
|
|
33
|
+
requests.set(url, req);
|
|
34
|
+
}
|
|
21
35
|
}
|
|
22
36
|
else {
|
|
23
37
|
pdsIconContent.set(url, '');
|