@elevasis/ui 2.31.0 → 2.33.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.
Files changed (169) hide show
  1. package/dist/{CoreAuthKitInner-KSEGSB67.js → CoreAuthKitInner-QC62UHTZ.js} +1 -1
  2. package/dist/api/index.js +3 -3
  3. package/dist/app/index.css +38 -0
  4. package/dist/app/index.d.ts +69 -9
  5. package/dist/app/index.js +7 -6
  6. package/dist/auth/context.js +1 -1
  7. package/dist/auth/index.js +1 -1
  8. package/dist/charts/index.js +5 -6
  9. package/dist/{chunk-JKSUN5GN.js → chunk-2GMF5IRF.js} +81 -746
  10. package/dist/{chunk-XQHZBA65.js → chunk-2RJMVWFJ.js} +1 -6
  11. package/dist/{chunk-CW3UNAF2.js → chunk-4DYOXEH6.js} +410 -5
  12. package/dist/{chunk-HQGF4ATG.js → chunk-52NLZN6Z.js} +118 -141
  13. package/dist/chunk-AHCKOU2M.js +13 -0
  14. package/dist/chunk-CLDCYJQT.js +1 -0
  15. package/dist/chunk-DWXDNT7P.js +145 -0
  16. package/dist/chunk-E4T2N7P7.js +124 -0
  17. package/dist/{chunk-HYNYEBHM.js → chunk-E7C4XEWH.js} +3 -3
  18. package/dist/{chunk-L3BVJWML.js → chunk-EPTHX4VZ.js} +1 -1
  19. package/dist/{chunk-QDEETKYT.js → chunk-FFPHJBJC.js} +9 -9
  20. package/dist/chunk-GNRMB6DC.js +5126 -0
  21. package/dist/{chunk-DZTG5IAC.js → chunk-I2KLQ2HA.js} +1 -7
  22. package/dist/{chunk-Q6OYNEGR.js → chunk-IUKFNASA.js} +5 -6
  23. package/dist/{chunk-QHEWXU7I.js → chunk-JFL3GRD4.js} +1 -1
  24. package/dist/{chunk-T3IPHEYJ.js → chunk-JHT5JIJ3.js} +4410 -566
  25. package/dist/{chunk-L2NVFLXU.js → chunk-MHLZ4F4N.js} +4 -4
  26. package/dist/{chunk-XQQEKWTL.js → chunk-N55DVMAG.js} +6 -2
  27. package/dist/{chunk-TOIXUWR6.js → chunk-ND5TDV2J.js} +1 -1
  28. package/dist/{chunk-5LJAEZMA.js → chunk-NOIRGGW2.js} +5 -6
  29. package/dist/{chunk-7KC4P3AU.js → chunk-QNOVUCSV.js} +2 -12
  30. package/dist/{chunk-3BAPR3KA.js → chunk-RQA2EVN3.js} +5 -15
  31. package/dist/{chunk-ND42LPY4.js → chunk-TKF5S4XP.js} +6 -6
  32. package/dist/{chunk-DWK2QIAK.js → chunk-TYRUKGGD.js} +1 -1
  33. package/dist/{chunk-Y4FWCG7Y.js → chunk-UVFOURXR.js} +8 -7
  34. package/dist/chunk-UW7IV2Y3.js +447 -0
  35. package/dist/{chunk-P55BJZZW.js → chunk-V6SZ4ECN.js} +20 -5
  36. package/dist/{chunk-6YT4IKJ7.js → chunk-VNAZTCHA.js} +15 -0
  37. package/dist/chunk-XG57WXOL.js +85 -0
  38. package/dist/{chunk-SHQXMW4F.js → chunk-XOFSMJLF.js} +46 -28
  39. package/dist/{chunk-7HMCB26R.js → chunk-XZGSCABI.js} +1 -1
  40. package/dist/chunk-YAQ25UNM.js +2126 -0
  41. package/dist/chunk-ZGTDKH3P.js +467 -0
  42. package/dist/components/chat/index.js +1 -1
  43. package/dist/components/index.css +38 -0
  44. package/dist/components/index.d.ts +262 -51
  45. package/dist/components/index.js +37 -39
  46. package/dist/components/navigation/index.css +38 -0
  47. package/dist/components/navigation/index.js +5 -3
  48. package/dist/execution/index.d.ts +11 -2
  49. package/dist/execution/index.js +1 -1
  50. package/dist/features/auth/index.css +38 -0
  51. package/dist/features/auth/index.d.ts +91 -14
  52. package/dist/features/auth/index.js +42 -10
  53. package/dist/features/clients/index.css +38 -0
  54. package/dist/features/clients/index.d.ts +1 -1
  55. package/dist/features/clients/index.js +17 -15
  56. package/dist/features/crm/index.css +38 -0
  57. package/dist/features/crm/index.d.ts +80 -18
  58. package/dist/features/crm/index.js +17 -15
  59. package/dist/features/dashboard/index.css +38 -0
  60. package/dist/features/dashboard/index.d.ts +174 -25
  61. package/dist/features/dashboard/index.js +17 -16
  62. package/dist/features/delivery/index.css +38 -0
  63. package/dist/features/delivery/index.d.ts +80 -18
  64. package/dist/features/delivery/index.js +16 -15
  65. package/dist/features/knowledge/index.css +38 -0
  66. package/dist/features/knowledge/index.d.ts +20 -18
  67. package/dist/features/knowledge/index.js +114 -609
  68. package/dist/features/lead-gen/index.css +38 -0
  69. package/dist/features/lead-gen/index.d.ts +45 -43
  70. package/dist/features/lead-gen/index.js +17 -16
  71. package/dist/features/monitoring/index.css +38 -0
  72. package/dist/features/monitoring/index.d.ts +20 -18
  73. package/dist/features/monitoring/index.js +18 -17
  74. package/dist/features/monitoring/requests/index.css +38 -0
  75. package/dist/features/monitoring/requests/index.d.ts +23 -21
  76. package/dist/features/monitoring/requests/index.js +16 -14
  77. package/dist/features/operations/index.css +38 -0
  78. package/dist/features/operations/index.d.ts +1299 -66
  79. package/dist/features/operations/index.js +22 -24
  80. package/dist/features/seo/index.d.ts +20 -18
  81. package/dist/features/seo/index.js +2 -2
  82. package/dist/features/settings/index.css +38 -0
  83. package/dist/features/settings/index.d.ts +80 -18
  84. package/dist/features/settings/index.js +17 -15
  85. package/dist/graph/index.js +1 -1
  86. package/dist/hooks/delivery/index.css +38 -0
  87. package/dist/hooks/delivery/index.d.ts +60 -0
  88. package/dist/hooks/delivery/index.js +3 -3
  89. package/dist/hooks/index.css +38 -0
  90. package/dist/hooks/index.d.ts +492 -89
  91. package/dist/hooks/index.js +15 -13
  92. package/dist/hooks/operations/command-view/utils/transformCommandViewData.d.ts +332 -33
  93. package/dist/hooks/operations/command-view/utils/transformCommandViewData.js +1 -1
  94. package/dist/hooks/published.css +38 -0
  95. package/dist/hooks/published.d.ts +492 -89
  96. package/dist/hooks/published.js +15 -13
  97. package/dist/index.css +38 -0
  98. package/dist/index.d.ts +1353 -1349
  99. package/dist/index.js +16 -14
  100. package/dist/initialization/index.d.ts +60 -0
  101. package/dist/initialization/index.js +1 -1
  102. package/dist/knowledge/index.d.ts +1217 -1292
  103. package/dist/knowledge/index.js +6538 -2198
  104. package/dist/knowledge-search-index-P7PR626V.js +1514 -0
  105. package/dist/layout/index.js +3 -4
  106. package/dist/organization/index.css +38 -0
  107. package/dist/organization/index.js +1 -1
  108. package/dist/profile/index.d.ts +60 -0
  109. package/dist/profile/index.js +1 -1
  110. package/dist/provider/ElevasisServiceContext.js +1 -1
  111. package/dist/provider/index.css +38 -0
  112. package/dist/provider/index.d.ts +1068 -1246
  113. package/dist/provider/index.js +12 -10
  114. package/dist/provider/published.css +38 -0
  115. package/dist/provider/published.d.ts +1065 -1243
  116. package/dist/provider/published.js +9 -7
  117. package/dist/router/context.js +1 -1
  118. package/dist/router/index.js +1 -1
  119. package/dist/sse/index.js +1 -1
  120. package/dist/supabase/index.d.ts +117 -0
  121. package/dist/supabase/index.js +1 -1
  122. package/dist/test-utils/index.d.ts +16 -9
  123. package/dist/test-utils/index.js +40 -33
  124. package/dist/test-utils/setup-integration.js +1 -1
  125. package/dist/test-utils/setup.js +1 -1
  126. package/dist/theme/index.js +3 -3
  127. package/dist/theme/presets/index.js +1 -1
  128. package/dist/typeform/index.js +1 -1
  129. package/dist/typeform/schemas.js +1 -1
  130. package/dist/types/index.d.ts +394 -35
  131. package/dist/utils/index.d.ts +174 -25
  132. package/dist/utils/index.js +2 -2
  133. package/dist/vite/index.js +1 -1
  134. package/dist/vite-plugin-knowledge/index.js +1 -1
  135. package/dist/zustand/index.js +1 -1
  136. package/package.json +10 -9
  137. package/src/README.md +29 -29
  138. package/src/api/README.md +18 -18
  139. package/src/app/README.md +24 -24
  140. package/src/auth/README.md +18 -18
  141. package/src/components/README.md +24 -24
  142. package/src/execution/README.md +16 -16
  143. package/src/features/README.md +28 -28
  144. package/src/graph/README.md +16 -16
  145. package/src/hooks/README.md +23 -23
  146. package/src/initialization/README.md +19 -19
  147. package/src/knowledge/README.md +31 -31
  148. package/src/organization/README.md +18 -18
  149. package/src/profile/README.md +19 -19
  150. package/src/provider/README.md +32 -32
  151. package/src/router/README.md +18 -18
  152. package/src/sse/README.md +13 -13
  153. package/src/test-utils/README.md +7 -7
  154. package/src/theme/README.md +23 -23
  155. package/src/theme/presets/README.md +19 -19
  156. package/src/types/README.md +16 -16
  157. package/src/utils/README.md +18 -18
  158. package/src/zustand/README.md +18 -18
  159. package/dist/chunk-542WPQU2.js +0 -413
  160. package/dist/chunk-6IXOKUBC.js +0 -347
  161. package/dist/chunk-CQZ3DNQY.js +0 -740
  162. package/dist/chunk-ECNNI3NT.js +0 -6
  163. package/dist/chunk-GRDLB6LM.js +0 -160
  164. package/dist/chunk-JDNEWB5F.js +0 -10
  165. package/dist/chunk-MVFCLZSK.js +0 -4337
  166. package/dist/chunk-O2QOPJI5.js +0 -2235
  167. package/dist/chunk-OAVTMITG.js +0 -13
  168. package/dist/chunk-TVRQ6AQI.js +0 -476
  169. package/dist/chunk-WF227UBV.js +0 -48
