@happyvertical/smrt-fields 0.40.60 → 0.40.62
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/AGENTS.md +58 -12
- package/README.md +143 -42
- package/dist/__smrt-register__.d.ts +2 -0
- package/dist/__smrt-register__.d.ts.map +1 -0
- package/dist/cache.d.ts +18 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/chunks/FieldPolicyCollection--RxukfCX.js +1218 -0
- package/dist/chunks/FieldPolicyCollection--RxukfCX.js.map +1 -0
- package/dist/collections/FieldPolicyCollection.d.ts +95 -0
- package/dist/collections/FieldPolicyCollection.d.ts.map +1 -0
- package/dist/collections/FieldPolicySuggestionCollection.d.ts +160 -0
- package/dist/collections/FieldPolicySuggestionCollection.d.ts.map +1 -0
- package/dist/collections/FieldUsageCounterCollection.d.ts +143 -0
- package/dist/collections/FieldUsageCounterCollection.d.ts.map +1 -0
- package/dist/deterministic-id.d.ts +18 -0
- package/dist/deterministic-id.d.ts.map +1 -0
- package/dist/field-definitions.d.ts +85 -0
- package/dist/field-definitions.d.ts.map +1 -0
- package/dist/field-policy-resolver.d.ts +46 -0
- package/dist/field-policy-resolver.d.ts.map +1 -0
- package/dist/index.d.ts +15 -532
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1813 -628
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +1487 -191
- package/dist/models/FieldPolicy.d.ts +163 -0
- package/dist/models/FieldPolicy.d.ts.map +1 -0
- package/dist/models/FieldPolicySuggestion.d.ts +132 -0
- package/dist/models/FieldPolicySuggestion.d.ts.map +1 -0
- package/dist/models/FieldUsageCounter.d.ts +178 -0
- package/dist/models/FieldUsageCounter.d.ts.map +1 -0
- package/dist/models/FieldUsageReportReceipt.d.ts +25 -0
- package/dist/models/FieldUsageReportReceipt.d.ts.map +1 -0
- package/dist/permissions.d.ts +9 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/playground.d.ts +2 -0
- package/dist/playground.d.ts.map +1 -0
- package/dist/playground.js +39 -0
- package/dist/playground.js.map +1 -0
- package/dist/settings-catalog.d.ts +73 -0
- package/dist/settings-catalog.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +449 -9
- package/dist/svelte/__tests__/FieldPolicyControlPanel.test.js +277 -0
- package/dist/svelte/__tests__/FieldPolicyGear.test.js +503 -0
- package/dist/svelte/__tests__/FormHelp.test.js +138 -0
- package/dist/svelte/__tests__/ModeUX.test.js +109 -0
- package/dist/svelte/__tests__/ObjectForm.test.js +687 -0
- package/dist/svelte/__tests__/ObjectFormGeneratedApi.integration.test.js +436 -0
- package/dist/svelte/__tests__/PolicyField.test.js +373 -0
- package/dist/svelte/__tests__/UsageLearning.test.js +140 -0
- package/dist/svelte/__tests__/fixtures/AdvancedFieldsFixture.svelte +30 -0
- package/dist/svelte/__tests__/fixtures/AdvancedFieldsFixture.svelte.d.ts +9 -0
- package/dist/svelte/__tests__/fixtures/AdvancedFieldsFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/DomPrefillFixture.svelte +33 -0
- package/dist/svelte/__tests__/fixtures/DomPrefillFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/DomPrefillFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/FormHelpFixture.svelte +19 -0
- package/dist/svelte/__tests__/fixtures/FormHelpFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/FormHelpFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/GeneratedApiGearFixture.svelte +18 -0
- package/dist/svelte/__tests__/fixtures/GeneratedApiGearFixture.svelte.d.ts +11 -0
- package/dist/svelte/__tests__/fixtures/GeneratedApiGearFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/GracefulDegradeFixture.svelte +11 -0
- package/dist/svelte/__tests__/fixtures/GracefulDegradeFixture.svelte.d.ts +19 -0
- package/dist/svelte/__tests__/fixtures/GracefulDegradeFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ModeSwitchFixture.svelte +18 -0
- package/dist/svelte/__tests__/fixtures/ModeSwitchFixture.svelte.d.ts +8 -0
- package/dist/svelte/__tests__/fixtures/ModeSwitchFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/NoIdFixture.svelte +24 -0
- package/dist/svelte/__tests__/fixtures/NoIdFixture.svelte.d.ts +13 -0
- package/dist/svelte/__tests__/fixtures/NoIdFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte +37 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte.d.ts +15 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormFixture.svelte +17 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormRegistryFixture.svelte +25 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormRegistryFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormRegistryFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSnippetFixture.svelte +34 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSnippetFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSnippetFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceFixture.svelte +29 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceFixture.svelte.d.ts +11 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceSnippetFixture.svelte +33 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceSnippetFixture.svelte.d.ts +9 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceSnippetFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/PolicyDataTableFixture.svelte +40 -0
- package/dist/svelte/__tests__/fixtures/PolicyDataTableFixture.svelte.d.ts +8 -0
- package/dist/svelte/__tests__/fixtures/PolicyDataTableFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/PrefillFixture.svelte +26 -0
- package/dist/svelte/__tests__/fixtures/PrefillFixture.svelte.d.ts +13 -0
- package/dist/svelte/__tests__/fixtures/PrefillFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ProviderFieldFixture.svelte +39 -0
- package/dist/svelte/__tests__/fixtures/ProviderFieldFixture.svelte.d.ts +17 -0
- package/dist/svelte/__tests__/fixtures/ProviderFieldFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/RegistryInput.svelte +15 -0
- package/dist/svelte/__tests__/fixtures/RegistryInput.svelte.d.ts +5 -0
- package/dist/svelte/__tests__/fixtures/RegistryInput.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/RevealPrefillFixture.svelte +29 -0
- package/dist/svelte/__tests__/fixtures/RevealPrefillFixture.svelte.d.ts +14 -0
- package/dist/svelte/__tests__/fixtures/RevealPrefillFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/SettingsCatalogStub.svelte +24 -0
- package/dist/svelte/__tests__/fixtures/SettingsCatalogStub.svelte.d.ts +14 -0
- package/dist/svelte/__tests__/fixtures/SettingsCatalogStub.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/SnippetFixture.svelte +28 -0
- package/dist/svelte/__tests__/fixtures/SnippetFixture.svelte.d.ts +13 -0
- package/dist/svelte/__tests__/fixtures/SnippetFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte +23 -0
- package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ToggleModeButton.svelte +14 -0
- package/dist/svelte/__tests__/fixtures/ToggleModeButton.svelte.d.ts +19 -0
- package/dist/svelte/__tests__/fixtures/ToggleModeButton.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/TooltipFixture.svelte +25 -0
- package/dist/svelte/__tests__/fixtures/TooltipFixture.svelte.d.ts +14 -0
- package/dist/svelte/__tests__/fixtures/TooltipFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/settings-catalog.test.js +161 -0
- package/dist/svelte/components/AdvancedFields.svelte +49 -0
- package/dist/svelte/components/AdvancedFields.svelte.d.ts +17 -0
- package/dist/svelte/components/AdvancedFields.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldInput.svelte +159 -0
- package/dist/svelte/components/FieldInput.svelte.d.ts +5 -0
- package/dist/svelte/components/FieldInput.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyControlPanel.svelte +288 -0
- package/dist/svelte/components/FieldPolicyControlPanel.svelte.d.ts +29 -0
- package/dist/svelte/components/FieldPolicyControlPanel.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyEditor.svelte +417 -0
- package/dist/svelte/components/FieldPolicyEditor.svelte.d.ts +18 -0
- package/dist/svelte/components/FieldPolicyEditor.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyGearButton.svelte +24 -0
- package/dist/svelte/components/FieldPolicyGearButton.svelte.d.ts +8 -0
- package/dist/svelte/components/FieldPolicyGearButton.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyGearProvider.svelte +169 -0
- package/dist/svelte/components/FieldPolicyGearProvider.svelte.d.ts +20 -0
- package/dist/svelte/components/FieldPolicyGearProvider.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyProvider.svelte +89 -0
- package/dist/svelte/components/FieldPolicyProvider.svelte.d.ts +35 -0
- package/dist/svelte/components/FieldPolicyProvider.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicySuggestionQueue.svelte +135 -0
- package/dist/svelte/components/FieldPolicySuggestionQueue.svelte.d.ts +11 -0
- package/dist/svelte/components/FieldPolicySuggestionQueue.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FormHelp.svelte +157 -0
- package/dist/svelte/components/FormHelp.svelte.d.ts +15 -0
- package/dist/svelte/components/FormHelp.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ModeSwitch.svelte +47 -0
- package/dist/svelte/components/ModeSwitch.svelte.d.ts +10 -0
- package/dist/svelte/components/ModeSwitch.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ObjectForm.svelte +440 -0
- package/dist/svelte/components/ObjectForm.svelte.d.ts +50 -0
- package/dist/svelte/components/ObjectForm.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ObjectFormSourceProvider.svelte +18 -0
- package/dist/svelte/components/ObjectFormSourceProvider.svelte.d.ts +11 -0
- package/dist/svelte/components/ObjectFormSourceProvider.svelte.d.ts.map +1 -0
- package/dist/svelte/components/PolicyField.svelte +338 -0
- package/dist/svelte/components/PolicyField.svelte.d.ts +80 -0
- package/dist/svelte/components/PolicyField.svelte.d.ts.map +1 -0
- package/dist/svelte/context.svelte.d.ts +54 -0
- package/dist/svelte/context.svelte.d.ts.map +1 -0
- package/dist/svelte/context.svelte.js +55 -0
- package/dist/svelte/data-table.d.ts +17 -0
- package/dist/svelte/data-table.d.ts.map +1 -0
- package/dist/svelte/data-table.js +19 -0
- package/dist/svelte/field-policy-editor.d.ts +81 -0
- package/dist/svelte/field-policy-editor.d.ts.map +1 -0
- package/dist/svelte/field-policy-editor.js +120 -0
- package/dist/svelte/gear-context.svelte.d.ts +16 -0
- package/dist/svelte/gear-context.svelte.d.ts.map +1 -0
- package/dist/svelte/gear-context.svelte.js +15 -0
- package/dist/svelte/index.d.ts +63 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +41 -0
- package/dist/svelte/input-registry.d.ts +21 -0
- package/dist/svelte/input-registry.d.ts.map +1 -0
- package/dist/svelte/input-registry.js +26 -0
- package/dist/svelte/object-form-source-context.svelte.d.ts +4 -0
- package/dist/svelte/object-form-source-context.svelte.d.ts.map +1 -0
- package/dist/svelte/object-form-source-context.svelte.js +8 -0
- package/dist/svelte/object-form-source.svelte.d.ts +18 -0
- package/dist/svelte/object-form-source.svelte.d.ts.map +1 -0
- package/dist/svelte/object-form-source.svelte.js +99 -0
- package/dist/svelte/object-form.d.ts +6 -0
- package/dist/svelte/object-form.d.ts.map +1 -0
- package/dist/svelte/object-form.js +38 -0
- package/dist/svelte/playground/FieldPolicyFormPreview.svelte +212 -0
- package/dist/svelte/playground/FieldPolicyFormPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/FieldPolicyFormPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground/ObjectFormPreview.svelte +129 -0
- package/dist/svelte/playground/ObjectFormPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/ObjectFormPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground.d.ts +20 -0
- package/dist/svelte/playground.d.ts.map +1 -0
- package/dist/svelte/playground.js +38 -0
- package/dist/svelte/settings-catalog.d.ts +54 -0
- package/dist/svelte/settings-catalog.d.ts.map +1 -0
- package/dist/svelte/settings-catalog.js +116 -0
- package/dist/svelte/suggestions.d.ts +38 -0
- package/dist/svelte/suggestions.d.ts.map +1 -0
- package/dist/svelte/suggestions.js +68 -0
- package/dist/svelte/types.d.ts +101 -0
- package/dist/svelte/types.d.ts.map +1 -0
- package/dist/svelte/types.js +4 -0
- package/dist/svelte/usage-capture.d.ts +63 -0
- package/dist/svelte/usage-capture.d.ts.map +1 -0
- package/dist/svelte/usage-capture.js +61 -0
- package/dist/types.d.ts +316 -203
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -1
- package/dist/types.js.map +1 -1
- package/dist/usage-learning.d.ts +201 -0
- package/dist/usage-learning.d.ts.map +1 -0
- package/dist/usage-schedules.d.ts +110 -0
- package/dist/usage-schedules.d.ts.map +1 -0
- package/dist/users-module.d.ts +30 -0
- package/dist/users-module.d.ts.map +1 -0
- package/package.json +33 -8
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* FieldPolicyProvider — the form-level entry point for policy-driven forms.
|
|
4
|
+
*
|
|
5
|
+
* Receives a resolved {@link ResolvedObjectFieldPolicy} **as props** (SSR
|
|
6
|
+
* `initialData` or a client fetch by the app). Owns mode state (`basic`/
|
|
7
|
+
* `advanced`) and publishes the reactive context consumed by `PolicyField`,
|
|
8
|
+
* `ModeSwitch`, `AdvancedFields`, and `FormHelp`.
|
|
9
|
+
*
|
|
10
|
+
* No `smrt-web` import in the core primitive — an optional `./web` adapter can
|
|
11
|
+
* wire live invalidation for apps that want it; this component is policy-source
|
|
12
|
+
* agnostic.
|
|
13
|
+
*
|
|
14
|
+
* SSR seeding: props seed `$state` via `untrack()` so the first render reflects
|
|
15
|
+
* the request, with a client-only `$effect` resync — the same pattern as
|
|
16
|
+
* ThemeProvider (`smrt-ui/src/themes/ThemeProvider.svelte:53-70`).
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { Snippet } from 'svelte';
|
|
20
|
+
import { untrack } from 'svelte';
|
|
21
|
+
import type {
|
|
22
|
+
ResolvedFieldPolicy,
|
|
23
|
+
ResolvedObjectFieldPolicy,
|
|
24
|
+
} from '../../types.js';
|
|
25
|
+
import {
|
|
26
|
+
type FieldPolicyContextValue,
|
|
27
|
+
type FieldPolicyMode,
|
|
28
|
+
FieldPolicyModeStore,
|
|
29
|
+
setFieldPolicyContext,
|
|
30
|
+
} from '../context.svelte.js';
|
|
31
|
+
|
|
32
|
+
export interface Props {
|
|
33
|
+
/**
|
|
34
|
+
* Pre-resolved field policy for the object. Pass the output of
|
|
35
|
+
* `resolveFieldPolicy()` (server-side) or the `resolveBatch` endpoint
|
|
36
|
+
* response (client-side).
|
|
37
|
+
*/
|
|
38
|
+
policy: ResolvedObjectFieldPolicy;
|
|
39
|
+
/** Initial display mode — 'basic' hides advanced-tier fields. */
|
|
40
|
+
mode?: FieldPolicyMode;
|
|
41
|
+
/** Children rendered inside the provider. */
|
|
42
|
+
children?: Snippet;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
let { policy, mode: modeProp = 'basic', children }: Props = $props();
|
|
46
|
+
|
|
47
|
+
// --- Reactive mode state (owned by the provider component) ---
|
|
48
|
+
// Using a class with $state fields: Svelte 5 tracks class field reactivity
|
|
49
|
+
// correctly across the context boundary (the class instance is the reactive
|
|
50
|
+
// root, not a component closure variable).
|
|
51
|
+
// Seed via untrack() so the first SSR/client render reflects the requested
|
|
52
|
+
// mode; the $effect below resyncs later prop changes (ThemeProvider precedent).
|
|
53
|
+
const modeStore = new FieldPolicyModeStore(untrack(() => modeProp));
|
|
54
|
+
|
|
55
|
+
$effect(() => {
|
|
56
|
+
modeStore.set(modeProp);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// --- Resolved field lookup (reactive over policy prop changes) ---
|
|
60
|
+
function getField(fieldName: string): ResolvedFieldPolicy | undefined {
|
|
61
|
+
return policy.fields[fieldName];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// --- Advanced field count for the disclosure label ---
|
|
65
|
+
const advancedFieldCount = $derived.by(() => {
|
|
66
|
+
let count = 0;
|
|
67
|
+
for (const field of Object.values(policy.fields)) {
|
|
68
|
+
if (field.visibility === 'advanced') {
|
|
69
|
+
count++;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return count;
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const context: FieldPolicyContextValue = {
|
|
76
|
+
get policy() {
|
|
77
|
+
return policy;
|
|
78
|
+
},
|
|
79
|
+
mode: modeStore,
|
|
80
|
+
getField,
|
|
81
|
+
get advancedFieldCount() {
|
|
82
|
+
return advancedFieldCount;
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
setFieldPolicyContext(context);
|
|
87
|
+
</script>
|
|
88
|
+
|
|
89
|
+
{@render children?.()}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FieldPolicyProvider — the form-level entry point for policy-driven forms.
|
|
3
|
+
*
|
|
4
|
+
* Receives a resolved {@link ResolvedObjectFieldPolicy} **as props** (SSR
|
|
5
|
+
* `initialData` or a client fetch by the app). Owns mode state (`basic`/
|
|
6
|
+
* `advanced`) and publishes the reactive context consumed by `PolicyField`,
|
|
7
|
+
* `ModeSwitch`, `AdvancedFields`, and `FormHelp`.
|
|
8
|
+
*
|
|
9
|
+
* No `smrt-web` import in the core primitive — an optional `./web` adapter can
|
|
10
|
+
* wire live invalidation for apps that want it; this component is policy-source
|
|
11
|
+
* agnostic.
|
|
12
|
+
*
|
|
13
|
+
* SSR seeding: props seed `$state` via `untrack()` so the first render reflects
|
|
14
|
+
* the request, with a client-only `$effect` resync — the same pattern as
|
|
15
|
+
* ThemeProvider (`smrt-ui/src/themes/ThemeProvider.svelte:53-70`).
|
|
16
|
+
*/
|
|
17
|
+
import type { Snippet } from 'svelte';
|
|
18
|
+
import type { ResolvedObjectFieldPolicy } from '../../types.js';
|
|
19
|
+
import { type FieldPolicyMode } from '../context.svelte.js';
|
|
20
|
+
export interface Props {
|
|
21
|
+
/**
|
|
22
|
+
* Pre-resolved field policy for the object. Pass the output of
|
|
23
|
+
* `resolveFieldPolicy()` (server-side) or the `resolveBatch` endpoint
|
|
24
|
+
* response (client-side).
|
|
25
|
+
*/
|
|
26
|
+
policy: ResolvedObjectFieldPolicy;
|
|
27
|
+
/** Initial display mode — 'basic' hides advanced-tier fields. */
|
|
28
|
+
mode?: FieldPolicyMode;
|
|
29
|
+
/** Children rendered inside the provider. */
|
|
30
|
+
children?: Snippet;
|
|
31
|
+
}
|
|
32
|
+
declare const FieldPolicyProvider: import("svelte").Component<Props, {}, "">;
|
|
33
|
+
type FieldPolicyProvider = ReturnType<typeof FieldPolicyProvider>;
|
|
34
|
+
export default FieldPolicyProvider;
|
|
35
|
+
//# sourceMappingURL=FieldPolicyProvider.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldPolicyProvider.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/FieldPolicyProvider.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAEV,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,KAAK,eAAe,EAGrB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,KAAK;IACpB;;;;OAIG;IACH,MAAM,EAAE,yBAAyB,CAAC;IAClC,iEAAiE;IACjE,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA0DD,QAAA,MAAM,mBAAmB,2CAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/** Accessible, host-transport-neutral review queue for pending suggestions. */
|
|
3
|
+
import { Button } from '@happyvertical/smrt-ui/ui';
|
|
4
|
+
import {
|
|
5
|
+
type FieldPolicySuggestion,
|
|
6
|
+
type FieldPolicySuggestionAdapter,
|
|
7
|
+
fieldPolicySuggestionEvidence,
|
|
8
|
+
parsePendingFieldPolicySuggestions,
|
|
9
|
+
} from '../suggestions.js';
|
|
10
|
+
|
|
11
|
+
export interface FieldPolicySuggestionQueueProps {
|
|
12
|
+
adapter: FieldPolicySuggestionAdapter;
|
|
13
|
+
objectRefs?: readonly string[];
|
|
14
|
+
heading?: string;
|
|
15
|
+
onchanged?: () => void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
adapter,
|
|
20
|
+
objectRefs,
|
|
21
|
+
heading = 'Pending field suggestions',
|
|
22
|
+
onchanged,
|
|
23
|
+
}: FieldPolicySuggestionQueueProps = $props();
|
|
24
|
+
|
|
25
|
+
let suggestions = $state<FieldPolicySuggestion[]>([]);
|
|
26
|
+
let total = $state(0);
|
|
27
|
+
let loading = $state(false);
|
|
28
|
+
let busyId = $state<string | null>(null);
|
|
29
|
+
let error = $state<string | null>(null);
|
|
30
|
+
let generation = 0;
|
|
31
|
+
|
|
32
|
+
async function load(): Promise<void> {
|
|
33
|
+
const token = ++generation;
|
|
34
|
+
loading = true;
|
|
35
|
+
error = null;
|
|
36
|
+
try {
|
|
37
|
+
const result = parsePendingFieldPolicySuggestions(
|
|
38
|
+
await adapter.pendingSuggestions(
|
|
39
|
+
objectRefs?.length ? { objectRefs } : undefined,
|
|
40
|
+
),
|
|
41
|
+
);
|
|
42
|
+
if (token !== generation) return;
|
|
43
|
+
suggestions = result.suggestions;
|
|
44
|
+
total = result.total;
|
|
45
|
+
} catch (cause) {
|
|
46
|
+
if (token !== generation) return;
|
|
47
|
+
suggestions = [];
|
|
48
|
+
total = 0;
|
|
49
|
+
error =
|
|
50
|
+
cause instanceof Error
|
|
51
|
+
? cause.message
|
|
52
|
+
: 'Unable to load pending field suggestions.';
|
|
53
|
+
} finally {
|
|
54
|
+
if (token === generation) loading = false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function decide(
|
|
59
|
+
suggestion: FieldPolicySuggestion,
|
|
60
|
+
decision: 'approve' | 'dismiss',
|
|
61
|
+
): Promise<void> {
|
|
62
|
+
if (busyId) return;
|
|
63
|
+
busyId = suggestion.id;
|
|
64
|
+
error = null;
|
|
65
|
+
try {
|
|
66
|
+
if (decision === 'approve') {
|
|
67
|
+
await adapter.acceptSuggestion({ id: suggestion.id });
|
|
68
|
+
} else {
|
|
69
|
+
await adapter.dismissSuggestion({ id: suggestion.id });
|
|
70
|
+
}
|
|
71
|
+
await load();
|
|
72
|
+
onchanged?.();
|
|
73
|
+
} catch (cause) {
|
|
74
|
+
error =
|
|
75
|
+
cause instanceof Error
|
|
76
|
+
? cause.message
|
|
77
|
+
: 'Unable to update this field suggestion.';
|
|
78
|
+
} finally {
|
|
79
|
+
busyId = null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
$effect(() => {
|
|
84
|
+
adapter;
|
|
85
|
+
objectRefs;
|
|
86
|
+
void load();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
function description(suggestion: FieldPolicySuggestion): string {
|
|
90
|
+
return suggestion.kind === 'promote'
|
|
91
|
+
? `Promote ${suggestion.fieldName} to the basic form.`
|
|
92
|
+
: `Set an organization default for ${suggestion.fieldName}.`;
|
|
93
|
+
}
|
|
94
|
+
</script>
|
|
95
|
+
|
|
96
|
+
<section class="field-policy-suggestion-queue" aria-label={heading}>
|
|
97
|
+
<header>
|
|
98
|
+
<h2>{heading}</h2>
|
|
99
|
+
{#if !loading}<span class="field-policy-suggestion-queue__count">{total}</span>{/if}
|
|
100
|
+
</header>
|
|
101
|
+
{#if loading}
|
|
102
|
+
<p role="status" aria-live="polite">Loading pending suggestions…</p>
|
|
103
|
+
{:else if error}
|
|
104
|
+
<p role="alert">{error}</p>
|
|
105
|
+
{:else if suggestions.length === 0}
|
|
106
|
+
<p>No pending field suggestions.</p>
|
|
107
|
+
{:else}
|
|
108
|
+
<ul>
|
|
109
|
+
{#each suggestions as suggestion (suggestion.id)}
|
|
110
|
+
<li>
|
|
111
|
+
<article>
|
|
112
|
+
<h3>{suggestion.objectRef} · {suggestion.fieldName}</h3>
|
|
113
|
+
<p>{description(suggestion)}</p>
|
|
114
|
+
<p>{fieldPolicySuggestionEvidence(suggestion)}</p>
|
|
115
|
+
<div class="field-policy-suggestion-queue__actions">
|
|
116
|
+
<Button type="button" disabled={busyId !== null} onclick={() => decide(suggestion, 'approve')}>Approve</Button>
|
|
117
|
+
<Button type="button" variant="ghost" disabled={busyId !== null} onclick={() => decide(suggestion, 'dismiss')}>Dismiss</Button>
|
|
118
|
+
</div>
|
|
119
|
+
</article>
|
|
120
|
+
</li>
|
|
121
|
+
{/each}
|
|
122
|
+
</ul>
|
|
123
|
+
{/if}
|
|
124
|
+
</section>
|
|
125
|
+
|
|
126
|
+
<style>
|
|
127
|
+
.field-policy-suggestion-queue { display: grid; gap: var(--smrt-spacing-3, 0.75rem); }
|
|
128
|
+
.field-policy-suggestion-queue header { align-items: center; display: flex; gap: var(--smrt-spacing-2, 0.5rem); }
|
|
129
|
+
.field-policy-suggestion-queue h2, .field-policy-suggestion-queue h3 { margin: 0; }
|
|
130
|
+
.field-policy-suggestion-queue__count { border-radius: 999px; background: var(--smrt-color-secondary-container, #e8def8); min-inline-size: 1.5rem; padding: 0.125rem 0.4rem; text-align: center; }
|
|
131
|
+
.field-policy-suggestion-queue ul { display: grid; gap: var(--smrt-spacing-3, 0.75rem); list-style: none; margin: 0; padding: 0; }
|
|
132
|
+
.field-policy-suggestion-queue article { border: 1px solid var(--smrt-color-outline-variant, currentColor); border-radius: var(--smrt-radius-small, 0.25rem); display: grid; gap: var(--smrt-spacing-2, 0.5rem); padding: var(--smrt-spacing-3, 0.75rem); }
|
|
133
|
+
.field-policy-suggestion-queue article p { margin: 0; }
|
|
134
|
+
.field-policy-suggestion-queue__actions { display: flex; flex-wrap: wrap; gap: var(--smrt-spacing-2, 0.5rem); }
|
|
135
|
+
</style>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type FieldPolicySuggestionAdapter } from '../suggestions.js';
|
|
2
|
+
export interface FieldPolicySuggestionQueueProps {
|
|
3
|
+
adapter: FieldPolicySuggestionAdapter;
|
|
4
|
+
objectRefs?: readonly string[];
|
|
5
|
+
heading?: string;
|
|
6
|
+
onchanged?: () => void;
|
|
7
|
+
}
|
|
8
|
+
declare const FieldPolicySuggestionQueue: import("svelte").Component<FieldPolicySuggestionQueueProps, {}, "">;
|
|
9
|
+
type FieldPolicySuggestionQueue = ReturnType<typeof FieldPolicySuggestionQueue>;
|
|
10
|
+
export default FieldPolicySuggestionQueue;
|
|
11
|
+
//# sourceMappingURL=FieldPolicySuggestionQueue.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldPolicySuggestionQueue.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/FieldPolicySuggestionQueue.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,4BAA4B,EAGlC,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,4BAA4B,CAAC;IACtC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAuHD,QAAA,MAAM,0BAA0B,qEAAwC,CAAC;AACzE,KAAK,0BAA0B,GAAG,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAChF,eAAe,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* FormHelp — a `?` affordance assembling the object description + per-field
|
|
4
|
+
* glossary from the manifest (org-overridden text where present).
|
|
5
|
+
*
|
|
6
|
+
* Renders a button toggling a details/summary panel listing every visible
|
|
7
|
+
* field's label and help text — matching PolicyField visibility, so
|
|
8
|
+
* advanced-tier entries only appear while the provider mode is `advanced` —
|
|
9
|
+
* plus the object description if provided. The data comes entirely from the
|
|
10
|
+
* resolved policy — no separate fetch needed.
|
|
11
|
+
*
|
|
12
|
+
* Must be used inside a FieldPolicyProvider.
|
|
13
|
+
*/
|
|
14
|
+
import { getFieldPolicyContext } from '../context.svelte.js';
|
|
15
|
+
|
|
16
|
+
export interface Props {
|
|
17
|
+
/**
|
|
18
|
+
* Object-level description (e.g. the SmrtObject class `description`). When
|
|
19
|
+
* provided, it appears at the top of the help panel.
|
|
20
|
+
*/
|
|
21
|
+
objectDescription?: string;
|
|
22
|
+
/** Label for the toggle button. */
|
|
23
|
+
label?: string;
|
|
24
|
+
/** Additional class. */
|
|
25
|
+
class?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let {
|
|
29
|
+
objectDescription,
|
|
30
|
+
label = 'Help',
|
|
31
|
+
class: className = '',
|
|
32
|
+
}: Props = $props();
|
|
33
|
+
|
|
34
|
+
const context = getFieldPolicyContext();
|
|
35
|
+
|
|
36
|
+
// Build the glossary: one entry per field that has help text AND is visible
|
|
37
|
+
// in the current mode (advanced-tier entries disappear in basic mode,
|
|
38
|
+
// matching PolicyField visibility), ordered by the resolved `order` when
|
|
39
|
+
// available, then by insertion order.
|
|
40
|
+
const glossary = $derived.by(() => {
|
|
41
|
+
const entries: Array<{
|
|
42
|
+
label: string;
|
|
43
|
+
help: string;
|
|
44
|
+
order: number;
|
|
45
|
+
}> = [];
|
|
46
|
+
|
|
47
|
+
const mode = context.mode.current;
|
|
48
|
+
for (const field of Object.values(context.policy.fields)) {
|
|
49
|
+
if (field.visibility === 'hidden') continue;
|
|
50
|
+
if (field.visibility === 'advanced' && mode !== 'advanced') continue;
|
|
51
|
+
const labelText = field.label ?? field.fieldName;
|
|
52
|
+
if (field.help) {
|
|
53
|
+
entries.push({
|
|
54
|
+
label: labelText,
|
|
55
|
+
help: field.help,
|
|
56
|
+
order: field.order ?? Number.MAX_SAFE_INTEGER,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Stable sort by resolved order
|
|
62
|
+
entries.sort((a, b) => a.order - b.order);
|
|
63
|
+
return entries;
|
|
64
|
+
});
|
|
65
|
+
</script>
|
|
66
|
+
|
|
67
|
+
<details class="form-help {className}">
|
|
68
|
+
<summary class="form-help__toggle">
|
|
69
|
+
<span class="form-help__icon" aria-hidden="true">?</span>
|
|
70
|
+
<span class="form-help__label">{label}</span>
|
|
71
|
+
</summary>
|
|
72
|
+
<div class="form-help__panel">
|
|
73
|
+
{#if objectDescription}
|
|
74
|
+
<p class="form-help__description">{objectDescription}</p>
|
|
75
|
+
{/if}
|
|
76
|
+
{#if glossary.length > 0}
|
|
77
|
+
<dl class="form-help__glossary">
|
|
78
|
+
{#each glossary as entry}
|
|
79
|
+
<dt class="form-help__term">{entry.label}</dt>
|
|
80
|
+
<dd class="form-help__definition">{entry.help}</dd>
|
|
81
|
+
{/each}
|
|
82
|
+
</dl>
|
|
83
|
+
{:else}
|
|
84
|
+
<p class="form-help__empty">No field help available.</p>
|
|
85
|
+
{/if}
|
|
86
|
+
</div>
|
|
87
|
+
</details>
|
|
88
|
+
|
|
89
|
+
<style>
|
|
90
|
+
.form-help {
|
|
91
|
+
display: inline-block;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.form-help__toggle {
|
|
95
|
+
display: inline-flex;
|
|
96
|
+
align-items: center;
|
|
97
|
+
gap: var(--smrt-spacing-1, 0.25rem);
|
|
98
|
+
cursor: pointer;
|
|
99
|
+
list-style: none;
|
|
100
|
+
font: var(--smrt-typography-label-medium-font, inherit);
|
|
101
|
+
color: var(--smrt-color-on-surface-variant, currentColor);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.form-help__toggle::-webkit-details-marker {
|
|
105
|
+
display: none;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.form-help__toggle:focus-visible {
|
|
109
|
+
outline: 2px solid var(--smrt-color-primary, #6750a4);
|
|
110
|
+
outline-offset: 2px;
|
|
111
|
+
border-radius: 4px;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.form-help__icon {
|
|
115
|
+
display: inline-flex;
|
|
116
|
+
align-items: center;
|
|
117
|
+
justify-content: center;
|
|
118
|
+
width: 1.25em;
|
|
119
|
+
height: 1.25em;
|
|
120
|
+
border-radius: 50%;
|
|
121
|
+
border: 1px solid currentColor;
|
|
122
|
+
font: var(--smrt-typography-label-small-font, inherit);
|
|
123
|
+
line-height: 1;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.form-help__panel {
|
|
127
|
+
padding: var(--smrt-spacing-3, 0.75rem) 0;
|
|
128
|
+
color: var(--smrt-color-on-surface, currentColor);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.form-help__description {
|
|
132
|
+
margin: 0 0 var(--smrt-spacing-2, 0.5rem);
|
|
133
|
+
font: var(--smrt-typography-body-medium-font, inherit);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.form-help__glossary {
|
|
137
|
+
margin: 0;
|
|
138
|
+
display: grid;
|
|
139
|
+
gap: var(--smrt-spacing-1, 0.25rem);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.form-help__term {
|
|
143
|
+
font: var(--smrt-typography-label-medium-font, inherit);
|
|
144
|
+
font-weight: 600;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.form-help__definition {
|
|
148
|
+
margin: 0 0 var(--smrt-spacing-2, 0.5rem);
|
|
149
|
+
font: var(--smrt-typography-body-small-font, inherit);
|
|
150
|
+
color: var(--smrt-color-on-surface-variant, currentColor);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.form-help__empty {
|
|
154
|
+
font: var(--smrt-typography-body-small-font, inherit);
|
|
155
|
+
color: var(--smrt-color-on-surface-variant, currentColor);
|
|
156
|
+
}
|
|
157
|
+
</style>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface Props {
|
|
2
|
+
/**
|
|
3
|
+
* Object-level description (e.g. the SmrtObject class `description`). When
|
|
4
|
+
* provided, it appears at the top of the help panel.
|
|
5
|
+
*/
|
|
6
|
+
objectDescription?: string;
|
|
7
|
+
/** Label for the toggle button. */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Additional class. */
|
|
10
|
+
class?: string;
|
|
11
|
+
}
|
|
12
|
+
declare const FormHelp: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type FormHelp = ReturnType<typeof FormHelp>;
|
|
14
|
+
export default FormHelp;
|
|
15
|
+
//# sourceMappingURL=FormHelp.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormHelp.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/FormHelp.svelte.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,KAAK;IACpB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAuED,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* ModeSwitch — a Basic/Advanced toggle built on SegmentedControl.
|
|
4
|
+
*
|
|
5
|
+
* An optional composition for PolicyField-wrapped forms. Reads and writes the
|
|
6
|
+
* provider's reactive mode state. Must be used inside a FieldPolicyProvider.
|
|
7
|
+
*
|
|
8
|
+
* Uses `@happyvertical/smrt-ui/forms`'s SegmentedControl (exported from there,
|
|
9
|
+
* not `./ui` — see the plan-review addendum in #2048).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { SegmentedControlOption } from '@happyvertical/smrt-ui/forms';
|
|
13
|
+
import { SegmentedControl } from '@happyvertical/smrt-ui/forms';
|
|
14
|
+
import { getFieldPolicyContext } from '../context.svelte.js';
|
|
15
|
+
|
|
16
|
+
export interface Props {
|
|
17
|
+
/** Accessible label for the segmented control. */
|
|
18
|
+
label?: string;
|
|
19
|
+
/** Additional class. */
|
|
20
|
+
class?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let { label = 'View mode', class: className = '' }: Props = $props();
|
|
24
|
+
|
|
25
|
+
const context = getFieldPolicyContext();
|
|
26
|
+
|
|
27
|
+
const options: SegmentedControlOption[] = [
|
|
28
|
+
{ value: 'basic', label: 'Basic' },
|
|
29
|
+
{ value: 'advanced', label: 'Advanced' },
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
function onValueChange(value: string | number): void {
|
|
33
|
+
// Validate before setting — SegmentedControl hands back `string | number`,
|
|
34
|
+
// and a stray value must never corrupt the mode state.
|
|
35
|
+
if (value === 'basic' || value === 'advanced') {
|
|
36
|
+
context.mode.set(value);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<SegmentedControl
|
|
42
|
+
{options}
|
|
43
|
+
{label}
|
|
44
|
+
value={context.mode.current}
|
|
45
|
+
onvaluechange={onValueChange}
|
|
46
|
+
class={className}
|
|
47
|
+
/>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface Props {
|
|
2
|
+
/** Accessible label for the segmented control. */
|
|
3
|
+
label?: string;
|
|
4
|
+
/** Additional class. */
|
|
5
|
+
class?: string;
|
|
6
|
+
}
|
|
7
|
+
declare const ModeSwitch: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type ModeSwitch = ReturnType<typeof ModeSwitch>;
|
|
9
|
+
export default ModeSwitch;
|
|
10
|
+
//# sourceMappingURL=ModeSwitch.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModeSwitch.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ModeSwitch.svelte.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,KAAK;IACpB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+BD,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|