Declare interactive data attrs in morfos

active-uix
dev 5 months ago
parent caf208ade9
commit 37de27fcf2

@ -134,6 +134,8 @@ export const comboboxMorfo = {
data: [ data: [
{ attr: 'data-state', values: ['checked', 'unchecked'] }, { attr: 'data-state', values: ['checked', 'unchecked'] },
{ attr: 'data-value' }, { attr: 'data-value' },
{ attr: 'data-label', severity: 'optional' },
{ attr: 'data-highlighted', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],
aria: [ aria: [

@ -82,7 +82,10 @@ export const contextMenuMorfo = {
defaultElement: 'div', defaultElement: 'div',
role: 'menuitem', role: 'menuitem',
optional: false, optional: false,
data: [{ attr: 'data-disabled', severity: 'optional' }], data: [
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' }
],
aria: [ aria: [
{ {
attr: 'aria-disabled', attr: 'aria-disabled',
@ -103,6 +106,7 @@ export const contextMenuMorfo = {
states: ['checked', 'unchecked'], states: ['checked', 'unchecked'],
data: [ data: [
{ attr: 'data-state', values: ['checked', 'unchecked'] }, { attr: 'data-state', values: ['checked', 'unchecked'] },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],
aria: [ aria: [
@ -137,6 +141,7 @@ export const contextMenuMorfo = {
states: ['checked', 'unchecked'], states: ['checked', 'unchecked'],
data: [ data: [
{ attr: 'data-state', values: ['checked', 'unchecked'] }, { attr: 'data-state', values: ['checked', 'unchecked'] },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],
aria: [ aria: [
@ -169,6 +174,7 @@ export const contextMenuMorfo = {
states: ['open', 'closed'], states: ['open', 'closed'],
data: [ data: [
{ attr: 'data-state', values: ['open', 'closed'] }, { attr: 'data-state', values: ['open', 'closed'] },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],
aria: [ aria: [

@ -25,6 +25,8 @@ export const dragDropMorfo = {
optional: false, optional: false,
data: [ data: [
{ attr: 'data-value' }, { attr: 'data-value' },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-drag-handle', severity: 'optional' },
{ attr: 'data-dragging', severity: 'optional' }, { attr: 'data-dragging', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],
@ -68,6 +70,7 @@ export const dragDropMorfo = {
data: [ data: [
{ attr: 'data-dragover', severity: 'optional' }, { attr: 'data-dragover', severity: 'optional' },
{ attr: 'data-accepting', severity: 'optional' }, { attr: 'data-accepting', severity: 'optional' },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],
aria: [ aria: [

@ -200,7 +200,10 @@ export const drawerMorfo = {
role: 'button', role: 'button',
optional: false, optional: false,
states: ['open', 'closed'], states: ['open', 'closed'],
data: [{ attr: 'data-state', values: ['open', 'closed'] }], data: [
{ attr: 'data-state', values: ['open', 'closed'] },
{ attr: 'data-disabled', severity: 'optional' }
],
aria: [ aria: [
{ attr: 'type', value: v.literal('button') }, { attr: 'type', value: v.literal('button') },
{ attr: 'aria-haspopup', value: v.literal('dialog') }, { attr: 'aria-haspopup', value: v.literal('dialog') },
@ -231,6 +234,8 @@ export const drawerMorfo = {
{ attr: 'data-state', values: ['open', 'closed'], value: v.stateRef('open') }, { attr: 'data-state', values: ['open', 'closed'], value: v.stateRef('open') },
{ attr: 'data-side', values: ['top', 'bottom', 'left', 'right'] }, { attr: 'data-side', values: ['top', 'bottom', 'left', 'right'] },
{ attr: 'data-dragging', severity: 'optional' }, { attr: 'data-dragging', severity: 'optional' },
{ attr: 'data-nested', severity: 'optional' },
{ attr: 'data-nested-open', severity: 'optional' },
{ {
// Mirrors `data-variant` on the provider so recipe selectors // Mirrors `data-variant` on the provider so recipe selectors
// can scope by variant directly on Content (`[data-drawer-content] // can scope by variant directly on Content (`[data-drawer-content]
@ -286,6 +291,8 @@ export const drawerMorfo = {
states: ['open', 'closed'], states: ['open', 'closed'],
data: [ data: [
{ attr: 'data-state', values: ['open', 'closed'], value: v.stateRef('open') }, { attr: 'data-state', values: ['open', 'closed'], value: v.stateRef('open') },
{ attr: 'data-nested', severity: 'optional' },
{ attr: 'data-nested-open', severity: 'optional' },
{ {
// Overlay mirrors the provider's variant so the recipe can // Overlay mirrors the provider's variant so the recipe can
// hide the backdrop in `'inline'` and `'persistent'` modes // hide the backdrop in `'inline'` and `'persistent'` modes

@ -89,7 +89,10 @@ export const dropdownMenuMorfo = {
defaultElement: 'div', defaultElement: 'div',
role: 'menuitem', role: 'menuitem',
optional: false, optional: false,
data: [{ attr: 'data-disabled', severity: 'optional' }], data: [
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' }
],
aria: [ aria: [
{ {
attr: 'aria-disabled', attr: 'aria-disabled',
@ -110,6 +113,7 @@ export const dropdownMenuMorfo = {
states: ['checked', 'unchecked'], states: ['checked', 'unchecked'],
data: [ data: [
{ attr: 'data-state', values: ['checked', 'unchecked'] }, { attr: 'data-state', values: ['checked', 'unchecked'] },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],
aria: [ aria: [
@ -144,6 +148,7 @@ export const dropdownMenuMorfo = {
states: ['checked', 'unchecked'], states: ['checked', 'unchecked'],
data: [ data: [
{ attr: 'data-state', values: ['checked', 'unchecked'] }, { attr: 'data-state', values: ['checked', 'unchecked'] },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],
aria: [ aria: [
@ -176,6 +181,7 @@ export const dropdownMenuMorfo = {
states: ['open', 'closed'], states: ['open', 'closed'],
data: [ data: [
{ attr: 'data-state', values: ['open', 'closed'] }, { attr: 'data-state', values: ['open', 'closed'] },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],
aria: [ aria: [

@ -109,7 +109,10 @@ export const fileUploadMorfo = {
defaultElement: 'li', defaultElement: 'li',
role: 'listitem', role: 'listitem',
optional: true, optional: true,
data: [], data: [
{ attr: 'data-file-name' },
{ attr: 'data-file-type', severity: 'optional' }
],
aria: [] aria: []
}, },
{ {

@ -81,6 +81,7 @@ export const gridListMorfo = {
data: [ data: [
{ attr: 'data-state', values: ['selected', 'unselected'] }, { attr: 'data-state', values: ['selected', 'unselected'] },
{ attr: 'data-value' }, { attr: 'data-value' },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-highlighted', severity: 'optional' }, { attr: 'data-highlighted', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],

@ -83,6 +83,7 @@ export const listboxMorfo = {
data: [ data: [
{ attr: 'data-state', values: ['selected', 'unselected'] }, { attr: 'data-state', values: ['selected', 'unselected'] },
{ attr: 'data-value' }, { attr: 'data-value' },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-highlighted', severity: 'optional' }, { attr: 'data-highlighted', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' }, { attr: 'data-disabled', severity: 'optional' },
{ attr: 'data-orientation', values: ['horizontal', 'vertical'] } { attr: 'data-orientation', values: ['horizontal', 'vertical'] }

@ -124,6 +124,8 @@ export const selectMorfo = {
data: [ data: [
{ attr: 'data-state', values: ['checked', 'unchecked'] }, { attr: 'data-state', values: ['checked', 'unchecked'] },
{ attr: 'data-value' }, { attr: 'data-value' },
{ attr: 'data-label', severity: 'optional' },
{ attr: 'data-highlighted', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],
aria: [ aria: [

@ -77,6 +77,7 @@ export const tagGroupMorfo = {
data: [ data: [
{ attr: 'data-state', values: ['selected', 'unselected'] }, { attr: 'data-state', values: ['selected', 'unselected'] },
{ attr: 'data-value' }, { attr: 'data-value' },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-highlighted', severity: 'optional' }, { attr: 'data-highlighted', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],
@ -100,6 +101,7 @@ export const tagGroupMorfo = {
optional: true, optional: true,
data: [ data: [
{ attr: 'data-value' }, { attr: 'data-value' },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-highlighted', severity: 'optional' }, { attr: 'data-highlighted', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' } { attr: 'data-disabled', severity: 'optional' }
], ],

@ -62,6 +62,27 @@ export const timePickerMorfo = {
states: ['open', 'closed'], states: ['open', 'closed'],
data: [{ attr: 'data-state', values: ['open', 'closed'] }], data: [{ attr: 'data-state', values: ['open', 'closed'] }],
aria: [] aria: []
},
{
name: 'DayPeriodToggle',
kebab: 'day-period-toggle',
archetype: 'input',
kind: 'public',
defaultElement: 'div',
role: 'radiogroup',
optional: true,
data: [],
aria: []
},
{
name: 'DayPeriodItem',
kebab: 'day-period-item',
archetype: 'item',
kind: 'public',
defaultElement: 'label',
optional: true,
data: [{ attr: 'data-checked', severity: 'optional' }],
aria: []
} }
] ]
} as const satisfies Morfo; } as const satisfies Morfo;

@ -94,7 +94,9 @@ export const treeGridMorfo = {
data: [ data: [
{ attr: 'data-state', values: ['selected', 'unselected'] }, { attr: 'data-state', values: ['selected', 'unselected'] },
{ attr: 'data-value' }, { attr: 'data-value' },
{ attr: 'data-text-value', severity: 'optional' },
{ attr: 'data-expanded', values: ['true', 'false'], severity: 'optional' }, { attr: 'data-expanded', values: ['true', 'false'], severity: 'optional' },
{ attr: 'data-has-children', values: ['true', 'false'], severity: 'optional' },
{ attr: 'data-highlighted', severity: 'optional' }, { attr: 'data-highlighted', severity: 'optional' },
{ attr: 'data-disabled', severity: 'optional' }, { attr: 'data-disabled', severity: 'optional' },
{ attr: 'data-level' } { attr: 'data-level' }

@ -96,8 +96,8 @@ interface DrawerOpts extends StateProps<DrawerStateFields>, ActiveProps<DrawerAc
* a Handle part, side-resolution against Soma's `dir`. The morfo runtime * a Handle part, side-resolution against Soma's `dir`. The morfo runtime
* fires the prewrite → semantic.emit → handler cadence; component-specific * fires the prewrite → semantic.emit → handler cadence; component-specific
* data-attrs (`data-side`, `data-dragging`, `data-nested*`) stay as inline * data-attrs (`data-side`, `data-dragging`, `data-nested*`) stay as inline
* overrides in each part's `props` derived because they're not declared * overrides in each part's `props` derived; morfo declares them as contract,
* with a `value:` source in the morfo today. * while the component owns their gesture/nesting calculations.
*/ */
export class DrawerProvider { export class DrawerProvider {
static readonly ctx = context<DrawerProvider>('Drawer'); static readonly ctx = context<DrawerProvider>('Drawer');

@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import { mergeProps } from '../../../props'; import { mergeProps } from '../../../props';
import { createId } from '../../../id'; import { createId } from '../../../id';
import { TimePickerProvider } from '../time-picker-provider.svelte'; import { TimePickerProvider, timePickerAttrs } from '../time-picker-provider.svelte';
import { TIME_PICKER_LANGS } from '../langs'; import { TIME_PICKER_LANGS } from '../langs';
import type { WithChild, Without } from '../../../types'; import type { WithChild, Without } from '../../../types';
import type { PrimitiveDivAttributes } from '../../../types'; import type { PrimitiveDivAttributes } from '../../../types';
@ -34,6 +34,7 @@
const mergedProps = $derived( const mergedProps = $derived(
mergeProps(restProps, { mergeProps(restProps, {
[timePickerAttrs['day-period-toggle']]: '',
role: 'radiogroup', role: 'radiogroup',
'aria-label': 'AM/PM', 'aria-label': 'AM/PM',
'aria-disabled': disabled || undefined 'aria-disabled': disabled || undefined
@ -45,9 +46,9 @@
{#if child} {#if child}
{@render child({ props: mergedProps })} {@render child({ props: mergedProps })}
{:else} {:else}
<div {...mergedProps} data-time-picker-day-period> <div {...mergedProps}>
<label <label
data-time-picker-day-period-item {...{ [timePickerAttrs['day-period-item']]: '' }}
data-checked={provider.dayPeriod === 'AM' ? '' : undefined} data-checked={provider.dayPeriod === 'AM' ? '' : undefined}
> >
<input <input
@ -61,7 +62,7 @@
<span>{amLabel}</span> <span>{amLabel}</span>
</label> </label>
<label <label
data-time-picker-day-period-item {...{ [timePickerAttrs['day-period-item']]: '' }}
data-checked={provider.dayPeriod === 'PM' ? '' : undefined} data-checked={provider.dayPeriod === 'PM' ? '' : undefined}
> >
<input <input

Loading…
Cancel
Save

Powered by TurnKey Linux.