@@ -1,347 +0,0 @@
1
- import { useInitialization } from './chunk-533DUEQY.js';
2
- import { useOrganization } from './chunk-DD3CCMCZ.js';
3
- import { createContext, useMemo, useCallback, useContext } from 'react';
4
- import { jsx } from 'react/jsx-runtime';
5
-
6
- function createFeatureAccessHook({
7
- useInitialization: useInitialization2,
8
- useOrganization: useOrganization2
9
- }) {
10
- return function useFeatureAccess2() {
11
- const { profile, organizationReady } = useInitialization2();
12
- const { currentMembership } = useOrganization2();
13
- const { orgConfig, membershipConfig } = useMemo(() => {
14
- const organizationConfig = currentMembership?.organization?.config;
15
- const memberConfig = currentMembership?.config;
16
- return { orgConfig: organizationConfig, membershipConfig: memberConfig };
17
- }, [currentMembership]);
18
- const userConfig = profile?.config;
19
- const checkFeature = useCallback(
20
- (featureKey) => {
21
- if (profile?.is_platform_admin) {
22
- return { allowed: true, restrictedBy: null };
23
- }
24
- const membershipValue = membershipConfig?.features?.[featureKey];
25
- if (membershipValue === false) return { allowed: false, restrictedBy: "membership" };
26
- return { allowed: true, restrictedBy: null };
27
- },
28
- [profile?.is_platform_admin, membershipConfig]
29
- );
30
- const hasFeature = useCallback((featureKey) => checkFeature(featureKey).allowed, [checkFeature]);
31
- return {
32
- orgConfig,
33
- membershipConfig,
34
- userConfig,
35
- hasFeature,
36
- checkFeature,
37
- isReady: organizationReady
38
- };
39
- };
40
- }
41
-
42
- // ../core/src/organization-model/helpers.ts
43
- function defaultPathFor(id) {
44
- return `/${id.replaceAll(".", "/")}`;
45
- }
46
- function parentIdOf(id) {
47
- const index = id.lastIndexOf(".");
48
- return index === -1 ? void 0 : id.slice(0, index);
49
- }
50
- function findById(features, id) {
51
- return features.find((feature) => feature.id === id);
52
- }
53
- function findByPath(features, path) {
54
- return features.find((feature) => (feature.path ?? defaultPathFor(feature.id)) === path);
55
- }
56
- function childrenOf(features, id) {
57
- const prefix = `${id}.`;
58
- return features.filter((feature) => feature.id.startsWith(prefix) && !feature.id.slice(prefix.length).includes("."));
59
- }
60
- function topLevel(features) {
61
- return features.filter((feature) => !feature.id.includes("."));
62
- }
63
- function ancestorsOf(features, id) {
64
- const segments = id.split(".");
65
- const ids = segments.map((_, index) => segments.slice(0, index + 1).join("."));
66
- return ids.map((ancestorId) => findById(features, ancestorId)).filter((feature) => Boolean(feature));
67
- }
68
- function parentOf(features, id) {
69
- const parentId = parentIdOf(id);
70
- return parentId ? findById(features, parentId) : void 0;
71
- }
72
- function inheritedValue(features, id, getValue) {
73
- return ancestorsOf(features, id).slice().reverse().map(getValue).find((value) => value !== void 0);
74
- }
75
- function uiPositionFor(features, id) {
76
- return inheritedValue(features, id, (feature) => feature.uiPosition);
77
- }
78
- function requiresAdminFor(features, id) {
79
- return inheritedValue(features, id, (feature) => feature.requiresAdmin) ?? false;
80
- }
81
- function devOnlyFor(features, id) {
82
- return inheritedValue(features, id, (feature) => feature.devOnly) ?? false;
83
- }
84
-
85
- // src/provider/resolvers/RouteResolver.ts
86
- function normalizeRoutePath(path) {
87
- const trimmedPath = path.trim();
88
- if (!trimmedPath || trimmedPath === "/") {
89
- return "/";
90
- }
91
- return trimmedPath.replace(/\/+$/, "") || "/";
92
- }
93
- function isRouteMatch(currentPath, route) {
94
- const normalizedCurrentPath = normalizeRoutePath(currentPath);
95
- const normalizedRoute = normalizeRoutePath(route);
96
- return normalizedCurrentPath === normalizedRoute || normalizedCurrentPath.startsWith(`${normalizedRoute}/`);
97
- }
98
-
99
- // src/provider/resolvers/NavResolver.ts
100
- function uniqueIds(ids) {
101
- return ids ? [...new Set(ids)] : [];
102
- }
103
-
104
- // src/provider/validateManifests.ts
105
- function validateManifests(manifests, organizationModel) {
106
- if (!organizationModel) {
107
- return;
108
- }
109
- const validFeatureIds = new Set((organizationModel.features ?? []).map((f) => f.id));
110
- const errors = [];
111
- for (const manifest of manifests) {
112
- const key = manifest.key;
113
- if (!validFeatureIds.has(manifest.featureId)) {
114
- errors.push(
115
- `Manifest "${key}": featureId "${manifest.featureId}" is not a known feature id. Valid values: ${[...validFeatureIds].sort().join(", ")}`
116
- );
117
- }
118
- }
119
- if (errors.length > 0) {
120
- throw new Error(
121
- `Feature manifest validation failed with ${errors.length} error(s):
122
- ` + errors.map((e, i) => ` ${i + 1}. ${e}`).join("\n")
123
- );
124
- }
125
- }
126
- var ElevasisFeaturesContext = createContext(null);
127
- var useFeatureAccess = createFeatureAccessHook({
128
- useInitialization,
129
- useOrganization
130
- });
131
- function useElevasisFeatures() {
132
- const context = useContext(ElevasisFeaturesContext);
133
- if (!context) {
134
- throw new Error(
135
- "useElevasisFeatures must be used within an ElevasisFeaturesProvider. Wrap your app (or the relevant subtree) with <ElevasisFeaturesProvider>."
136
- );
137
- }
138
- return context;
139
- }
140
- function useOptionalElevasisFeatures() {
141
- return useContext(ElevasisFeaturesContext);
142
- }
143
- function defaultFeatures(organizationModel) {
144
- return organizationModel?.features ?? [];
145
- }
146
- function featurePath(feature) {
147
- return feature.path ?? defaultPathFor(feature.id);
148
- }
149
- function isOrganizationModelFeatureEnabled(organizationModel, featureId) {
150
- const feature = organizationModel?.features.find((f) => f.id === featureId);
151
- return feature?.enabled;
152
- }
153
- function resolveFeatureModules(features, isFeatureEnabled) {
154
- return features.map((feature) => {
155
- const featureId = feature.featureId;
156
- return {
157
- ...feature,
158
- access: {
159
- featureId,
160
- enabled: isFeatureEnabled(featureId)
161
- },
162
- semantics: {
163
- capabilityIds: uniqueIds(feature.capabilityIds ?? [])
164
- }
165
- };
166
- });
167
- }
168
- function buildShellFeatures(organizationModel, modules) {
169
- const iconByFeatureId = new Map(modules.map((module) => [module.featureId, module.icon]));
170
- return defaultFeatures(organizationModel).map((feature) => ({
171
- ...feature,
172
- iconComponent: iconByFeatureId.get(feature.id)
173
- }));
174
- }
175
- function createShellModel(features) {
176
- return {
177
- features,
178
- findByPath: (path) => findByPath(features, normalizeRoutePath(path)),
179
- findById: (id) => findById(features, id),
180
- childrenOf: (id) => childrenOf(features, id),
181
- ancestorsOf: (id) => ancestorsOf(features, id),
182
- parentOf: (id) => parentOf(features, id),
183
- topLevel: () => topLevel(features),
184
- uiPositionFor: (id) => uiPositionFor(features, id),
185
- requiresAdminFor: (id) => requiresAdminFor(features, id),
186
- devOnlyFor: (id) => devOnlyFor(features, id)
187
- };
188
- }
189
- function resolveOrganizationGraphFeature(features, shellModel) {
190
- for (const feature of features) {
191
- const graphBridge = feature.organizationGraph;
192
- if (!graphBridge) continue;
193
- const node = shellModel.findById(graphBridge.featureId);
194
- return {
195
- available: Boolean(node),
196
- featureId: graphBridge.featureId,
197
- featurePath: node ? featurePath(node) : void 0
198
- };
199
- }
200
- return {
201
- available: false
202
- };
203
- }
204
- function findMatchingNode(shellModel, currentPath) {
205
- const normalizedPath = normalizeRoutePath(currentPath);
206
- const exact = shellModel.findByPath(normalizedPath);
207
- if (exact) return exact;
208
- return [...shellModel.features].filter((feature) => {
209
- const path = normalizeRoutePath(featurePath(feature));
210
- return path !== "/" && isRouteMatch(normalizedPath, path);
211
- }).sort((a, b) => featurePath(b).length - featurePath(a).length)[0];
212
- }
213
- function ownsNode(module, node) {
214
- if (!node) return false;
215
- return node.id === module.featureId || node.id.startsWith(`${module.featureId}.`);
216
- }
217
- function resolveRoute(features, shellModel, currentPath, disabledSubsectionPaths) {
218
- const node = findMatchingNode(shellModel, currentPath);
219
- const normalizedPath = normalizeRoutePath(currentPath);
220
- if (disabledSubsectionPaths.some((disabledPath) => isRouteMatch(normalizedPath, disabledPath))) {
221
- return {
222
- status: "hidden",
223
- path: currentPath,
224
- node
225
- };
226
- }
227
- const feature = features.find((candidate) => ownsNode(candidate, node));
228
- if (!feature) {
229
- return {
230
- status: "unmatched",
231
- path: currentPath,
232
- node
233
- };
234
- }
235
- return {
236
- status: "matched",
237
- path: currentPath,
238
- feature,
239
- node
240
- };
241
- }
242
- function ElevasisFeaturesProvider({
243
- features,
244
- organizationModel,
245
- timeRange,
246
- operationsApiUrl,
247
- operationsSSEManager,
248
- deliveryApiUrl,
249
- deliverySSEManager,
250
- disabledSubsectionPaths = [],
251
- children
252
- }) {
253
- const resolvedOrganizationModel = useMemo(() => {
254
- if (!organizationModel) {
255
- return void 0;
256
- }
257
- return {
258
- ...organizationModel,
259
- knowledge: organizationModel.knowledge ?? { nodes: [] }
260
- };
261
- }, [organizationModel]);
262
- useMemo(() => validateManifests(features, resolvedOrganizationModel), [features, resolvedOrganizationModel]);
263
- const { hasFeature } = useFeatureAccess();
264
- const hasResolvedFeature = useCallback(
265
- (key) => {
266
- if (!hasFeature(key)) {
267
- return false;
268
- }
269
- const organizationModelFeatureEnabled = isOrganizationModelFeatureEnabled(resolvedOrganizationModel, key);
270
- return organizationModelFeatureEnabled ?? true;
271
- },
272
- [hasFeature, resolvedOrganizationModel]
273
- );
274
- const shellFeatures = useMemo(
275
- () => buildShellFeatures(resolvedOrganizationModel, features),
276
- [resolvedOrganizationModel, features]
277
- );
278
- const shellModel = useMemo(() => createShellModel(shellFeatures), [shellFeatures]);
279
- const normalizedDisabledSubsectionPaths = useMemo(
280
- () => [...new Set(disabledSubsectionPaths.map((path) => normalizeRoutePath(path)))],
281
- [disabledSubsectionPaths]
282
- );
283
- const resolvedFeatures = useMemo(
284
- () => resolveFeatureModules(features, hasResolvedFeature),
285
- [features, hasResolvedFeature]
286
- );
287
- const enabledResolvedFeatures = useMemo(
288
- () => resolvedFeatures.filter((feature) => feature.access.enabled),
289
- [resolvedFeatures]
290
- );
291
- const organizationGraph = useMemo(
292
- () => resolveOrganizationGraphFeature(enabledResolvedFeatures, shellModel),
293
- [enabledResolvedFeatures, shellModel]
294
- );
295
- const getResolvedFeature = useCallback(
296
- (key) => resolvedFeatures.find((feature) => feature.key === key),
297
- [resolvedFeatures]
298
- );
299
- const isFeatureEnabled = useCallback((key) => hasResolvedFeature(key), [hasResolvedFeature]);
300
- const resolveRouteByPath = useCallback(
301
- (path) => resolveRoute(enabledResolvedFeatures, shellModel, path, normalizedDisabledSubsectionPaths),
302
- [enabledResolvedFeatures, shellModel, normalizedDisabledSubsectionPaths]
303
- );
304
- const shellRuntime = useMemo(
305
- () => ({
306
- resolveRoute: resolveRouteByPath
307
- }),
308
- [resolveRouteByPath]
309
- );
310
- const value = useMemo(
311
- () => ({
312
- shellModel,
313
- shellRuntime,
314
- enabledResolvedFeatures,
315
- resolvedFeatures,
316
- organizationGraph,
317
- organizationModel: resolvedOrganizationModel,
318
- timeRange,
319
- operationsApiUrl,
320
- operationsSSEManager,
321
- deliveryApiUrl,
322
- deliverySSEManager,
323
- disabledSubsectionPaths: normalizedDisabledSubsectionPaths,
324
- isFeatureEnabled,
325
- getResolvedFeature
326
- }),
327
- [
328
- shellModel,
329
- shellRuntime,
330
- enabledResolvedFeatures,
331
- resolvedFeatures,
332
- organizationGraph,
333
- resolvedOrganizationModel,
334
- timeRange,
335
- operationsApiUrl,
336
- operationsSSEManager,
337
- deliveryApiUrl,
338
- deliverySSEManager,
339
- normalizedDisabledSubsectionPaths,
340
- isFeatureEnabled,
341
- getResolvedFeature
342
- ]
343
- );
344
- return /* @__PURE__ */ jsx(ElevasisFeaturesContext.Provider, { value, children });
345
- }
346
-
347
- export { ElevasisFeaturesProvider, createFeatureAccessHook, useElevasisFeatures, useOptionalElevasisFeatures };