Same harmonization pattern as Drawer (which mirrored Dialog):
Morfo (`morfo/components/popover.ts`):
- Added 6 events: present + 5 close-* (save/cancel/dismiss/
dismiss-outside/after-fail). present + close-cancel/dismiss/
dismiss-outside use family='emerge'; close-save uses commit/fulfill;
close-after-fail uses alert/threat.
- Added data-last-action to Content's data array.
- scope: ['soma', 'sema'].
Eidos (`eidos/components/popover.css`):
- Tint rules: combine [data-state='closed'] + [data-side] +
[data-last-action] to color the trigger-facing edge (opposite to
the popover side) during exit. saved → success, failed → danger,
cancelled/dismissed/dismissed-outside → neutral.
Soma (`soma/components/popover/popover-provider.svelte.ts`):
- PopoverProvider injects MorfoRuntime + dismissWith(action).
- Registers content part on mount.
- Wires close paths through runtime.trigger():
Close.onclick → 'close-cancel'
Escape (Dismissal) → 'close-dismiss'
InteractOutside → 'close-dismiss-outside'
- PopoverProvider class re-exported from $soma/components/popover.
Demo (`test/eidos/popover/+page.svelte`):
- Tinted-exit section with Save/Cancel/Fail buttons via local
_dismiss-button.svelte (mirror of Dialog/Drawer pattern).
Verification: smoke 68/68, morfo-check 66/66.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
morfo-runtime
parent
106b972075
commit
b5453af9c4
@ -0,0 +1,35 @@
|
||||
<script lang="ts">
|
||||
import { PopoverProvider } from '$soma/components/popover';
|
||||
import type { Snippet } from 'svelte';
|
||||
|
||||
type Action = 'save' | 'cancel' | 'fail' | 'dismiss' | 'dismiss-outside';
|
||||
|
||||
let { action, children }: { action: Action; children: Snippet } = $props();
|
||||
|
||||
const provider = PopoverProvider.get();
|
||||
</script>
|
||||
|
||||
<button class="tint-btn {action}" type="button" onclick={() => provider?.dismissWith(action)}>
|
||||
{@render children()}
|
||||
</button>
|
||||
|
||||
<style>
|
||||
.tint-btn {
|
||||
padding: 0.3rem 0.6rem;
|
||||
border: 1px solid #cbd5e1;
|
||||
border-radius: 4px;
|
||||
background: white;
|
||||
font: inherit;
|
||||
font-size: 0.8rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
.tint-btn.save {
|
||||
border-color: #22c55e;
|
||||
}
|
||||
.tint-btn.cancel {
|
||||
border-color: #94a3b8;
|
||||
}
|
||||
.tint-btn.fail {
|
||||
border-color: #ef4444;
|
||||
}
|
||||
</style>
|
||||
Loading…
Reference in new issue