@siratik/wp-component-library 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/LICENSE +5 -0
  2. package/README.md +51 -5
  3. package/components/attachment-image/README.md +118 -0
  4. package/components/attachment-image/index.js +105 -0
  5. package/components/attributes-panel/README.md +92 -0
  6. package/components/attributes-panel/index.js +324 -0
  7. package/components/badge/README.md +61 -0
  8. package/components/badge/index.js +105 -0
  9. package/components/block-appender/README.md +158 -0
  10. package/components/block-appender/index.js +135 -0
  11. package/components/block-extension/index.js +214 -0
  12. package/components/business-hours/SpecialHoursControl.js +211 -0
  13. package/components/business-hours/WeeklyHoursControl.js +419 -0
  14. package/components/business-hours/index.js +8 -0
  15. package/components/button/README.md +172 -0
  16. package/components/button/index.js +84 -0
  17. package/components/captcha-placeholder/CloudflareTurnstile.js +111 -0
  18. package/components/captcha-placeholder/GoogleRecaptcha.js +132 -0
  19. package/components/captcha-placeholder/HCaptcha.js +99 -0
  20. package/components/captcha-placeholder/README.md +228 -0
  21. package/components/captcha-placeholder/index.js +39 -0
  22. package/components/captcha-placeholder/styles.js +33 -0
  23. package/components/geocoder/AddressEntryControl.js +390 -0
  24. package/components/geocoder/GeocoderSearchControl.js +353 -0
  25. package/components/geocoder/countryOptions.js +66 -0
  26. package/components/geocoder/geocoder.js +400 -0
  27. package/components/geocoder/index.js +16 -0
  28. package/components/icon-picker/Icon.js +53 -0
  29. package/components/icon-picker/IconPicker.js +70 -0
  30. package/components/icon-picker/IconPickerModal.js +474 -0
  31. package/components/icon-picker/IconPickerToolbarButton.js +60 -0
  32. package/components/icon-picker/InlineIconPicker.js +92 -0
  33. package/components/icon-picker/api.js +181 -0
  34. package/components/icon-picker/config-bootstrap.js +108 -0
  35. package/components/icon-picker/hooks.js +157 -0
  36. package/components/icon-picker/index.js +39 -0
  37. package/components/icon-picker/load-script.js +33 -0
  38. package/components/icon-picker/loaders.js +79 -0
  39. package/components/icon-picker/store.js +223 -0
  40. package/components/icon-picker/styles.js +232 -0
  41. package/components/icon-picker/utils.js +138 -0
  42. package/components/layout/README.md +268 -0
  43. package/components/link-tools-panel/README.md +49 -0
  44. package/components/link-tools-panel/index.js +198 -0
  45. package/components/link-tools-panel/styles.js +90 -0
  46. package/components/media/README.md +288 -0
  47. package/components/media/SettingsMediaUpload.js +187 -0
  48. package/components/media/editor-media-upload.js +65 -0
  49. package/components/media/image-controls.js +196 -0
  50. package/components/media/index.js +13 -0
  51. package/components/media/inspector-media-upload.js +290 -0
  52. package/components/media/toolbar-media-upload.js +53 -0
  53. package/components/media/utils/aspect-ratios.js +118 -0
  54. package/components/meta/MetaPanel.js +75 -0
  55. package/components/meta/README.md +46 -0
  56. package/components/meta/index.js +6 -0
  57. package/components/meta/meta-gated-editor.js +282 -0
  58. package/components/query/README.md +340 -0
  59. package/components/query/cardTemplatePartPanel.js +69 -0
  60. package/components/query/cardTemplatePartSelect.js +165 -0
  61. package/components/query/cardTemplatePartUtils.js +119 -0
  62. package/components/query/columnCountControl.js +63 -0
  63. package/components/query/displayTypeSelect.js +52 -0
  64. package/components/query/examples.js +166 -0
  65. package/components/query/hideCurrentPostControl.js +47 -0
  66. package/components/query/index.js +20 -0
  67. package/components/query/manualPostSelector.js +125 -0
  68. package/components/query/manualTermSelector.js +141 -0
  69. package/components/query/orderBySelect.js +95 -0
  70. package/components/query/postTypeSelect.js +67 -0
  71. package/components/query/postsPerPageControl.js +51 -0
  72. package/components/query/selectionModeControl.js +61 -0
  73. package/components/query/taxonomySelect.js +139 -0
  74. package/components/query/utils.js +75 -0
  75. package/components/repeater/README.md +159 -0
  76. package/components/repeater/index.js +829 -0
  77. package/components/segmented-bar/README.md +30 -0
  78. package/components/segmented-bar/index.js +68 -0
  79. package/components/sortable-select/README.md +153 -0
  80. package/components/sortable-select/custom-sortable-token.js +127 -0
  81. package/components/sortable-select/index.js +693 -0
  82. package/components/style-picker/README.md +36 -0
  83. package/components/style-picker/index.js +92 -0
  84. package/components/variable-field/README.md +299 -0
  85. package/components/variable-field/index.js +592 -0
  86. package/components/variable-field/value-to-chip-html.js +38 -0
  87. package/components/variable-inserter/README.md +68 -0
  88. package/components/variable-inserter/index.js +168 -0
  89. package/constants/statusColors.js +16 -6
  90. package/editor.js +16 -0
  91. package/index.js +127 -0
  92. package/package.json +27 -16
  93. package/utils/kitaris-localize.js +128 -0
  94. package/utils/slug-aware-color-setter.js +27 -0
  95. package/build/index.asset.php +0 -20
  96. package/build/index.js +0 -1233
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Icon Registry API
3
+ *
4
+ * Public functions for registering and removing icon sets.
5
+ * These are the functions blocks/themes call to populate the picker.
6
+ */
7
+
8
+ import { dispatch, select } from "@wordpress/data";
9
+
10
+ import {
11
+ clearIconSetLoader,
12
+ clearInFlightLoad,
13
+ getIconSetLoader,
14
+ getInFlightLoad,
15
+ setIconSetLoader,
16
+ setInFlightLoad,
17
+ } from "./loaders";
18
+ import { STORE_NAME } from "./store";
19
+
20
+ /**
21
+ * Normalize lazy loader return value to an icon array.
22
+ *
23
+ * @param {Array|{ icons: Array }|*} result
24
+ * @returns {Array}
25
+ */
26
+ function normalizeLoaderResult(result) {
27
+ if (Array.isArray(result)) {
28
+ return result;
29
+ }
30
+
31
+ if (result?.icons && Array.isArray(result.icons)) {
32
+ return result.icons;
33
+ }
34
+
35
+ if (result?.default && Array.isArray(result.default)) {
36
+ return result.default;
37
+ }
38
+
39
+ return [];
40
+ }
41
+
42
+ /**
43
+ * Register an icon set with the picker.
44
+ *
45
+ * Pass `icons` for eager sets, or `load` for lazy sets loaded when the picker opens:
46
+ *
47
+ * @example
48
+ * registerIconSet({
49
+ * name: 'home-services',
50
+ * label: 'Home Services',
51
+ * priority: 120,
52
+ * load: () => import('./home-services.js').then((m) => m.homeServicesIcons),
53
+ * });
54
+ *
55
+ * @param {Object} iconSet
56
+ * @param {string} iconSet.name Unique identifier for this set (e.g. 'phosphor-icons').
57
+ * @param {string} iconSet.label Human-readable label shown as group heading.
58
+ * @param {Array} [iconSet.icons] Array of icon objects: { name, label, source }.
59
+ * @param {Function} [iconSet.load] Lazy loader returning icons (or a module with `.icons`).
60
+ * @param {number} [iconSet.priority=0] Higher priority sets appear first.
61
+ */
62
+ export function registerIconSet(iconSet) {
63
+ const { load, icons, ...rest } = iconSet;
64
+
65
+ if (typeof load === "function") {
66
+ setIconSetLoader(rest.name, load);
67
+
68
+ const previous = select(STORE_NAME)?.getIconSet?.(rest.name);
69
+ const libraryUrl = rest.libraryUrl ?? "";
70
+ const sameLibrary =
71
+ previous?.libraryUrl === libraryUrl && libraryUrl !== "";
72
+
73
+ dispatch(STORE_NAME).registerIconSet({
74
+ ...rest,
75
+ libraryUrl,
76
+ priority: rest.priority ?? 0,
77
+ icons:
78
+ icons ??
79
+ (sameLibrary && previous?.icons?.length ? previous.icons : []),
80
+ loadStatus:
81
+ sameLibrary && previous?.loadStatus === "loaded"
82
+ ? "loaded"
83
+ : "idle",
84
+ });
85
+ return;
86
+ }
87
+
88
+ clearIconSetLoader(rest.name);
89
+
90
+ dispatch(STORE_NAME).registerIconSet({
91
+ ...rest,
92
+ priority: rest.priority ?? 0,
93
+ icons: icons ?? [],
94
+ loadStatus: "loaded",
95
+ });
96
+ }
97
+
98
+ /**
99
+ * Alias matching the 10up @10up/block-components registerIcons signature.
100
+ *
101
+ * @deprecated Prefer registerIconSet(). Kept for legacy theme bundles.
102
+ */
103
+ export const registerIcons = registerIconSet;
104
+
105
+ /**
106
+ * Load a single lazy icon set by name.
107
+ *
108
+ * @param {string} name
109
+ * @returns {Promise<void>}
110
+ */
111
+ export async function loadIconSet(name) {
112
+ const store = select(STORE_NAME);
113
+ const set = store.getIconSet(name);
114
+
115
+ if (!set || set.loadStatus === "loaded") {
116
+ return;
117
+ }
118
+
119
+ const inFlight = getInFlightLoad(name);
120
+ if (inFlight) {
121
+ return inFlight;
122
+ }
123
+
124
+ const loader = getIconSetLoader(name);
125
+ if (!loader) {
126
+ dispatch(STORE_NAME).setIconSetError(
127
+ name,
128
+ "Icon set loader is not registered.",
129
+ );
130
+ return;
131
+ }
132
+
133
+ const loadPromise = (async () => {
134
+ dispatch(STORE_NAME).setIconSetLoading(name);
135
+
136
+ try {
137
+ const result = await loader();
138
+ const icons = normalizeLoaderResult(result);
139
+
140
+ dispatch(STORE_NAME).setIconSetIcons(name, icons);
141
+ clearIconSetLoader(name);
142
+ } catch (error) {
143
+ const message =
144
+ error instanceof Error ? error.message : String(error);
145
+ dispatch(STORE_NAME).setIconSetError(name, message);
146
+ throw error;
147
+ } finally {
148
+ clearInFlightLoad(name);
149
+ }
150
+ })();
151
+
152
+ setInFlightLoad(name, loadPromise);
153
+ return loadPromise;
154
+ }
155
+
156
+ /**
157
+ * Load every registered set that has not finished loading.
158
+ *
159
+ * @returns {Promise<void>}
160
+ */
161
+ export async function loadAllIconSets() {
162
+ const store = select(STORE_NAME);
163
+ const pending = store
164
+ .getIconSets()
165
+ .filter(
166
+ (set) => set.loadStatus === "idle" || set.loadStatus === "error",
167
+ )
168
+ .map((set) => set.name);
169
+
170
+ await Promise.all(pending.map((name) => loadIconSet(name)));
171
+ }
172
+
173
+ /**
174
+ * Remove a previously registered icon set by name.
175
+ *
176
+ * @param {string} name The set name to remove.
177
+ */
178
+ export function removeIconSet(name) {
179
+ clearIconSetLoader(name);
180
+ dispatch(STORE_NAME).removeIconSet(name);
181
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Register icon sets declared in editor_experience.icons (Kitaris localize).
3
+ *
4
+ * @module icon-picker/config-bootstrap
5
+ */
6
+
7
+ import { select } from "@wordpress/data";
8
+
9
+ import { registerIconSet } from "./api";
10
+ import { loadScript } from "./load-script";
11
+ import { STORE_NAME } from "./store";
12
+
13
+ /**
14
+ * Normalize lazy loader return value to an icon array.
15
+ *
16
+ * @param {Array|{ icons: Array }|*} result
17
+ * @returns {Array}
18
+ */
19
+ function normalizeLoaderResult(result) {
20
+ if (Array.isArray(result)) {
21
+ return result;
22
+ }
23
+
24
+ if (result?.icons && Array.isArray(result.icons)) {
25
+ return result.icons;
26
+ }
27
+
28
+ if (result?.default && Array.isArray(result.default)) {
29
+ return result.default;
30
+ }
31
+
32
+ return [];
33
+ }
34
+
35
+ /**
36
+ * Load icons from a theme-built library URL (IIFE bundle).
37
+ *
38
+ * @param {string} url
39
+ * @param {string} setName
40
+ * @returns {Promise<Array>}
41
+ */
42
+ async function loadIconsFromLibraryUrl(url, setName) {
43
+ if (typeof window !== "undefined" && window.wpcl?.iconSetExports?.[setName]) {
44
+ return window.wpcl.iconSetExports[setName];
45
+ }
46
+
47
+ await loadScript(url);
48
+
49
+ if (typeof window !== "undefined" && window.wpcl?.iconSetExports?.[setName]) {
50
+ return window.wpcl.iconSetExports[setName];
51
+ }
52
+
53
+ const store = select(STORE_NAME);
54
+ const set = store?.getIconSet?.(setName);
55
+
56
+ if (set?.icons?.length) {
57
+ return set.icons;
58
+ }
59
+
60
+ return [];
61
+ }
62
+
63
+ /**
64
+ * Register lazy icon sets from kitaris_localize editor_experience.icons config.
65
+ *
66
+ * Supports:
67
+ * - `sets[]` with `library_url` (resolved in PHP from directory + file)
68
+ * - Legacy top-level `library_url` (single register-icons.js bundle)
69
+ *
70
+ * @param {Object} [iconConfig]
71
+ */
72
+ export function registerConfigIconSets(iconConfig) {
73
+ if (!iconConfig || typeof iconConfig !== "object") {
74
+ return;
75
+ }
76
+
77
+ const sets = [];
78
+
79
+ if (Array.isArray(iconConfig.sets) && iconConfig.sets.length) {
80
+ sets.push(...iconConfig.sets);
81
+ } else if (iconConfig.library_url) {
82
+ sets.push({
83
+ name: iconConfig.set_name ?? "theme-icons",
84
+ label: iconConfig.set_label ?? "Theme Icons",
85
+ priority: iconConfig.priority ?? 100,
86
+ library_url: iconConfig.library_url,
87
+ });
88
+ }
89
+
90
+ sets.forEach((set) => {
91
+ if (!set?.name || !set.library_url) {
92
+ return;
93
+ }
94
+
95
+ const libraryUrl = set.library_url;
96
+
97
+ registerIconSet({
98
+ name: set.name,
99
+ label: set.label ?? set.name,
100
+ priority: set.priority ?? 0,
101
+ libraryUrl,
102
+ load: () =>
103
+ loadIconsFromLibraryUrl(libraryUrl, set.name).then(
104
+ (icons) => normalizeLoaderResult(icons),
105
+ ),
106
+ });
107
+ });
108
+ }
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Icon Registry Hooks
3
+ *
4
+ * React hooks for reading icon data from the icon registry store.
5
+ */
6
+
7
+ import { select as selectFromStore, useSelect } from "@wordpress/data";
8
+ import { useEffect, useMemo } from "@wordpress/element";
9
+
10
+ import { loadAllIconSets } from "./api";
11
+ import { STORE_NAME } from "./store";
12
+
13
+ /**
14
+ * Get all registered icon sets, sorted by priority.
15
+ *
16
+ * @returns {Array} Icon set objects in priority order.
17
+ */
18
+ export function useIconSets() {
19
+ return useSelect((select) => select(STORE_NAME).getIconSets(), []);
20
+ }
21
+
22
+ /**
23
+ * Get icons for all sets, each annotated with their `iconSet` name.
24
+ * Returns sets in priority order for grouped rendering in the picker UI.
25
+ *
26
+ * @returns {Array<{ name, label, priority, icons: Array }>}
27
+ */
28
+ export function useGroupedIcons() {
29
+ return useSelect((select) => {
30
+ const store = select(STORE_NAME);
31
+ return store.getIconSets().map((set) => ({
32
+ ...set,
33
+ icons: store.getIcons(set.name).map((icon) => ({
34
+ ...icon,
35
+ iconSet: set.name,
36
+ })),
37
+ }));
38
+ }, []);
39
+ }
40
+
41
+ /**
42
+ * Get a flat list of all icons across all sets, each annotated with `iconSet`.
43
+ * Useful for search across all sets.
44
+ *
45
+ * @returns {Array} Flat array of all icons.
46
+ */
47
+ export function useAllIcons() {
48
+ return useSelect((select) => {
49
+ const store = select(STORE_NAME);
50
+ return store.getIconSets().flatMap((set) =>
51
+ store.getIcons(set.name).map((icon) => ({
52
+ ...icon,
53
+ iconSet: set.name,
54
+ })),
55
+ );
56
+ }, []);
57
+ }
58
+
59
+ /**
60
+ * Get icons for a specific set, or all icons across all sets.
61
+ *
62
+ * Mirrors the 10up `useIcons(iconSetName)` hook signature.
63
+ * - No argument (or empty string): returns all icons flat, each with `iconSet`.
64
+ * - String argument: returns icons for that set only, each with `iconSet`.
65
+ *
66
+ * @param {string} [iconSetName] Optional set name to filter by.
67
+ * @returns {Array} Array of icon objects.
68
+ */
69
+ export function useIcons(iconSetName = "") {
70
+ return useSelect((select) => {
71
+ const store = select(STORE_NAME);
72
+ if (iconSetName) {
73
+ return store.getIcons(iconSetName).map((icon) => ({
74
+ ...icon,
75
+ iconSet: iconSetName,
76
+ }));
77
+ }
78
+ return store.getIconSets().flatMap((set) =>
79
+ store.getIcons(set.name).map((icon) => ({
80
+ ...icon,
81
+ iconSet: set.name,
82
+ })),
83
+ );
84
+ }, [iconSetName]);
85
+ }
86
+
87
+ /**
88
+ * Look up a single icon from the registry.
89
+ *
90
+ * @param {string} iconSetName
91
+ * @param {string} iconName
92
+ * @returns {Object|undefined}
93
+ */
94
+ export function useIcon(iconSetName, iconName) {
95
+ return useSelect(
96
+ (select) => select(STORE_NAME).getIcon(iconSetName, iconName),
97
+ [iconSetName, iconName],
98
+ );
99
+ }
100
+
101
+ /**
102
+ * Grouped icons for the picker modal — triggers lazy loading on mount.
103
+ *
104
+ * Groups are rebuilt only when a set changes (the store's sets map is
105
+ * replaced on every change), not on every store update.
106
+ *
107
+ * @returns {{ groups: Array, isLoading: boolean, isInitialLoad: boolean, hasPending: boolean }}
108
+ */
109
+ export function useIconPickerGroups() {
110
+ const setsMap = useSelect(
111
+ (select) => select(STORE_NAME).getIconSetsMap(),
112
+ [],
113
+ );
114
+
115
+ const groups = useMemo(() => {
116
+ const store = selectFromStore(STORE_NAME);
117
+ return store.getIconSets().map((set) => ({
118
+ ...set,
119
+ icons: store.getIcons(set.name).map((icon) => ({
120
+ ...icon,
121
+ iconSet: set.name,
122
+ })),
123
+ }));
124
+ // setsMap is the cache key: the store replaces it whenever a set changes.
125
+ // eslint-disable-next-line react-hooks/exhaustive-deps
126
+ }, [setsMap]);
127
+
128
+ const sets = Object.values(setsMap);
129
+ const isLoading = sets.some((set) => set.loadStatus === "loading");
130
+ const pendingSets = sets.filter(
131
+ (set) => set.loadStatus === "idle" || set.loadStatus === "loading",
132
+ );
133
+ const hasPending = pendingSets.length > 0;
134
+ const pendingKey = pendingSets.map((set) => set.name).join("\0");
135
+
136
+ useEffect(() => {
137
+ if (!pendingKey) {
138
+ return;
139
+ }
140
+
141
+ loadAllIconSets().catch(() => {
142
+ // Errors are stored on the set; picker shows empty/error state.
143
+ });
144
+ }, [pendingKey]);
145
+
146
+ const iconCount = groups.reduce(
147
+ (count, group) => count + group.icons.length,
148
+ 0,
149
+ );
150
+
151
+ return {
152
+ groups,
153
+ isLoading: hasPending || isLoading,
154
+ isInitialLoad: (hasPending || isLoading) && iconCount === 0,
155
+ hasPending,
156
+ };
157
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Icon Picker
3
+ *
4
+ * Registry + UI components for icon selection in the block editor.
5
+ * Replaces @10up/block-components icon APIs.
6
+ */
7
+
8
+ // Store (registers on import)
9
+ export { iconStore, STORE_NAME as ICON_STORE_NAME } from "./store";
10
+
11
+ // Registration API
12
+ export {
13
+ registerIconSet,
14
+ registerIcons,
15
+ removeIconSet,
16
+ loadIconSet,
17
+ loadAllIconSets,
18
+ } from "./api";
19
+ export { registerConfigIconSets } from "./config-bootstrap";
20
+
21
+ // SVG sanitizing for inline rendering
22
+ export { safeSvgSource } from "./utils";
23
+
24
+ // React hooks
25
+ export {
26
+ useIconSets,
27
+ useGroupedIcons,
28
+ useIconPickerGroups,
29
+ useAllIcons,
30
+ useIcons,
31
+ useIcon,
32
+ } from "./hooks";
33
+
34
+ // UI components
35
+ export { Icon } from "./Icon";
36
+ export { IconPicker } from "./IconPicker";
37
+ export { IconPickerModal } from "./IconPickerModal";
38
+ export { IconPickerToolbarButton } from "./IconPickerToolbarButton";
39
+ export { InlineIconPicker } from "./InlineIconPicker";
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Load a classic script URL (wp-scripts IIFE bundles) once.
3
+ *
4
+ * @param {string} url
5
+ * @returns {Promise<void>}
6
+ */
7
+ const scriptPromises = new Map();
8
+
9
+ export function loadScript(url) {
10
+ if (!url) {
11
+ return Promise.reject(new Error("Icon library URL is missing."));
12
+ }
13
+
14
+ const existing = scriptPromises.get(url);
15
+ if (existing) {
16
+ return existing;
17
+ }
18
+
19
+ const promise = new Promise((resolve, reject) => {
20
+ const script = document.createElement("script");
21
+ script.src = url;
22
+ script.async = true;
23
+ script.onload = () => resolve();
24
+ script.onerror = () => {
25
+ scriptPromises.delete(url);
26
+ reject(new Error(`Failed to load icon library: ${url}`));
27
+ };
28
+ document.head.appendChild(script);
29
+ });
30
+
31
+ scriptPromises.set(url, promise);
32
+ return promise;
33
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Lazy icon-set loaders live outside Redux state (functions are not serializable).
3
+ * Stored on window.wpcl so theme editor bundles and the picker share one registry.
4
+ *
5
+ * @module icon-picker/loaders
6
+ */
7
+
8
+ function getLoaderMap() {
9
+ if (typeof window !== "undefined") {
10
+ window.wpcl = window.wpcl || {};
11
+ if (!window.wpcl._iconSetLoaders) {
12
+ window.wpcl._iconSetLoaders = new Map();
13
+ }
14
+ return window.wpcl._iconSetLoaders;
15
+ }
16
+
17
+ return getLoaderMap.fallbackMap || (getLoaderMap.fallbackMap = new Map());
18
+ }
19
+
20
+ function getInFlightMap() {
21
+ if (typeof window !== "undefined") {
22
+ window.wpcl = window.wpcl || {};
23
+ if (!window.wpcl._iconSetLoadsInFlight) {
24
+ window.wpcl._iconSetLoadsInFlight = new Map();
25
+ }
26
+ return window.wpcl._iconSetLoadsInFlight;
27
+ }
28
+
29
+ return (
30
+ getInFlightMap.fallbackMap || (getInFlightMap.fallbackMap = new Map())
31
+ );
32
+ }
33
+
34
+ /**
35
+ * @param {string} name
36
+ * @param {() => Promise<Array>|Array} loader
37
+ */
38
+ export function setIconSetLoader(name, loader) {
39
+ getLoaderMap().set(name, loader);
40
+ }
41
+
42
+ /**
43
+ * @param {string} name
44
+ * @returns {(() => Promise<Array>|Array)|undefined}
45
+ */
46
+ export function getIconSetLoader(name) {
47
+ return getLoaderMap().get(name);
48
+ }
49
+
50
+ /**
51
+ * @param {string} name
52
+ */
53
+ export function clearIconSetLoader(name) {
54
+ getLoaderMap().delete(name);
55
+ getInFlightMap().delete(name);
56
+ }
57
+
58
+ /**
59
+ * @param {string} name
60
+ * @param {Promise<void>} promise
61
+ */
62
+ export function setInFlightLoad(name, promise) {
63
+ getInFlightMap().set(name, promise);
64
+ }
65
+
66
+ /**
67
+ * @param {string} name
68
+ * @returns {Promise<void>|undefined}
69
+ */
70
+ export function getInFlightLoad(name) {
71
+ return getInFlightMap().get(name);
72
+ }
73
+
74
+ /**
75
+ * @param {string} name
76
+ */
77
+ export function clearInFlightLoad(name) {
78
+ getInFlightMap().delete(name);
79
+ }