@sectile/vue 0.16.6 → 0.18.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 (74) hide show
  1. package/dist/accordion.d.ts +12 -0
  2. package/dist/accordion.js +1 -1
  3. package/dist/accordion.js.map +1 -1
  4. package/dist/carousel.d.ts +13 -0
  5. package/dist/carousel.js +1 -1
  6. package/dist/carousel.js.map +1 -1
  7. package/dist/cascade-list.d.ts +11 -1
  8. package/dist/cascade-list.js +1 -1
  9. package/dist/cascade-list.js.map +1 -1
  10. package/dist/cascade-select.d.ts +11 -1
  11. package/dist/cascade-select.js +1 -1
  12. package/dist/cascade-select.js.map +1 -1
  13. package/dist/checkbox-group.d.ts +9 -0
  14. package/dist/checkbox.d.ts +11 -1
  15. package/dist/checkbox.js +1 -1
  16. package/dist/checkbox.js.map +1 -1
  17. package/dist/combobox.d.ts +12 -0
  18. package/dist/combobox.js +1 -1
  19. package/dist/combobox.js.map +1 -1
  20. package/dist/disclosure.d.ts +11 -1
  21. package/dist/disclosure.js +1 -1
  22. package/dist/disclosure.js.map +1 -1
  23. package/dist/form.d.ts +6 -48
  24. package/dist/form.js +1 -1
  25. package/dist/form.js.map +1 -1
  26. package/dist/internal/cascade-choice.d.ts +13 -0
  27. package/dist/internal/cascade-choice.js +1 -1
  28. package/dist/internal/cascade-choice.js.map +1 -1
  29. package/dist/internal/conditional-presence.d.ts +23 -0
  30. package/dist/internal/conditional-presence.js +2 -0
  31. package/dist/internal/conditional-presence.js.map +1 -0
  32. package/dist/internal/date-picker.js +1 -1
  33. package/dist/internal/date-picker.js.map +1 -1
  34. package/dist/internal/form-context.d.ts +22 -0
  35. package/dist/internal/form-context.js +2 -0
  36. package/dist/internal/form-context.js.map +1 -0
  37. package/dist/internal/form-presence-parts.d.ts +69 -0
  38. package/dist/internal/form-presence-parts.js +2 -0
  39. package/dist/internal/form-presence-parts.js.map +1 -0
  40. package/dist/internal/tabular-parts.js +1 -1
  41. package/dist/internal/tabular-parts.js.map +1 -1
  42. package/dist/internal/virtual-collection.d.ts +4 -3
  43. package/dist/internal/virtual-collection.js.map +1 -1
  44. package/dist/internal/virtual-core.d.ts +15 -4
  45. package/dist/internal/virtual-core.js +1 -1
  46. package/dist/internal/virtual-core.js.map +1 -1
  47. package/dist/internal/virtual-list.js +1 -1
  48. package/dist/internal/virtual-list.js.map +1 -1
  49. package/dist/listbox.d.ts +12 -0
  50. package/dist/listbox.js +1 -1
  51. package/dist/listbox.js.map +1 -1
  52. package/dist/navigation-menu.d.ts +15 -0
  53. package/dist/navigation-menu.js +1 -1
  54. package/dist/navigation-menu.js.map +1 -1
  55. package/dist/radio-group.d.ts +11 -1
  56. package/dist/radio-group.js +1 -1
  57. package/dist/radio-group.js.map +1 -1
  58. package/dist/rating.d.ts +9 -0
  59. package/dist/select.d.ts +12 -0
  60. package/dist/select.js +1 -1
  61. package/dist/select.js.map +1 -1
  62. package/dist/stepper.d.ts +9 -0
  63. package/dist/tabs.d.ts +11 -1
  64. package/dist/tabs.js +1 -1
  65. package/dist/tabs.js.map +1 -1
  66. package/dist/tree-grid.d.ts +14 -0
  67. package/dist/tree-grid.js +1 -1
  68. package/dist/tree-grid.js.map +1 -1
  69. package/dist/tree-view.d.ts +11 -1
  70. package/dist/tree-view.js +1 -1
  71. package/dist/tree-view.js.map +1 -1
  72. package/dist/virtual-core.d.ts +1 -1
  73. package/dist/virtual-core.js.map +1 -1
  74. package/package.json +11 -11
package/dist/checkbox.js CHANGED
@@ -1,2 +1,2 @@
1
- import{computed,defineComponent,h,inject,mergeProps,provide,shallowRef,watch}from"vue";import{createCheckboxController,getCheckboxAttributes,getCheckboxInputAttributes}from"@sectile/dom/checkbox";import{Primitive}from"./primitive.js";import{visuallyHiddenInputStyle}from"./internal/native-input.js";import{usePartContract}from"./internal/part-contract.js";import{hiddenInputSubmissionCapabilities,useCompositeFormControl}from"./internal/form-control.js";import{useControlledStateInvariant}from"./internal/controlled-state.js";const checkboxContextKey=Symbol("SectileCheckbox");const CheckboxRoot=defineComponent({name:"SectileCheckboxRoot",inheritAttrs:false,props:{modelValue:{type:[Boolean,String],default:void 0},defaultValue:{type:[Boolean,String],default:false},disabled:{type:Boolean,default:false},readonly:{type:Boolean,default:false},required:{type:Boolean,default:false},name:{type:String,default:void 0},value:{type:String,default:"on"},form:{type:String,default:void 0},as:{type:[String,Object,Function],default:"button"},asChild:{type:Boolean,default:false}},emits:{"update:modelValue":_value=>true},slots:Object,setup(props,{attrs,emit,slots}){const rootElement=shallowRef(null);const inputElement=shallowRef(null);const controlled=useControlledStateInvariant("CheckboxRoot","modelValue",()=>props.modelValue);const initialValue=controlled?props.modelValue:props.defaultValue;const controller=shallowRef(createController(controlled,controlled?props.modelValue:props.defaultValue,props,emit));const snapshot=shallowRef(controller.value.getSnapshot());const refresh=()=>{snapshot.value=controller.value.getSnapshot()};const rebuild=()=>{const value=controlled?props.modelValue:fromDOMValue(snapshot.value.state.checked);controller.value=createController(controlled,value,props,emit);refresh()};const participation=useCompositeFormControl({root:rootElement,focusTarget:rootElement,submissions:[{element:inputElement,capabilities:hiddenInputSubmissionCapabilities}],reset:()=>{queueMicrotask(()=>{controller.value=createController(controlled,controlled?props.modelValue:initialValue,props,emit);refresh()})}});watch(()=>props.modelValue,value=>{if(!controlled||value===void 0)return;const result=controller.value.syncControlledValue(toDOMValue(value));if(!result.ok)throw new TypeError(result.error.message);snapshot.value=result.value});watch([()=>props.disabled,()=>props.readonly],rebuild);const slotProps=computed(()=>Object.freeze({checked:fromDOMValue(snapshot.value.state.checked),isChecked:snapshot.value.state.checked===true,isIndeterminate:snapshot.value.state.checked==="mixed",disabled:props.disabled,readonly:props.readonly}));const attributes=computed(()=>getCheckboxAttributes(snapshot.value.state,{disabled:props.disabled,readOnly:props.readonly,required:props.required,native:true}));const inputAttributes=computed(()=>getCheckboxInputAttributes(snapshot.value.state,{...props.name===void 0?{}:{name:props.name},value:props.value,...props.form===void 0?{}:{form:props.form},required:props.required,disabled:props.disabled}));const dataState=computed(()=>attributes.value["data-state"]);const part=usePartContract("checkbox","root");provide(checkboxContextKey,{slotProps,dataState,partContract:part});const handleClick=event=>{if(event.defaultPrevented)return;if(controller.value.handleEvent("toggle"))refresh()};return()=>{const root=h(Primitive,mergeProps(attrs,attributes.value,{elementRef:element=>{rootElement.value=element},as:props.as,asChild:props.asChild,...props.as==="button"&&!props.asChild?{type:"button"}:{},"data-scope":part.scope,"data-part":part.part,onClick:handleClick},participation.controlProps.value),{default:()=>slots["default"]?.(slotProps.value)});if(!participation.participating&&props.name===void 0&&props.form===void 0&&!props.required)return root;return[root,h("input",mergeProps(inputAttributes.value,{ref:inputElement,style:visuallyHiddenInputStyle}))]}}});const CheckboxIndicator=defineComponent({name:"SectileCheckboxIndicator",inheritAttrs:false,props:{as:{type:[String,Object,Function],default:"span"},asChild:{type:Boolean,default:false}},slots:Object,setup(props,{attrs,slots}){const context=inject(checkboxContextKey);if(context===void 0){throw new TypeError("CheckboxIndicator must be used inside CheckboxRoot.")}const part={scope:context.partContract.scope,part:context.partContract.parts["indicator"]??"indicator"};return()=>{const state=context.slotProps.value;return h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,hidden:state.checked===false,"aria-hidden":"true","data-scope":part.scope,"data-part":part.part,"data-state":context.dataState.value}),{default:()=>slots["default"]?.(state)})}}});function createController(controlled,value,props,emit){const result=createCheckboxController({...controlled?{value:toDOMValue(value)}:{defaultValue:toDOMValue(value)},disabled:props.disabled??false,readOnly:props.readonly??false,onValueChange:next=>{emit("update:modelValue",fromDOMValue(next))}});if(!result.ok)throw new TypeError(result.error.message);return result.value}function toDOMValue(value){return value==="indeterminate"?"mixed":value}function fromDOMValue(value){return value==="mixed"?"indeterminate":value}export{CheckboxIndicator,CheckboxRoot};
1
+ import{computed,defineComponent,h,inject,mergeProps,provide,shallowRef,watch}from"vue";import{createCheckboxController,getCheckboxAttributes,getCheckboxInputAttributes}from"@sectile/dom/checkbox";import{Primitive}from"./primitive.js";import{visuallyHiddenInputStyle}from"./internal/native-input.js";import{usePartContract}from"./internal/part-contract.js";import{hiddenInputSubmissionCapabilities,useCompositeFormControl}from"./internal/form-control.js";import{useControlledStateInvariant}from"./internal/controlled-state.js";import{conditionalPresenceProps,useConditionalPresence}from"./internal/conditional-presence.js";const checkboxContextKey=Symbol("SectileCheckbox");const CheckboxRoot=defineComponent({name:"SectileCheckboxRoot",inheritAttrs:false,props:{modelValue:{type:[Boolean,String],default:void 0},defaultValue:{type:[Boolean,String],default:false},disabled:{type:Boolean,default:false},readonly:{type:Boolean,default:false},required:{type:Boolean,default:false},name:{type:String,default:void 0},value:{type:String,default:"on"},form:{type:String,default:void 0},as:{type:[String,Object,Function],default:"button"},asChild:{type:Boolean,default:false}},emits:{"update:modelValue":_value=>true},slots:Object,setup(props,{attrs,emit,slots}){const rootElement=shallowRef(null);const inputElement=shallowRef(null);const controlled=useControlledStateInvariant("CheckboxRoot","modelValue",()=>props.modelValue);const initialValue=controlled?props.modelValue:props.defaultValue;const controller=shallowRef(createController(controlled,controlled?props.modelValue:props.defaultValue,props,emit));const snapshot=shallowRef(controller.value.getSnapshot());const refresh=()=>{snapshot.value=controller.value.getSnapshot()};const rebuild=()=>{const value=controlled?props.modelValue:fromDOMValue(snapshot.value.state.checked);controller.value=createController(controlled,value,props,emit);refresh()};const participation=useCompositeFormControl({root:rootElement,focusTarget:rootElement,submissions:[{element:inputElement,capabilities:hiddenInputSubmissionCapabilities}],reset:()=>{queueMicrotask(()=>{controller.value=createController(controlled,controlled?props.modelValue:initialValue,props,emit);refresh()})}});watch(()=>props.modelValue,value=>{if(!controlled||value===void 0)return;const result=controller.value.syncControlledValue(toDOMValue(value));if(!result.ok)throw new TypeError(result.error.message);snapshot.value=result.value});watch([()=>props.disabled,()=>props.readonly],rebuild);const slotProps=computed(()=>Object.freeze({checked:fromDOMValue(snapshot.value.state.checked),isChecked:snapshot.value.state.checked===true,isIndeterminate:snapshot.value.state.checked==="mixed",disabled:props.disabled,readonly:props.readonly}));const attributes=computed(()=>getCheckboxAttributes(snapshot.value.state,{disabled:props.disabled,readOnly:props.readonly,required:props.required,native:true}));const inputAttributes=computed(()=>getCheckboxInputAttributes(snapshot.value.state,{...props.name===void 0?{}:{name:props.name},value:props.value,...props.form===void 0?{}:{form:props.form},required:props.required,disabled:props.disabled}));const dataState=computed(()=>attributes.value["data-state"]);const part=usePartContract("checkbox","root");provide(checkboxContextKey,{slotProps,dataState,partContract:part});const handleClick=event=>{if(event.defaultPrevented)return;if(controller.value.handleEvent("toggle"))refresh()};return()=>{const root=h(Primitive,mergeProps(attrs,attributes.value,{elementRef:element=>{rootElement.value=element},as:props.as,asChild:props.asChild,...props.as==="button"&&!props.asChild?{type:"button"}:{},"data-scope":part.scope,"data-part":part.part,onClick:handleClick},participation.controlProps.value),{default:()=>slots["default"]?.(slotProps.value)});if(!participation.participating&&props.name===void 0&&props.form===void 0&&!props.required)return root;return[root,h("input",mergeProps(inputAttributes.value,{ref:inputElement,style:visuallyHiddenInputStyle}))]}}});const CheckboxIndicator=defineComponent({name:"SectileCheckboxIndicator",inheritAttrs:false,props:{...conditionalPresenceProps,as:{type:[String,Object,Function],default:"span"},asChild:{type:Boolean,default:false}},slots:Object,setup(props,{attrs,slots}){const context=inject(checkboxContextKey);if(context===void 0){throw new TypeError("CheckboxIndicator must be used inside CheckboxRoot.")}const part={scope:context.partContract.scope,part:context.partContract.parts["indicator"]??"indicator"};const active=computed(()=>context.slotProps.value.checked!==false);const forcePresent=computed(()=>props.forcePresent);const presence=useConditionalPresence(active,forcePresent);return()=>{const state=context.slotProps.value;return h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,elementRef:presence.register,hidden:presence.hidden.value,"aria-hidden":"true","data-scope":part.scope,"data-part":part.part,"data-state":context.dataState.value}),{default:()=>slots["default"]?.(state)})}}});function createController(controlled,value,props,emit){const result=createCheckboxController({...controlled?{value:toDOMValue(value)}:{defaultValue:toDOMValue(value)},disabled:props.disabled??false,readOnly:props.readonly??false,onValueChange:next=>{emit("update:modelValue",fromDOMValue(next))}});if(!result.ok)throw new TypeError(result.error.message);return result.value}function toDOMValue(value){return value==="indeterminate"?"mixed":value}function fromDOMValue(value){return value==="mixed"?"indeterminate":value}export{CheckboxIndicator,CheckboxRoot};
2
2
  //# sourceMappingURL=checkbox.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/checkbox.ts"],"mappings":"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","names":[],"file":"checkbox.js"}
1
+ {"version":3,"sources":["../src/checkbox.ts"],"mappings":"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","names":[],"file":"checkbox.js"}
@@ -2,6 +2,7 @@ import { type PropType, type SlotsType, type VNodeChild } from 'vue';
2
2
  import { type ComboboxItem as ComboboxItemDefinition, type ComboboxPolicies } from '@sectile/dom/combobox';
3
3
  import type { PositionBoundary, PositionOptions, PositionPadding, PositionStrategy, PositionTracking } from '@sectile/dom/position';
4
4
  import { type PrimitiveAs } from './primitive.js';
5
+ import { type ConditionalPresenceProps } from './internal/conditional-presence.js';
5
6
  export interface ComboboxRootProps extends Omit<PositionOptions, 'arrowPadding'> {
6
7
  readonly items: readonly ComboboxItemDefinition<string>[];
7
8
  readonly modelValue?: string | null;
@@ -42,6 +43,8 @@ export interface ComboboxPartProps {
42
43
  readonly as?: PrimitiveAs;
43
44
  readonly asChild?: boolean;
44
45
  }
46
+ export interface ComboboxEmptyProps extends ComboboxPartProps, ConditionalPresenceProps {
47
+ }
45
48
  export declare const ComboboxRoot: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
46
49
  items: {
47
50
  type: PropType<readonly ComboboxItemDefinition<string>[]>;
@@ -386,6 +389,10 @@ export declare const ComboboxItem: import("vue").DefineComponent<import("vue").E
386
389
  default: (props: ComboboxItemSlotProps) => VNodeChild;
387
390
  }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
388
391
  export declare const ComboboxEmpty: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
392
+ forcePresent: {
393
+ readonly type: BooleanConstructor;
394
+ readonly default: false;
395
+ };
389
396
  as: {
390
397
  type: PropType<PrimitiveAs>;
391
398
  default: string;
@@ -395,6 +402,10 @@ export declare const ComboboxEmpty: import("vue").DefineComponent<import("vue").
395
402
  default: boolean;
396
403
  };
397
404
  }>, () => VNodeChild, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
405
+ forcePresent: {
406
+ readonly type: BooleanConstructor;
407
+ readonly default: false;
408
+ };
398
409
  as: {
399
410
  type: PropType<PrimitiveAs>;
400
411
  default: string;
@@ -404,6 +415,7 @@ export declare const ComboboxEmpty: import("vue").DefineComponent<import("vue").
404
415
  default: boolean;
405
416
  };
406
417
  }>> & Readonly<{}>, {
418
+ forcePresent: boolean;
407
419
  as: PrimitiveAs;
408
420
  asChild: boolean;
409
421
  }, SlotsType<{
package/dist/combobox.js CHANGED
@@ -1,2 +1,2 @@
1
- import{computed,defineComponent,h,inject,mergeProps,nextTick,onBeforeUnmount,onMounted,provide,shallowRef,watch}from"vue";import{createCombobox}from"@sectile/dom/combobox";import{createTextState}from"@sectile/dom/text";import{Primitive}from"./primitive.js";import{useNativeInputFormControl}from"./internal/form-control.js";import{reconcileCollectionState}from"./internal/collection.js";import{useControlledStateInvariant}from"./internal/controlled-state.js";import{usePresence}from"./internal/presence.js";const key=Symbol("SectileComboboxRoot");const partProps={as:{type:[String,Object,Function],default:"span"},asChild:{type:Boolean,default:false}};const ComboboxRoot=defineComponent({name:"SectileComboboxRoot",inheritAttrs:false,props:{items:{type:Array,required:true},modelValue:{type:String,default:void 0},defaultValue:{type:String,default:null},inputValue:{type:String,default:void 0},defaultInputValue:{type:String,default:""},open:{type:Boolean,default:void 0},defaultOpen:{type:Boolean,default:false},disabled:{type:Boolean,default:false},readonly:{type:Boolean,default:false},label:{type:String,default:void 0},position:{type:Boolean,default:true},side:{type:String,default:"bottom"},align:{type:String,default:"start"},sideOffset:{type:Number,default:8},collisionPadding:{type:[Number,Object],default:8},collisionBoundary:{type:[String,Object],default:void 0},avoidCollisions:{type:Boolean,default:true},hideWhenDetached:{type:Boolean,default:false},strategy:{type:String,default:"absolute"},tracking:{type:String,default:"events"},policies:{type:Object,default:void 0},as:{type:[String,Object,Function],default:"div"},asChild:{type:Boolean,default:false}},emits:{"update:modelValue":_value=>true,"update:inputValue":_value=>true,"update:open":_value=>true,highlight:_value=>true,accept:_value=>true},slots:Object,setup(props,{attrs,emit,slots}){const input=shallowRef();const popup=shallowRef();const connection=shallowRef();const localValue=shallowRef(props.modelValue!==void 0?props.modelValue:props.defaultValue);const localInput=shallowRef(props.inputValue??props.defaultInputValue);const localOpen=shallowRef(props.open??props.defaultOpen);const highlighted=shallowRef(null);let proposedInputState=null;const controlled={value:useControlledStateInvariant("ComboboxRoot","modelValue",()=>props.modelValue),input:useControlledStateInvariant("ComboboxRoot","inputValue",()=>props.inputValue),open:useControlledStateInvariant("ComboboxRoot","open",()=>props.open)};const state=computed(()=>Object.freeze({value:props.modelValue!==void 0?props.modelValue:localValue.value,inputValue:props.inputValue??localInput.value,highlightedValue:highlighted.value,open:props.open??localOpen.value,disabled:props.disabled,readonly:props.readonly}));const itemLabels=computed(()=>new Map(props.items.map(item=>[item.id,item.label])));const matchingQuery=computed(()=>{const fallback=state.value.inputValue;const text=connection.value?.getSnapshot().state.text;return text===void 0?fallback:text.composition===null?text.snapshot.text:text.composition.baseline.text});const matchesItem=id=>{const label=itemLabels.value.get(id);if(label===void 0)return false;const matches=props.policies?.matches;return matches===void 0||matches(label,matchingQuery.value,id)};const hasMatches=()=>{for(const item of props.items){if(matchesItem(item.id))return true}return false};const refresh=()=>{const snapshot=connection.value?.getSnapshot().state;if(snapshot===void 0)return;localValue.value=snapshot.selection.selected[0]??null;localInput.value=snapshot.text.snapshot.text;localOpen.value=snapshot.popupOpen;highlighted.value=snapshot.cursor.current;refreshItems()};const refreshItems=()=>{if(popup.value===void 0||connection.value===void 0)return;popup.value.querySelectorAll("[data-sectile-combobox-id]").forEach(element=>{const id=element.dataset["sectileComboboxId"];if(id!==void 0)connection.value?.setItemAttributes(element,{id,disabled:element.dataset["disabled"]==="true"})})};const connect=()=>{connection.value?.disconnect();if(input.value===void 0)return;const items=props.items.map(item=>item.id);const requestedValue=controlled.value?props.modelValue:localValue.value;const reconciled=reconcileCollectionState(items,requestedValue===null?[]:[requestedValue],highlighted.value,[],"single",{preserveNullCurrent:true});const value=reconciled.selected[0]??null;localValue.value=value;highlighted.value=reconciled.current;if(controlled.value&&requestedValue!==value)emit("update:modelValue",value);connection.value=createCombobox({input:input.value,...popup.value===void 0?{}:{popup:popup.value},items:props.items,manageVisibility:false,...props.policies===void 0?{}:{policies:props.policies},...controlled.value?{value}:{defaultValue:value},defaultHighlightedValue:reconciled.current,...controlled.input?{inputState:createTextState(props.inputValue)}:{defaultInputState:createTextState(localInput.value)},...controlled.open?{open:props.open}:{defaultOpen:localOpen.value},disabled:props.disabled,readOnly:props.readonly,position:props.position,side:props.side,align:props.align,sideOffset:props.sideOffset,collisionPadding:props.collisionPadding,...props.collisionBoundary===void 0?{}:{collisionBoundary:props.collisionBoundary},avoidCollisions:props.avoidCollisions,hideWhenDetached:props.hideWhenDetached,strategy:props.strategy,tracking:props.tracking,onValueChange:({value:value2})=>{localValue.value=value2;emit("update:modelValue",value2)},onInputStateChange:({value:value2})=>{proposedInputState=value2;localInput.value=value2.snapshot.text;emit("update:inputValue",value2.snapshot.text);if(!controlled.input)return;const proposal=value2;void nextTick(()=>{if(connection.value===void 0||proposedInputState!==proposal)return;if(props.inputValue!==proposal.snapshot.text)return;proposedInputState=null;syncControlledValues(proposal)})},onOpenChange:({value:value2})=>{localOpen.value=value2;emit("update:open",value2)},onHighlightedValueChange:({value:value2})=>{highlighted.value=value2;emit("highlight",value2)},onAccept:id=>emit("accept",id),onUpdate:refresh});connection.value.setInputAttributes(props.label);connection.value.setPopupAttributes(props.label);refreshItems();refresh()};let mounted=false;let connectScheduled=false;const scheduleConnect=()=>{if(!mounted||connectScheduled)return;connectScheduled=true;void nextTick(()=>{connectScheduled=false;if(mounted)connect()})};provide(key,{state,position:computed(()=>props.position),strategy:computed(()=>props.strategy),label:computed(()=>props.label),connection:computed(()=>connection.value),matchesItem,hasMatches,registerInput:element=>{const changed=input.value!==element;input.value=element;if(changed)scheduleConnect()},registerPopup:element=>{const changed=popup.value!==element;popup.value=element;if(changed)scheduleConnect()},registerItem:(element,id,disabled)=>connection.value?.setItemAttributes(element,{id,disabled})});onMounted(()=>{mounted=true;connect()});onBeforeUnmount(()=>{mounted=false;connection.value?.disconnect();connection.value=void 0;proposedInputState=null});watch(()=>props.items,(items,previousItems)=>{if(!sameComboboxItems(items,previousItems))connect()});watch([()=>props.disabled,()=>props.readonly,()=>props.label,()=>props.position,()=>props.side,()=>props.align,()=>props.sideOffset,()=>props.collisionPadding,()=>props.collisionBoundary,()=>props.avoidCollisions,()=>props.hideWhenDetached,()=>props.strategy,()=>props.tracking,()=>props.policies],connect);watch([()=>props.modelValue,()=>props.inputValue,()=>props.open],()=>{const inputState=controlled.input&&proposedInputState!==null&&proposedInputState.snapshot.text===props.inputValue?proposedInputState:controlled.input?createTextState(props.inputValue):void 0;proposedInputState=null;syncControlledValues(inputState)});const syncControlledValues=inputState=>{if(connection.value===void 0)return;const result=connection.value.syncControlledValues({...controlled.value?{value:props.modelValue}:{},...controlled.input?{inputState:inputState??createTextState(props.inputValue)}:{},...controlled.open?{open:props.open}:{}});if(!result.ok)throw new TypeError(result.error.message);refresh()};return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,"data-scope":"combobox","data-part":"root","data-state":state.value.open?"open":"closed","data-disabled":props.disabled?"":void 0,"data-readonly":props.readonly?"":void 0}),{default:()=>slots["default"]?.(state.value)})}});const ComboboxInput=defineComponent({name:"SectileComboboxInput",inheritAttrs:false,props:{name:{type:String,default:void 0},form:{type:String,default:void 0},required:{type:Boolean,default:false},as:{type:[String,Object,Function],default:"input"},asChild:{type:Boolean,default:false}},setup(props,{attrs}){const root=useRoot("ComboboxInput");const input=shallowRef(null);const participation=useNativeInputFormControl(input);const renderServerValue=typeof window==="undefined";const registerInput=node=>{input.value=node instanceof HTMLInputElement?node:null;root.registerInput(input.value??void 0)};return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,elementRef:registerInput,type:"text",role:"combobox",...renderServerValue?{value:root.state.value.inputValue}:{},name:props.name,form:props.form,required:props.required,disabled:root.state.value.disabled,readonly:root.state.value.readonly,"aria-label":root.label.value,"aria-autocomplete":"list","aria-expanded":String(root.state.value.open),"data-scope":"combobox","data-part":"input"},participation.controlProps.value))}});const ComboboxContent=defineComponent({name:"SectileComboboxContent",inheritAttrs:false,props:{as:{type:[String,Object,Function],default:"div"},asChild:{type:Boolean,default:false}},slots:Object,setup(props,{attrs,slots}){const root=useRoot("ComboboxContent");const element=shallowRef();const open=computed(()=>root.state.value.open);const present=usePresence(open,element);watch(present,async()=>{await nextTick();root.connection.value?.render()},{flush:"post"});const registerContent=node=>{const content=node instanceof HTMLElement?node:void 0;element.value=content;root.registerPopup(content)};return()=>{const exiting=!open.value&&present.value;return h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,elementRef:registerContent,role:"listbox",hidden:!present.value,"aria-label":root.label.value,...exiting?{inert:true,"aria-hidden":"true"}:{},style:root.position.value?{position:root.strategy.value,visibility:element.value===void 0?"hidden":void 0}:void 0,"data-scope":"combobox","data-part":"content","data-state":open.value?"open":"closed"}),{default:()=>slots["default"]?.(root.state.value)})}}});const ComboboxItem=defineComponent({name:"SectileComboboxItem",inheritAttrs:false,props:{value:{type:String,required:true},disabled:{type:Boolean,default:false},...partProps},slots:Object,setup(props,{attrs,slots}){const root=useRoot("ComboboxItem");const state=computed(()=>({value:props.value,selected:root.state.value.value===props.value,highlighted:root.state.value.highlightedValue===props.value,disabled:root.state.value.disabled||props.disabled}));return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,elementRef:node=>{if(node instanceof HTMLElement)root.registerItem(node,props.value,state.value.disabled)},role:"option",hidden:!root.matchesItem(props.value),"aria-selected":String(state.value.selected),"aria-disabled":state.value.disabled?"true":void 0,"data-sectile-combobox-id":props.value,"data-disabled":state.value.disabled?"true":void 0,"data-scope":"combobox","data-part":"item","data-selected":state.value.selected?"":void 0,"data-highlighted":state.value.highlighted?"":void 0}),{default:()=>slots["default"]?.(state.value)})}});const ComboboxEmpty=defineComponent({name:"SectileComboboxEmpty",inheritAttrs:false,props:partProps,slots:Object,setup(props,{attrs,slots}){const root=useRoot("ComboboxEmpty");return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,role:"status",hidden:root.hasMatches(),"data-scope":"combobox","data-part":"empty"}),{default:()=>slots["default"]?.(root.state.value)})}});function useRoot(part){const root=inject(key);if(root===void 0)throw new TypeError(`${part} must be used inside ComboboxRoot.`);return root}function sameComboboxItems(items,previousItems){return items.length===previousItems.length&&items.every((item,index)=>{const previousItem=previousItems[index];return previousItem!==void 0&&item.id===previousItem.id&&item.label===previousItem.label})}export{ComboboxContent,ComboboxEmpty,ComboboxInput,ComboboxItem,ComboboxRoot};
1
+ import{computed,defineComponent,h,inject,mergeProps,nextTick,onBeforeUnmount,onMounted,provide,shallowRef,watch}from"vue";import{createCombobox}from"@sectile/dom/combobox";import{createTextState}from"@sectile/dom/text";import{Primitive}from"./primitive.js";import{useNativeInputFormControl}from"./internal/form-control.js";import{reconcileCollectionState}from"./internal/collection.js";import{useControlledStateInvariant}from"./internal/controlled-state.js";import{usePresence}from"./internal/presence.js";import{conditionalPresenceProps,useConditionalPresence}from"./internal/conditional-presence.js";const key=Symbol("SectileComboboxRoot");const partProps={as:{type:[String,Object,Function],default:"span"},asChild:{type:Boolean,default:false}};const ComboboxRoot=defineComponent({name:"SectileComboboxRoot",inheritAttrs:false,props:{items:{type:Array,required:true},modelValue:{type:String,default:void 0},defaultValue:{type:String,default:null},inputValue:{type:String,default:void 0},defaultInputValue:{type:String,default:""},open:{type:Boolean,default:void 0},defaultOpen:{type:Boolean,default:false},disabled:{type:Boolean,default:false},readonly:{type:Boolean,default:false},label:{type:String,default:void 0},position:{type:Boolean,default:true},side:{type:String,default:"bottom"},align:{type:String,default:"start"},sideOffset:{type:Number,default:8},collisionPadding:{type:[Number,Object],default:8},collisionBoundary:{type:[String,Object],default:void 0},avoidCollisions:{type:Boolean,default:true},hideWhenDetached:{type:Boolean,default:false},strategy:{type:String,default:"absolute"},tracking:{type:String,default:"events"},policies:{type:Object,default:void 0},as:{type:[String,Object,Function],default:"div"},asChild:{type:Boolean,default:false}},emits:{"update:modelValue":_value=>true,"update:inputValue":_value=>true,"update:open":_value=>true,highlight:_value=>true,accept:_value=>true},slots:Object,setup(props,{attrs,emit,slots}){const input=shallowRef();const popup=shallowRef();const connection=shallowRef();const localValue=shallowRef(props.modelValue!==void 0?props.modelValue:props.defaultValue);const localInput=shallowRef(props.inputValue??props.defaultInputValue);const localOpen=shallowRef(props.open??props.defaultOpen);const highlighted=shallowRef(null);let proposedInputState=null;const controlled={value:useControlledStateInvariant("ComboboxRoot","modelValue",()=>props.modelValue),input:useControlledStateInvariant("ComboboxRoot","inputValue",()=>props.inputValue),open:useControlledStateInvariant("ComboboxRoot","open",()=>props.open)};const state=computed(()=>Object.freeze({value:props.modelValue!==void 0?props.modelValue:localValue.value,inputValue:props.inputValue??localInput.value,highlightedValue:highlighted.value,open:props.open??localOpen.value,disabled:props.disabled,readonly:props.readonly}));const itemLabels=computed(()=>new Map(props.items.map(item=>[item.id,item.label])));const matchingQuery=computed(()=>{const fallback=state.value.inputValue;const text=connection.value?.getSnapshot().state.text;return text===void 0?fallback:text.composition===null?text.snapshot.text:text.composition.baseline.text});const matchesItem=id=>{const label=itemLabels.value.get(id);if(label===void 0)return false;const matches=props.policies?.matches;return matches===void 0||matches(label,matchingQuery.value,id)};const hasMatches=()=>{for(const item of props.items){if(matchesItem(item.id))return true}return false};const refresh=()=>{const snapshot=connection.value?.getSnapshot().state;if(snapshot===void 0)return;localValue.value=snapshot.selection.selected[0]??null;localInput.value=snapshot.text.snapshot.text;localOpen.value=snapshot.popupOpen;highlighted.value=snapshot.cursor.current;refreshItems()};const refreshItems=()=>{if(popup.value===void 0||connection.value===void 0)return;popup.value.querySelectorAll("[data-sectile-combobox-id]").forEach(element=>{const id=element.dataset["sectileComboboxId"];if(id!==void 0)connection.value?.setItemAttributes(element,{id,disabled:element.dataset["disabled"]==="true"})})};const connect=()=>{connection.value?.disconnect();if(input.value===void 0)return;const items=props.items.map(item=>item.id);const requestedValue=controlled.value?props.modelValue:localValue.value;const reconciled=reconcileCollectionState(items,requestedValue===null?[]:[requestedValue],highlighted.value,[],"single",{preserveNullCurrent:true});const value=reconciled.selected[0]??null;localValue.value=value;highlighted.value=reconciled.current;if(controlled.value&&requestedValue!==value)emit("update:modelValue",value);connection.value=createCombobox({input:input.value,...popup.value===void 0?{}:{popup:popup.value},items:props.items,manageVisibility:false,...props.policies===void 0?{}:{policies:props.policies},...controlled.value?{value}:{defaultValue:value},defaultHighlightedValue:reconciled.current,...controlled.input?{inputState:createTextState(props.inputValue)}:{defaultInputState:createTextState(localInput.value)},...controlled.open?{open:props.open}:{defaultOpen:localOpen.value},disabled:props.disabled,readOnly:props.readonly,position:props.position,side:props.side,align:props.align,sideOffset:props.sideOffset,collisionPadding:props.collisionPadding,...props.collisionBoundary===void 0?{}:{collisionBoundary:props.collisionBoundary},avoidCollisions:props.avoidCollisions,hideWhenDetached:props.hideWhenDetached,strategy:props.strategy,tracking:props.tracking,onValueChange:({value:value2})=>{localValue.value=value2;emit("update:modelValue",value2)},onInputStateChange:({value:value2})=>{proposedInputState=value2;localInput.value=value2.snapshot.text;emit("update:inputValue",value2.snapshot.text);if(!controlled.input)return;const proposal=value2;void nextTick(()=>{if(connection.value===void 0||proposedInputState!==proposal)return;if(props.inputValue!==proposal.snapshot.text)return;proposedInputState=null;syncControlledValues(proposal)})},onOpenChange:({value:value2})=>{localOpen.value=value2;emit("update:open",value2)},onHighlightedValueChange:({value:value2})=>{highlighted.value=value2;emit("highlight",value2)},onAccept:id=>emit("accept",id),onUpdate:refresh});connection.value.setInputAttributes(props.label);connection.value.setPopupAttributes(props.label);refreshItems();refresh()};let mounted=false;let connectScheduled=false;const scheduleConnect=()=>{if(!mounted||connectScheduled)return;connectScheduled=true;void nextTick(()=>{connectScheduled=false;if(mounted)connect()})};provide(key,{state,position:computed(()=>props.position),strategy:computed(()=>props.strategy),label:computed(()=>props.label),connection:computed(()=>connection.value),matchesItem,hasMatches,registerInput:element=>{const changed=input.value!==element;input.value=element;if(changed)scheduleConnect()},registerPopup:element=>{const changed=popup.value!==element;popup.value=element;if(changed)scheduleConnect()},registerItem:(element,id,disabled)=>connection.value?.setItemAttributes(element,{id,disabled})});onMounted(()=>{mounted=true;connect()});onBeforeUnmount(()=>{mounted=false;connection.value?.disconnect();connection.value=void 0;proposedInputState=null});watch(()=>props.items,(items,previousItems)=>{if(!sameComboboxItems(items,previousItems))connect()});watch([()=>props.disabled,()=>props.readonly,()=>props.label,()=>props.position,()=>props.side,()=>props.align,()=>props.sideOffset,()=>props.collisionPadding,()=>props.collisionBoundary,()=>props.avoidCollisions,()=>props.hideWhenDetached,()=>props.strategy,()=>props.tracking,()=>props.policies],connect);watch([()=>props.modelValue,()=>props.inputValue,()=>props.open],()=>{const inputState=controlled.input&&proposedInputState!==null&&proposedInputState.snapshot.text===props.inputValue?proposedInputState:controlled.input?createTextState(props.inputValue):void 0;proposedInputState=null;syncControlledValues(inputState)});const syncControlledValues=inputState=>{if(connection.value===void 0)return;const result=connection.value.syncControlledValues({...controlled.value?{value:props.modelValue}:{},...controlled.input?{inputState:inputState??createTextState(props.inputValue)}:{},...controlled.open?{open:props.open}:{}});if(!result.ok)throw new TypeError(result.error.message);refresh()};return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,"data-scope":"combobox","data-part":"root","data-state":state.value.open?"open":"closed","data-disabled":props.disabled?"":void 0,"data-readonly":props.readonly?"":void 0}),{default:()=>slots["default"]?.(state.value)})}});const ComboboxInput=defineComponent({name:"SectileComboboxInput",inheritAttrs:false,props:{name:{type:String,default:void 0},form:{type:String,default:void 0},required:{type:Boolean,default:false},as:{type:[String,Object,Function],default:"input"},asChild:{type:Boolean,default:false}},setup(props,{attrs}){const root=useRoot("ComboboxInput");const input=shallowRef(null);const participation=useNativeInputFormControl(input);const renderServerValue=typeof window==="undefined";const registerInput=node=>{input.value=node instanceof HTMLInputElement?node:null;root.registerInput(input.value??void 0)};return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,elementRef:registerInput,type:"text",role:"combobox",...renderServerValue?{value:root.state.value.inputValue}:{},name:props.name,form:props.form,required:props.required,disabled:root.state.value.disabled,readonly:root.state.value.readonly,"aria-label":root.label.value,"aria-autocomplete":"list","aria-expanded":String(root.state.value.open),"data-scope":"combobox","data-part":"input"},participation.controlProps.value))}});const ComboboxContent=defineComponent({name:"SectileComboboxContent",inheritAttrs:false,props:{as:{type:[String,Object,Function],default:"div"},asChild:{type:Boolean,default:false}},slots:Object,setup(props,{attrs,slots}){const root=useRoot("ComboboxContent");const element=shallowRef();const open=computed(()=>root.state.value.open);const present=usePresence(open,element);watch(present,async()=>{await nextTick();root.connection.value?.render()},{flush:"post"});const registerContent=node=>{const content=node instanceof HTMLElement?node:void 0;element.value=content;root.registerPopup(content)};return()=>{const exiting=!open.value&&present.value;return h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,elementRef:registerContent,role:"listbox",hidden:!present.value,"aria-label":root.label.value,...exiting?{inert:true,"aria-hidden":"true"}:{},style:root.position.value?{position:root.strategy.value,visibility:element.value===void 0?"hidden":void 0}:void 0,"data-scope":"combobox","data-part":"content","data-state":open.value?"open":"closed"}),{default:()=>slots["default"]?.(root.state.value)})}}});const ComboboxItem=defineComponent({name:"SectileComboboxItem",inheritAttrs:false,props:{value:{type:String,required:true},disabled:{type:Boolean,default:false},...partProps},slots:Object,setup(props,{attrs,slots}){const root=useRoot("ComboboxItem");const state=computed(()=>({value:props.value,selected:root.state.value.value===props.value,highlighted:root.state.value.highlightedValue===props.value,disabled:root.state.value.disabled||props.disabled}));return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,elementRef:node=>{if(node instanceof HTMLElement)root.registerItem(node,props.value,state.value.disabled)},role:"option",hidden:!root.matchesItem(props.value),"aria-selected":String(state.value.selected),"aria-disabled":state.value.disabled?"true":void 0,"data-sectile-combobox-id":props.value,"data-disabled":state.value.disabled?"true":void 0,"data-scope":"combobox","data-part":"item","data-selected":state.value.selected?"":void 0,"data-highlighted":state.value.highlighted?"":void 0}),{default:()=>slots["default"]?.(state.value)})}});const ComboboxEmpty=defineComponent({name:"SectileComboboxEmpty",inheritAttrs:false,props:{...partProps,...conditionalPresenceProps},slots:Object,setup(props,{attrs,slots}){const root=useRoot("ComboboxEmpty");const active=computed(()=>!root.hasMatches());const forcePresent=computed(()=>props.forcePresent);const presence=useConditionalPresence(active,forcePresent);return()=>{const inactivePresent=!active.value&&presence.present.value;return h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,elementRef:presence.register,role:active.value?"status":void 0,"aria-live":active.value?void 0:"off",hidden:presence.hidden.value,...inactivePresent?{inert:true,"aria-hidden":"true"}:{},"data-scope":"combobox","data-part":"empty","data-state":active.value?"visible":"hidden"}),{default:()=>slots["default"]?.(root.state.value)})}}});function useRoot(part){const root=inject(key);if(root===void 0)throw new TypeError(`${part} must be used inside ComboboxRoot.`);return root}function sameComboboxItems(items,previousItems){return items.length===previousItems.length&&items.every((item,index)=>{const previousItem=previousItems[index];return previousItem!==void 0&&item.id===previousItem.id&&item.label===previousItem.label})}export{ComboboxContent,ComboboxEmpty,ComboboxInput,ComboboxItem,ComboboxRoot};
2
2
  //# sourceMappingURL=combobox.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/combobox.ts"],"mappings":"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","names":["value"],"file":"combobox.js"}
1
+ {"version":3,"sources":["../src/combobox.ts"],"mappings":"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","names":["value"],"file":"combobox.js"}
@@ -1,5 +1,6 @@
1
1
  import { type PropType, type SlotsType, type VNodeChild } from 'vue';
2
2
  import { type PrimitiveAs } from './primitive.js';
3
+ import { type ConditionalPresenceProps } from './internal/conditional-presence.js';
3
4
  export interface DisclosureRootProps {
4
5
  readonly modelValue?: boolean;
5
6
  readonly defaultValue?: boolean;
@@ -18,7 +19,7 @@ export interface DisclosureTriggerProps {
18
19
  readonly as?: PrimitiveAs;
19
20
  readonly asChild?: boolean;
20
21
  }
21
- export interface DisclosureContentProps {
22
+ export interface DisclosureContentProps extends ConditionalPresenceProps {
22
23
  readonly as?: PrimitiveAs;
23
24
  readonly asChild?: boolean;
24
25
  }
@@ -121,6 +122,10 @@ export declare const DisclosureTrigger: import("vue").DefineComponent<import("vu
121
122
  default: (props: DisclosureSlotProps) => VNodeChild;
122
123
  }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
123
124
  export declare const DisclosureContent: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
125
+ forcePresent: {
126
+ readonly type: BooleanConstructor;
127
+ readonly default: false;
128
+ };
124
129
  as: {
125
130
  type: PropType<PrimitiveAs>;
126
131
  default: string;
@@ -130,6 +135,10 @@ export declare const DisclosureContent: import("vue").DefineComponent<import("vu
130
135
  default: boolean;
131
136
  };
132
137
  }>, () => VNodeChild, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
138
+ forcePresent: {
139
+ readonly type: BooleanConstructor;
140
+ readonly default: false;
141
+ };
133
142
  as: {
134
143
  type: PropType<PrimitiveAs>;
135
144
  default: string;
@@ -139,6 +148,7 @@ export declare const DisclosureContent: import("vue").DefineComponent<import("vu
139
148
  default: boolean;
140
149
  };
141
150
  }>> & Readonly<{}>, {
151
+ forcePresent: boolean;
142
152
  as: PrimitiveAs;
143
153
  asChild: boolean;
144
154
  }, SlotsType<{
@@ -1,2 +1,2 @@
1
- import{computed,defineComponent,h,inject,mergeProps,provide,shallowRef,watch}from"vue";import{createDisclosureController,getDisclosureContentAttributes,getDisclosureTriggerAttributes}from"@sectile/dom/disclosure";import{Primitive}from"./primitive.js";import{useHostId}from"./host-provider.js";import{useControlledStateInvariant}from"./internal/controlled-state.js";const disclosureContextKey=Symbol("SectileDisclosure");const DisclosureRoot=defineComponent({name:"SectileDisclosureRoot",inheritAttrs:false,props:{modelValue:{type:Boolean,default:void 0},defaultValue:{type:Boolean,default:false},disabled:{type:Boolean,default:false},readonly:{type:Boolean,default:false},contentId:{type:String,default:void 0},as:{type:[String,Object,Function],default:"div"},asChild:{type:Boolean,default:false}},emits:{"update:modelValue":_value=>true},slots:Object,setup(props,{attrs,emit,slots}){const controlled=useControlledStateInvariant("DisclosureRoot","modelValue",()=>props.modelValue);const generatedId=useHostId();const contentId=props.contentId??`sectile-disclosure-${generatedId}`;const controller=shallowRef(createController(controlled,controlled?props.modelValue:props.defaultValue,props,emit));const snapshot=shallowRef(controller.value.getSnapshot());const refresh=()=>{snapshot.value=controller.value.getSnapshot()};const rebuild=()=>{const open=controlled?props.modelValue:snapshot.value.state.open;controller.value=createController(controlled,open,props,emit);refresh()};watch(()=>props.modelValue,value=>{if(!controlled||value===void 0)return;const result=controller.value.syncControlledValue(value);if(!result.ok)throw new TypeError(result.error.message);snapshot.value=result.value});watch([()=>props.disabled,()=>props.readonly],rebuild);const slotProps=computed(()=>Object.freeze({open:snapshot.value.state.open,disabled:props.disabled,readonly:props.readonly}));const toggle=()=>{if(controller.value.handleEvent("toggle"))refresh()};provide(disclosureContextKey,{slotProps,contentId,toggle});return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,"data-scope":"disclosure","data-part":"root","data-state":slotProps.value.open?"open":"closed","data-disabled":props.disabled?"":void 0,"data-readonly":props.readonly?"":void 0}),{default:()=>slots["default"]?.(slotProps.value)})}});const DisclosureTrigger=defineComponent({name:"SectileDisclosureTrigger",inheritAttrs:false,props:{as:{type:[String,Object,Function],default:"button"},asChild:{type:Boolean,default:false}},slots:Object,setup(props,{attrs,slots}){const context=useDisclosureContext("DisclosureTrigger");const attributes=computed(()=>getDisclosureTriggerAttributes({open:context.slotProps.value.open},{panelID:context.contentId,disabled:context.slotProps.value.disabled,readOnly:context.slotProps.value.readonly,native:true}));const handleClick=event=>{if(!event.defaultPrevented)context.toggle()};return()=>h(Primitive,mergeProps(attrs,attributes.value,{as:props.as,asChild:props.asChild,...props.as==="button"&&!props.asChild?{type:"button"}:{},onClick:handleClick}),{default:()=>slots["default"]?.(context.slotProps.value)})}});const DisclosureContent=defineComponent({name:"SectileDisclosureContent",inheritAttrs:false,props:{as:{type:[String,Object,Function],default:"div"},asChild:{type:Boolean,default:false}},slots:Object,setup(props,{attrs,slots}){const context=useDisclosureContext("DisclosureContent");const attributes=computed(()=>getDisclosureContentAttributes({open:context.slotProps.value.open},{id:context.contentId}));return()=>h(Primitive,mergeProps(attrs,attributes.value,{as:props.as,asChild:props.asChild}),{default:()=>slots["default"]?.(context.slotProps.value)})}});function useDisclosureContext(part){const context=inject(disclosureContextKey);if(context===void 0)throw new TypeError(`${part} must be used inside DisclosureRoot.`);return context}function createController(controlled,open,props,emit){const result=createDisclosureController({...controlled?{open}:{defaultOpen:open},disabled:props.disabled,readOnly:props.readonly,onOpenChange:next=>emit("update:modelValue",next)});if(!result.ok)throw new TypeError(result.error.message);return result.value}export{DisclosureContent,DisclosureRoot,DisclosureTrigger};
1
+ import{computed,defineComponent,h,inject,mergeProps,provide,shallowRef,watch}from"vue";import{createDisclosureController,getDisclosureContentAttributes,getDisclosureTriggerAttributes}from"@sectile/dom/disclosure";import{Primitive}from"./primitive.js";import{useHostId}from"./host-provider.js";import{useControlledStateInvariant}from"./internal/controlled-state.js";import{conditionalPresenceProps,useConditionalPresence}from"./internal/conditional-presence.js";const disclosureContextKey=Symbol("SectileDisclosure");const DisclosureRoot=defineComponent({name:"SectileDisclosureRoot",inheritAttrs:false,props:{modelValue:{type:Boolean,default:void 0},defaultValue:{type:Boolean,default:false},disabled:{type:Boolean,default:false},readonly:{type:Boolean,default:false},contentId:{type:String,default:void 0},as:{type:[String,Object,Function],default:"div"},asChild:{type:Boolean,default:false}},emits:{"update:modelValue":_value=>true},slots:Object,setup(props,{attrs,emit,slots}){const controlled=useControlledStateInvariant("DisclosureRoot","modelValue",()=>props.modelValue);const generatedId=useHostId();const contentId=props.contentId??`sectile-disclosure-${generatedId}`;const controller=shallowRef(createController(controlled,controlled?props.modelValue:props.defaultValue,props,emit));const snapshot=shallowRef(controller.value.getSnapshot());const refresh=()=>{snapshot.value=controller.value.getSnapshot()};const rebuild=()=>{const open=controlled?props.modelValue:snapshot.value.state.open;controller.value=createController(controlled,open,props,emit);refresh()};watch(()=>props.modelValue,value=>{if(!controlled||value===void 0)return;const result=controller.value.syncControlledValue(value);if(!result.ok)throw new TypeError(result.error.message);snapshot.value=result.value});watch([()=>props.disabled,()=>props.readonly],rebuild);const slotProps=computed(()=>Object.freeze({open:snapshot.value.state.open,disabled:props.disabled,readonly:props.readonly}));const toggle=()=>{if(controller.value.handleEvent("toggle"))refresh()};provide(disclosureContextKey,{slotProps,contentId,toggle});return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,"data-scope":"disclosure","data-part":"root","data-state":slotProps.value.open?"open":"closed","data-disabled":props.disabled?"":void 0,"data-readonly":props.readonly?"":void 0}),{default:()=>slots["default"]?.(slotProps.value)})}});const DisclosureTrigger=defineComponent({name:"SectileDisclosureTrigger",inheritAttrs:false,props:{as:{type:[String,Object,Function],default:"button"},asChild:{type:Boolean,default:false}},slots:Object,setup(props,{attrs,slots}){const context=useDisclosureContext("DisclosureTrigger");const attributes=computed(()=>getDisclosureTriggerAttributes({open:context.slotProps.value.open},{panelID:context.contentId,disabled:context.slotProps.value.disabled,readOnly:context.slotProps.value.readonly,native:true}));const handleClick=event=>{if(!event.defaultPrevented)context.toggle()};return()=>h(Primitive,mergeProps(attrs,attributes.value,{as:props.as,asChild:props.asChild,...props.as==="button"&&!props.asChild?{type:"button"}:{},onClick:handleClick}),{default:()=>slots["default"]?.(context.slotProps.value)})}});const DisclosureContent=defineComponent({name:"SectileDisclosureContent",inheritAttrs:false,props:{...conditionalPresenceProps,as:{type:[String,Object,Function],default:"div"},asChild:{type:Boolean,default:false}},slots:Object,setup(props,{attrs,slots}){const context=useDisclosureContext("DisclosureContent");const active=computed(()=>context.slotProps.value.open);const forcePresent=computed(()=>props.forcePresent);const presence=useConditionalPresence(active,forcePresent);const attributes=computed(()=>getDisclosureContentAttributes({open:context.slotProps.value.open},{id:context.contentId}));return()=>{const inactivePresent=!active.value&&presence.present.value;return h(Primitive,mergeProps(attrs,attributes.value,{as:props.as,asChild:props.asChild,elementRef:presence.register,hidden:presence.hidden.value,...inactivePresent?{inert:true,"aria-hidden":"true"}:{}}),{default:()=>slots["default"]?.(context.slotProps.value)})}}});function useDisclosureContext(part){const context=inject(disclosureContextKey);if(context===void 0)throw new TypeError(`${part} must be used inside DisclosureRoot.`);return context}function createController(controlled,open,props,emit){const result=createDisclosureController({...controlled?{open}:{defaultOpen:open},disabled:props.disabled,readOnly:props.readonly,onOpenChange:next=>emit("update:modelValue",next)});if(!result.ok)throw new TypeError(result.error.message);return result.value}export{DisclosureContent,DisclosureRoot,DisclosureTrigger};
2
2
  //# sourceMappingURL=disclosure.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/disclosure.ts"],"mappings":"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","names":[],"file":"disclosure.js"}
1
+ {"version":3,"sources":["../src/disclosure.ts"],"mappings":"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","names":[],"file":"disclosure.js"}
package/dist/form.d.ts CHANGED
@@ -4,6 +4,7 @@ import { type FormFieldPath } from '@sectile/form/path';
4
4
  import type { StandardSchemaV1 } from '@sectile/form/schema';
5
5
  import { compositeControlCapabilities, hiddenInputSubmissionCapabilities, hiddenSelectSubmissionCapabilities, hiddenValueSubmissionCapabilities, nativeInputControlCapabilities, provideFormControlOwner, useCompositeFormControl, useFormControl, useNativeInputFormControl, type FormControlCapabilities, type FormControlParticipation, type FormControlRegistration, type FormElementSource, type FormLabelMode, type FormMetadataAttribute, type FormSubmissionCapabilities, type FormSubmissionRegistration, type FormSubmissionSource } from './internal/form-control.js';
6
6
  import { type PrimitiveAs } from './primitive.js';
7
+ import type { ConditionalPresenceProps } from './internal/conditional-presence.js';
7
8
  export interface FormState extends DomainFormState<string> {
8
9
  }
9
10
  export interface FormFieldState extends DomainFormFieldState<string> {
@@ -216,6 +217,10 @@ export interface FormPartProps {
216
217
  readonly as?: PrimitiveAs;
217
218
  readonly asChild?: boolean;
218
219
  }
220
+ export interface FormMessageProps extends FormPartProps, ConditionalPresenceProps {
221
+ }
222
+ export interface FormSummaryProps extends FormPartProps, ConditionalPresenceProps {
223
+ }
219
224
  export declare const FormRoot: FormRootComponent;
220
225
  export declare function useFormSelector<Selected>(selector: FormSelectorFunction<Selected>, options?: FormSubscribeOptions<Selected>): Readonly<ShallowRef<Selected>>;
221
226
  export declare function useFormFieldSelector<Selected>(id: string, selector: FormFieldSelectorFunction<Selected>, options?: FormSubscribeOptions<Selected>): Readonly<ShallowRef<Selected>>;
@@ -344,54 +349,7 @@ export declare const FormDescription: import("vue").DefineComponent<import("vue"
344
349
  asChild: boolean;
345
350
  as: PrimitiveAs;
346
351
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
347
- export declare const FormMessage: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
348
- asChild: {
349
- type: BooleanConstructor;
350
- default: boolean;
351
- };
352
- as: {
353
- type: PropType<PrimitiveAs>;
354
- default: string;
355
- };
356
- }>, () => VNodeChild, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
357
- asChild: {
358
- type: BooleanConstructor;
359
- default: boolean;
360
- };
361
- as: {
362
- type: PropType<PrimitiveAs>;
363
- default: string;
364
- };
365
- }>> & Readonly<{}>, {
366
- asChild: boolean;
367
- as: PrimitiveAs;
368
- }, SlotsType<{
369
- default: (props: FormFieldSlotProps) => VNodeChild;
370
- }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
371
- export declare const FormSummary: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
372
- as: {
373
- type: PropType<PrimitiveAs>;
374
- default: string;
375
- };
376
- asChild: {
377
- type: BooleanConstructor;
378
- default: boolean;
379
- };
380
- }>, () => VNodeChild, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
381
- as: {
382
- type: PropType<PrimitiveAs>;
383
- default: string;
384
- };
385
- asChild: {
386
- type: BooleanConstructor;
387
- default: boolean;
388
- };
389
- }>> & Readonly<{}>, {
390
- as: PrimitiveAs;
391
- asChild: boolean;
392
- }, SlotsType<{
393
- default: (props: FormSummarySlotProps) => VNodeChild;
394
- }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
352
+ export { FormMessage, FormSummary } from './internal/form-presence-parts.js';
395
353
  export declare const FormReset: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
396
354
  asChild: {
397
355
  type: BooleanConstructor;
package/dist/form.js CHANGED
@@ -1,2 +1,2 @@
1
- import{computed,defineComponent,h,inject,mergeProps,nextTick,onBeforeUnmount,onMounted,onScopeDispose,provide,shallowRef,watch}from"vue";import{createForm}from"@sectile/dom/form";import{getFormFieldIDByPath,getFormIssuesBySource}from"@sectile/form/state";import{appendFormFieldPath,encodeFormFieldPath,tryCreateFormFieldPath}from"@sectile/form/path";import{compositeControlCapabilities,hiddenInputSubmissionCapabilities,hiddenSelectSubmissionCapabilities,hiddenValueSubmissionCapabilities,nativeInputControlCapabilities,provideFormControlFieldContext,provideFormControlOwner,useCompositeFormControl,useFormControl,useNativeInputFormControl}from"./internal/form-control.js";import{useNextTickTask}from"./internal/scheduled-task.js";import{Primitive}from"./primitive.js";import{useHostId}from"./host-provider.js";function defineFormSubmission(definition){return Object.freeze({...definition})}const formContextKey=Symbol("SectileForm");const formFieldContextKey=Symbol("SectileFormField");const emptyState=Object.freeze({validation:Object.freeze({generation:0,status:"idle",trigger:null,intent:null}),submission:Object.freeze({generation:0,status:"idle",count:0,failure:null}),touched:false,dirty:false,valid:true,fields:Object.freeze([]),issues:Object.freeze([]),allIssues:Object.freeze([])});const partProps={as:{type:[String,Object,Function],default:"div"},asChild:{type:Boolean,default:false}};const FormRootImpl=defineComponent({name:"SectileFormRoot",inheritAttrs:false,props:{issues:{type:Array,default:()=>[]},schema:{type:Object,default:void 0},validate:{type:Function,default:void 0},validateOn:{type:Array,default:()=>[]},revalidateOn:{type:Array,default:()=>["input"]},onSubmit:{type:Function,default:void 0},mapSubmitError:{type:Function,default:void 0}},emits:{reset:()=>true,stateChange:_state=>true},slots:Object,setup(props,{attrs,emit,expose,slots}){const root=shallowRef(null);const summary=shallowRef(null);const summaryId=`${useHostId()}-summary`;const connection=shallowRef(null);const participants=new Map;const fieldDiagnostics=new Map;let syncConfiguredIssues=()=>{};let syncFieldDiagnostics=()=>{};const register=participant=>{const existing=participants.get(participant.id);existing?.unregister?.();const registered={participant};participants.set(participant.id,registered);if(connection.value!==null)registered.unregister=connection.value.registerParticipant(participant);void nextTick(()=>{syncConfiguredIssues();syncFieldDiagnostics()});return()=>{if(participants.get(participant.id)!==registered)return;registered.unregister?.();participants.delete(participant.id);void nextTick(()=>{syncConfiguredIssues();syncFieldDiagnostics()})}};const setFieldDiagnostic=(id,issue)=>{if(issue===null)fieldDiagnostics.delete(id);else fieldDiagnostics.set(id,issue);void nextTick(syncFieldDiagnostics)};const submit=payload=>{const handler=props.onSubmit;if(handler===void 0)return;const target=connection.value;if(target===null)return;let result;try{result=handler(toFormSubmitEvent(payload))}catch(error){return{ok:false,failure:mapSubmissionError(props.mapSubmitError,error)}}const settle=resolved=>{if(typeof resolved!=="object"||resolved===null||resolved.ok!==false){return{ok:true}}const issues=resolveIssueInputs(target,"server",resolved.issues??[]);const failure=resolved.failure??(issues.length===0?submissionErrorFailure():void 0);return{ok:false,...failure===void 0?{}:{failure},...issues.length===0?{}:{issues}}};if(isPromiseLike(result)){return Promise.resolve(result).then(settle,error=>({ok:false,failure:mapSubmissionError(props.mapSubmitError,error)}))}return settle(result)};const configuration=()=>({...summary.value===null?{}:{summary:summary.value},renderSummaryContent:false,...props.schema===void 0?{}:{schema:props.schema},...props.validate===void 0?{}:{validate:props.validate},validateOn:props.validateOn,revalidateOn:props.revalidateOn,...props.onSubmit===void 0?{}:{onSubmit:submit},onReset:()=>{emit("reset");void nextTick(syncFieldDiagnostics)},onStateChange:next=>{emit("stateChange",next)}});syncConfiguredIssues=()=>{const target=connection.value;if(target===null)return;target.replaceIssues("form",resolveIssueInputs(target,"form",props.issues))};syncFieldDiagnostics=()=>{connection.value?.replaceIssues("field",[...fieldDiagnostics.values()])};const mount=()=>{if(root.value===null)return;connection.value?.destroy();connection.value=createForm({form:root.value,...configuration()});for(const registered of participants.values()){registered.unregister=connection.value.registerParticipant(registered.participant)}syncConfiguredIssues();syncFieldDiagnostics();emit("stateChange",connection.value.state)};const mountTask=useNextTickTask(mount);onMounted(mountTask.schedule);onBeforeUnmount(()=>{mountTask.cancel();connection.value?.destroy();connection.value=null});watch([summary,()=>props.schema,()=>props.validate,()=>[...props.validateOn],()=>[...props.revalidateOn],()=>props.onSubmit,()=>props.mapSubmitError],()=>{void nextTick(()=>connection.value?.reconfigure(configuration()))});watch(()=>props.issues,()=>{void nextTick(syncConfiguredIssues)},{deep:true});const actions={submitStarted:()=>connection.value?.submitStarted()??null,submitSucceeded:generation=>connection.value?.submitSucceeded(generation)??false,submitFailed:(generation,result)=>connection.value?.submitFailed(generation,result)??false,replaceIssues:(source,issues)=>connection.value?.replaceIssues(source,issues)??false,reinitialize:options=>connection.value?.reinitialize(options),reset:()=>connection.value?.reset()};const formContext={summary,summaryId,register,setFieldDiagnostic,connection};provide(formContextKey,formContext);const validation=useFormSelectorFromContext(formContext,()=>current=>current.validation);const submission=useFormSelectorFromContext(formContext,()=>current=>current.submission);const selectedState=useFormSelectorFromContext(formContext,()=>current=>current);const valid=useFormSelectorFromContext(formContext,()=>current=>current.valid);const touched=useFormSelectorFromContext(formContext,()=>current=>current.touched);const dirty=useFormSelectorFromContext(formContext,()=>current=>current.dirty);const slotProps=Object.freeze({get state(){return selectedState.value},get validation(){return validation.value},get submission(){return submission.value},get valid(){return valid.value},get touched(){return touched.value},get dirty(){return dirty.value},get submitted(){return submission.value.count>0},get submitCount(){return submission.value.count},...actions});expose(actions);return()=>h("form",mergeProps(attrs,{ref:element=>{root.value=element},"data-scope":"form","data-part":"root","data-validation-status":validation.value.status,"data-submission-status":submission.value.status}),slots["default"]?.(slotProps)??[])}});const FormRoot=FormRootImpl;function toFormSubmitEvent(payload){return Object.freeze({formData:payload.formData,values:payload.values,submitter:payload.submitter,state:payload.state,reinitialize:payload.reinitialize,nativeEvent:payload.event,get defaultPrevented(){return payload.event.defaultPrevented},preventDefault:()=>payload.event.preventDefault(),stopPropagation:()=>payload.event.stopPropagation(),stopImmediatePropagation:()=>payload.event.stopImmediatePropagation()})}function isPromiseLike(value){return typeof value==="object"&&value!==null&&"then"in value&&typeof value.then==="function"}function resolveIssueInputs(target,source,input){const state=target.getSnapshot().state;return Object.freeze(input.map((issue,index)=>{const owner=issue.path===void 0?null:getFormFieldIDByPath(state,issue.path);const relatedFieldIds=new Set;for(const path of issue.relatedPaths??[]){const related2=getFormFieldIDByPath(state,path);if(related2!==null&&related2!==owner)relatedFieldIds.add(related2)}const related=Object.freeze([...relatedFieldIds]);return Object.freeze({id:issue.id??`form-${source}-issue-${index+1}`,message:issue.message,source,...owner===null?{}:{fieldId:owner},...related.length===0?{}:{relatedFieldIds:related}})}))}function safeEncodeFormFieldPath(path){const result=tryCreateFormFieldPath(path);return result.ok?encodeFormFieldPath(result.value):null}function mapSubmissionError(mapper,reason){if(mapper!==void 0){try{const mapped=mapper(reason);if(mapped!==void 0)return Object.freeze({message:mapped.message})}catch{}}return submissionErrorFailure()}function submissionErrorFailure(){return Object.freeze({message:"Form submission failed."})}function useFormSelectorFromContext(context,selectorSource,equalsSource=()=>Object.is){const initialSelector=selectorSource();const selected=shallowRef(initialSelector(context.connection.value?.state??emptyState));let unsubscribe;const stop=watch([context.connection,selectorSource,equalsSource],([target,selector,equals])=>{unsubscribe?.();unsubscribe=void 0;const next=selector(target?.state??emptyState);if(!equals(selected.value,next))selected.value=next;if(target!==null){unsubscribe=target.subscribeForm(selector,value=>{selected.value=value},{equals})}},{immediate:true,flush:"sync"});onScopeDispose(()=>{unsubscribe?.();stop()});return selected}function useFormFieldSelectorFromContext(context,idSource,selectorSource,equalsSource=()=>Object.is){const initialSelector=selectorSource();const selected=shallowRef(initialSelector(context.connection.value?.getField(idSource())??null));let unsubscribe;const stop=watch([context.connection,idSource,selectorSource,equalsSource],([target,id,selector,equals])=>{unsubscribe?.();unsubscribe=void 0;const next=selector(target?.getField(id)??null);if(!equals(selected.value,next))selected.value=next;if(target!==null){unsubscribe=target.subscribeField(id,selector,value=>{selected.value=value},{equals})}},{immediate:true,flush:"sync"});onScopeDispose(()=>{unsubscribe?.();stop()});return selected}function useFormSelector(selector,options={}){const context=useFormContext("useFormSelector");return useFormSelectorFromContext(context,()=>selector,()=>options.equals??Object.is)}function useFormFieldSelector(id,selector,options={}){const context=useFormContext("useFormFieldSelector");return useFormFieldSelectorFromContext(context,()=>id,()=>selector,()=>options.equals??Object.is)}function useFormFieldController(id){const context=useFormContext("useFormFieldController");const state=useFormFieldSelectorFromContext(context,()=>id,()=>field=>field);return Object.freeze({state,setMeta:meta=>context.connection.value?.setFieldMeta(id,meta)??false,replaceIssues:(source,issues)=>context.connection.value?.replaceFieldIssues(id,source,issues)??false,upsertIssue:issue=>context.connection.value?.upsertFieldIssue(id,issue)??false,removeIssue:issueId=>context.connection.value?.removeFieldIssue(id,issueId)??false,clearIssues:source=>context.connection.value?.clearFieldIssues(id,source)??false})}const FormSelectorRuntime=defineComponent({name:"SectileFormSelector",props:{select:{type:Function,required:true},equals:{type:Function,default:Object.is}},slots:Object,setup(props,{slots}){const context=useFormContext("FormSelector");const selected=useFormSelectorFromContext(context,()=>props.select,()=>props.equals);return()=>slots["default"]?.({selected:selected.value})??[]}});const FormSelector=FormSelectorRuntime;const FormFieldSelectorRuntime=defineComponent({name:"SectileFormFieldSelector",props:{id:{type:String,required:true},select:{type:Function,required:true},equals:{type:Function,default:Object.is}},slots:Object,setup(props,{slots}){const context=useFormContext("FormFieldSelector");const selected=useFormFieldSelectorFromContext(context,()=>props.id,()=>props.select,()=>props.equals);return()=>slots["default"]?.({selected:selected.value})??[]}});const FormFieldSelector=FormFieldSelectorRuntime;const FormField=defineComponent({name:"SectileFormField",inheritAttrs:false,props:{id:{type:String,default:void 0},name:{type:[String,Array],default:void 0},form:{type:String,default:void 0},required:{type:Boolean,default:void 0},disabled:{type:Boolean,default:void 0},readonly:{type:Boolean,default:void 0},...partProps},slots:Object,setup(props,{attrs,slots}){const formContext=useFormContext("FormField");const generatedId=useHostId();const id=computed(()=>props.id??`form-field-${generatedId}`);const nameKey=computed(()=>props.name===void 0?void 0:safeEncodeFormFieldPath(props.name)??void 0);const root=shallowRef(null);const controls=shallowRef([]);const fallback=shallowRef(null);const nativeFallbackProblem=shallowRef(null);const appliedAttributes=new Map;let observer;let unregister;let diagnosticId;let observedTargets=[];let warnedMultipleControls=false;const activeRegistrations=computed(()=>controls.value.filter(registration=>resolveElement(registration.element)!==null));const activeControl=computed(()=>activeRegistrations.value.length===1?activeRegistrations.value[0]:controls.value.length===0?fallback.value:null);const labelMode=computed(()=>activeControl.value?.labelMode??"for");const semanticControl=()=>{const registration=activeControl.value;if(registration===void 0||registration===null)return null;return resolveElement(registration.semanticControl??registration.element)};const effectiveControlId=computed(()=>semanticControl()?.getAttribute("id")?.trim()||`${id.value}-control`);const fieldState=useFormFieldSelectorFromContext(formContext,()=>id.value,()=>field=>field);const fieldActions=Object.freeze({setMeta:meta=>formContext.connection.value?.setFieldMeta(id.value,meta)??false,replaceIssues:(source,issues)=>formContext.connection.value?.replaceFieldIssues(id.value,source,issues)??false,upsertIssue:issue=>formContext.connection.value?.upsertFieldIssue(id.value,issue)??false,removeIssue:issueId=>formContext.connection.value?.removeFieldIssue(id.value,issueId)??false,clearIssues:source=>formContext.connection.value?.clearFieldIssues(id.value,source)??false});const slotProps=computed(()=>{const current=fieldState.value;const descriptionId=`${id.value}-description`;const messageId=`${id.value}-message`;const relatedIssues=current?.relatedIssues??[];const describedBy=`${descriptionId} ${messageId}${relatedIssues.length===0?"":` ${formContext.summaryId}`}`;const valid=current?.valid??true;return Object.freeze({id:id.value,controlId:effectiveControlId.value,labelId:`${id.value}-label`,descriptionId,messageId,describedBy,valid,touched:current?.touched??false,dirty:current?.dirty??false,issues:current?.issues??[],relatedIssues,...fieldActions})});const attributesFor=registration=>{const explicit=new Set(registration.explicit??[]);const capabilities=registration.capabilities??{};const attributes={};const assign=(attribute,value)=>{if(!explicit.has(attribute)&&value!==void 0)attributes[attribute]=value};if(capabilities.id===true)assign("id",slotProps.value.controlId);if(capabilities.describedBy===true){assign("aria-describedby",slotProps.value.describedBy);assign("aria-errormessage",slotProps.value.issues.length>0?slotProps.value.messageId:slotProps.value.relatedIssues.length>0?formContext.summaryId:slotProps.value.messageId)}if(capabilities.invalid===true&&!slotProps.value.valid)assign("aria-invalid","true");if(capabilities.labelledBy===true&&labelMode.value==="labelledby"){assign("aria-labelledby",slotProps.value.labelId)}if(capabilities.required===true&&props.required===true)assign("required",true);else if(labelMode.value!=="for"&&props.required===true)assign("aria-required","true");if(capabilities.disabled===true&&props.disabled===true)assign("disabled",true);else if(labelMode.value!=="for"&&props.disabled===true)assign("aria-disabled","true");if(capabilities.readonly===true&&props.readonly===true)assign("readonly",true);else if(labelMode.value!=="for"&&props.readonly===true)assign("aria-readonly","true");if(labelMode.value!=="for"){const refreshValue=()=>{queueMicrotask(()=>formContext.connection.value?.refreshParticipant(id.value))};attributes["onClick"]=refreshValue;attributes["onKeydown"]=refreshValue}return Object.freeze(attributes)};const restoreControlAttributes=()=>{for(const[element,attributes]of appliedAttributes){for(const[name,previous]of attributes){if(previous===null)element.removeAttribute(name);else element.setAttribute(name,previous)}}appliedAttributes.clear()};const applyControlAttributes=()=>{restoreControlAttributes();const registration=activeControl.value;if(registration===void 0||registration===null)return;const semantic=resolveElement(registration.semanticControl??registration.element);if(semantic!==null){applyMetadata(semantic,attributesFor(registration),registration.explicit,appliedAttributes)}for(const submission of resolveSubmissionRegistrations(registration)){const element=resolveElement(submission.element);if(element===null)continue;const capabilities=submission.capabilities??nativeSubmissionCapabilities(element);const explicit=submission.explicit??registration.explicit;const attributes={};if(capabilities.name===true&&nameKey.value!==void 0){const submissionName=safeEncodeSubmissionName(nameKey.value,submission.relativeName);if(submissionName!==null)attributes["name"]=submissionName}if(capabilities.form===true&&props.form!==void 0)attributes["form"]=props.form;if(capabilities.required===true&&props.required===true)attributes["required"]=true;if(capabilities.disabled===true&&props.disabled===true)attributes["disabled"]=true;if(capabilities.readonly===true&&props.readonly===true)attributes["readonly"]=true;applyMetadata(element,attributes,explicit,appliedAttributes)}};const discoverNativeFallback=()=>{if(controls.value.length>0||root.value===null){fallback.value=null;nativeFallbackProblem.value=null;return}const candidates=nativeCandidates(root.value);const discovered=createNativeFallbackRegistration(root.value,candidates);nativeFallbackProblem.value=discovered.problem;if(discovered.registration===null){fallback.value=null;return}const next=discovered.registration;const current=fallback.value;if(current!==null&&resolveElement(current.semanticControl??current.element)===resolveElement(next.semanticControl??next.element)&&sameSubmissionElements(resolveSubmissionRegistrations(current),resolveSubmissionRegistrations(next)))return;fallback.value=next};const syncDiagnostic=()=>{const currentId=id.value;if(diagnosticId!==void 0&&diagnosticId!==currentId){formContext.setFieldDiagnostic(diagnosticId,null)}diagnosticId=currentId;let message=null;if(props.name!==void 0&&nameKey.value===void 0){message="FormField received an invalid field path."}else if(activeRegistrations.value.length>1){message="FormField received multiple active controls. Register one composite control with explicit targets."}else if(controls.value.length>0&&activeRegistrations.value.length===0){message="FormField has no mounted control target."}else if(nativeFallbackProblem.value!==null){message=nativeFallbackProblem.value}else{const registration=activeControl.value;if(registration!==null&&registration!==void 0){const invalidRelativeName=resolveSubmissionRegistrations(registration).some(submission=>submission.relativeName!==void 0&&nameKey.value!==void 0&&safeEncodeSubmissionName(nameKey.value,submission.relativeName)===null);if(invalidRelativeName)message="FormField received an invalid relative submission path."}}formContext.setFieldDiagnostic(currentId,message===null?null:Object.freeze({id:`${currentId}:composition`,fieldId:currentId,message,source:"field"}))};const refreshParticipantTargets=()=>{const registration=activeControl.value;const next=registration===null||registration===void 0?root.value===null?[]:[root.value]:[root.value,resolveElement(registration.semanticControl??registration.element),resolveElement(registration.focusTarget??registration.element),resolveElement(registration.validationTarget??registration.element),...resolveSubmissionRegistrations(registration).map(submission=>resolveElement(submission.element))].filter(element=>element!==null);if(next.length===observedTargets.length&&next.every((element,index)=>element===observedTargets[index]))return;observedTargets=Object.freeze([...next]);formContext.connection.value?.refreshParticipant(id.value)};const registerControl=registration=>{controls.value=[...controls.value,registration];fallback.value=null;void nextTick(()=>{if(!warnedMultipleControls&&activeRegistrations.value.length>1){warnedMultipleControls=true;console.warn("[Sectile] FormField received multiple active control registrations. Register one composite control with explicit semantic, focus, and submission targets.")}applyControlAttributes();syncDiagnostic();refreshParticipantTargets()});return()=>{controls.value=controls.value.filter(candidate=>candidate!==registration);discoverNativeFallback();void nextTick(()=>{applyControlAttributes();syncDiagnostic();refreshParticipantTargets()})}};const mount=()=>{unregister?.();unregister=void 0;if(root.value===null)return;discoverNativeFallback();observer?.disconnect();observer=new MutationObserver(()=>{discoverNativeFallback();applyControlAttributes();syncDiagnostic();refreshParticipantTargets()});observer.observe(root.value,{childList:true,subtree:true});applyControlAttributes();const participant={id:id.value,get element(){return root.value},get semanticControl(){return semanticControl()??root.value},get focusTarget(){const registration=activeControl.value;return registration===void 0||registration===null?root.value:resolveElement(registration.focusTarget??registration.semanticControl??registration.element)??root.value},get validationTarget(){const registration=activeControl.value;return registration===void 0||registration===null?root.value:resolveElement(registration.validationTarget??registration.semanticControl??registration.element)??root.value},get submissionElements(){const registration=activeControl.value;if(registration===void 0||registration===null)return[];return resolveSubmissionRegistrations(registration).map(submission=>resolveElement(submission.element)).filter(element=>element!==null)},focus:()=>{const registration=activeControl.value;const control=registration===void 0||registration===null?null:resolveElement(registration.focusTarget??registration.semanticControl??registration.element);control?.focus();return control!==null&&document.activeElement===control},reset:()=>activeControl.value?.reset?.(),get getValue(){return activeControl.value?.getValue},get isValueEqual(){return activeControl.value?.isValueEqual},...nameKey.value===void 0?{}:{name:nameKey.value}};unregister=formContext.register(participant);observedTargets=Object.freeze([participant.element,participant.semanticControl??participant.element,participant.focusTarget??participant.element,participant.validationTarget??participant.element,...participant.submissionElements??[]]);syncDiagnostic()};const mountTask=useNextTickTask(mount);onMounted(mountTask.schedule);onBeforeUnmount(()=>{mountTask.cancel();observer?.disconnect();observer=void 0;restoreControlAttributes();if(diagnosticId!==void 0)formContext.setFieldDiagnostic(diagnosticId,null);unregister?.();unregister=void 0});watch([id,nameKey],mountTask.schedule);watch([activeControl,effectiveControlId,labelMode,nameKey,()=>props.form,()=>props.required,()=>props.disabled,()=>props.readonly,()=>slotProps.value.valid],()=>{applyControlAttributes();syncDiagnostic()},{flush:"post"});provide(formFieldContextKey,{slotProps,labelMode,registerControl,attributesFor});provideFormControlFieldContext({registerControl,attributesFor});return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,elementRef:element=>{root.value=element},"data-scope":"form","data-part":"field","data-valid":slotProps.value.valid?"":void 0,"data-invalid":slotProps.value.valid?void 0:"","data-touched":slotProps.value.touched?"":void 0,"data-dirty":slotProps.value.dirty?"":void 0}),{default:()=>slots["default"]?.(slotProps.value)})}});const FormLabel=defineComponent({name:"SectileFormLabel",inheritAttrs:false,props:{as:{type:[String,Object,Function],default:void 0},asChild:{type:Boolean,default:false}},setup(props,{attrs,slots}){const field=useFormFieldContext("FormLabel");return()=>{const mode=field.labelMode.value;return renderFieldPart({as:props.as??(mode==="legend"?"legend":mode==="for"?"label":"span"),asChild:props.asChild},attrs,slots,"label",{id:field.slotProps.value.labelId,...mode==="for"?{for:field.slotProps.value.controlId}:{}})}}});const FormDescription=defineComponent({name:"SectileFormDescription",inheritAttrs:false,props:{...partProps,as:{...partProps.as,default:"p"}},setup(props,{attrs,slots}){const field=useFormFieldContext("FormDescription");return()=>renderFieldPart(props,attrs,slots,"description",{id:field.slotProps.value.descriptionId})}});const FormMessage=defineComponent({name:"SectileFormMessage",inheritAttrs:false,props:{...partProps,as:{...partProps.as,default:"p"}},slots:Object,setup(props,{attrs,slots}){const field=useFormFieldContext("FormMessage");return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,id:field.slotProps.value.messageId,hidden:field.slotProps.value.valid,role:"alert","aria-live":"polite","data-scope":"form","data-part":"message"}),{default:()=>slots["default"]?.(field.slotProps.value)??field.slotProps.value.issues.map(issue=>issue.message).join(" ")})}});const FormSummary=defineComponent({name:"SectileFormSummary",inheritAttrs:false,props:partProps,slots:Object,setup(props,{attrs,slots}){const form=useFormContext("FormSummary");const valid=useFormSelectorFromContext(form,()=>state=>state.valid);const validation=useFormSelectorFromContext(form,()=>state=>state.validation);const submission=useFormSelectorFromContext(form,()=>state=>state.submission);const issues=useFormSelectorFromContext(form,()=>state=>state.allIssues);const serverIssues=useFormSelectorFromContext(form,()=>state=>getFormIssuesBySource(state,"server"));const firstIssue=useFormSelectorFromContext(form,()=>state=>state.allIssues[0]??null);const slotProps=computed(()=>Object.freeze({validation:validation.value,submission:submission.value,issues:issues.value,serverIssues:serverIssues.value,firstIssue:firstIssue.value,valid:valid.value}));return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,id:form.summaryId,elementRef:element=>{form.summary.value=element},role:"alert","aria-live":"polite",tabindex:-1,hidden:issues.value.length===0&&submission.value.failure===null,"data-scope":"form","data-part":"summary"}),{default:()=>slots["default"]?.(slotProps.value)??[submission.value.failure?.message,...issues.value.map(issue=>issue.message)].filter(message=>message!==void 0).join(" ")})}});const FormReset=defineComponent({name:"SectileFormReset",inheritAttrs:false,props:{...partProps,as:{...partProps.as,default:"button"}},setup(props,{attrs,slots}){return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,...props.as==="button"&&!props.asChild?{type:"reset"}:{},"data-scope":"form","data-part":"reset"}),{default:()=>slots["default"]?.()})}});const FormSubmit=defineComponent({name:"SectileFormSubmit",inheritAttrs:false,props:{...partProps,as:{...partProps.as,default:"button"}},slots:Object,setup(props,{attrs,slots}){const form=useFormContext("FormSubmit");const valid=useFormSelectorFromContext(form,()=>state=>state.valid);const submission=useFormSelectorFromContext(form,()=>state=>state.submission);const slotProps=computed(()=>{const submitting=submission.value.status==="submitting";return Object.freeze({valid:valid.value,submitting,canSubmit:valid.value&&!submitting,submission:submission.value})});const blockPendingSubmit=event=>{if(!slotProps.value.submitting)return;event.preventDefault();event.stopImmediatePropagation()};return()=>h(Primitive,mergeProps({onClickCapture:blockPendingSubmit},attrs,{as:props.as,asChild:props.asChild,...props.as==="button"&&!props.asChild?{type:"submit"}:{},...props.as==="button"&&!props.asChild&&slotProps.value.submitting?{disabled:true}:{},...props.asChild&&slotProps.value.submitting?{"aria-disabled":"true"}:{},"data-scope":"form","data-part":"submit","data-submission-status":slotProps.value.submission.status}),{default:()=>slots["default"]?.(slotProps.value)})}});function renderFieldPart(props,attrs,slots,part,attributes){return h(Primitive,mergeProps(attributes,attrs,{as:props.as,asChild:props.asChild,"data-scope":"form","data-part":part}),{default:()=>slots.default?.()})}function useFormContext(part){const context=inject(formContextKey,null);if(context===null)throw new TypeError(`${part} must be rendered inside FormRoot.`);return context}function useFormFieldContext(part){const context=inject(formFieldContextKey,null);if(context===null)throw new TypeError(`${part} must be rendered inside FormField.`);return context}function resolveElement(source){return typeof source==="function"?source():source.value??null}function resolveSubmissionRegistrations(registration){if(registration.submissions!==void 0){return typeof registration.submissions==="function"?registration.submissions():registration.submissions}const element=resolveElement(registration.element);if(element===null||!isFormSubmissionElement(element))return[];return[{element:()=>element,capabilities:nativeSubmissionCapabilities(element),...registration.explicit===void 0?{}:{explicit:registration.explicit}}]}function sameSubmissionElements(left,right){return left.length===right.length&&left.every((submission,index)=>resolveElement(submission.element)===resolveElement(right[index].element))}function nativeCandidates(root){const selector="fieldset, input, select, textarea";const candidates=[...root.matches(selector)?[root]:[],...root.querySelectorAll(selector)];return candidates.filter(candidate=>candidate.closest('[data-scope="form"][data-part="field"]')===root)}function createNativeFallbackRegistration(root,candidates){const semantic=nativeSemanticControl(candidates);if(semantic===void 0||isHiddenInput(semantic)){return{registration:null,problem:"FormField has no visible native semantic or focus target."}}const submissions=candidates.filter(isFormSubmissionElement);const visible=candidates.filter(candidate=>!isHiddenInput(candidate));const fieldset=visible.find(candidate=>candidate.tagName==="FIELDSET");if(fieldset!==void 0){return{registration:nativeFallbackForFieldset(fieldset,submissions),problem:null}}if(visible.length===1){return{registration:nativeFallbackForElement(semantic,submissions),problem:null}}if(isNativeCheckedGroup(visible)){const focusTarget=visible.find(candidate=>!candidate.disabled)??visible[0];return{registration:{element:()=>root,semanticControl:()=>root,focusTarget:()=>focusTarget,validationTarget:()=>root,submissions:submissions.map(element=>({element:()=>element,capabilities:Object.freeze({...nativeSubmissionCapabilities(element),required:false})})),labelMode:"labelledby",capabilities:compositeControlCapabilities},problem:null}}return{registration:null,problem:"FormField contains multiple unrelated native controls. Use a fieldset or one composite registration."}}function nativeFallbackForFieldset(fieldset,submissions){const visibleSubmissions=submissions.filter(element=>!isHiddenInput(element));const checkboxGroup=isNativeCheckedGroup(visibleSubmissions)&&visibleSubmissions[0]?.tagName==="INPUT"&&visibleSubmissions[0].type.toLowerCase()==="checkbox";return{element:()=>fieldset,semanticControl:()=>fieldset,focusTarget:()=>fieldsetFocusTarget(submissions)??fieldset,validationTarget:()=>fieldset,submissions:submissions.map(element=>({element:()=>element,capabilities:Object.freeze({...nativeSubmissionCapabilities(element),...checkboxGroup?{required:false}:{}})})),labelMode:"legend",capabilities:nativeControlCapabilities(fieldset)}}function fieldsetFocusTarget(submissions){const enabled=submissions.filter(element=>!isHiddenInput(element)&&!element.disabled&&!element.matches(":disabled"));const invalid=enabled.find(element=>element.willValidate&&!element.validity.valid);if(invalid!==void 0)return invalid;return enabled.find(element=>element.tagName==="INPUT"&&element.type.toLowerCase()==="radio"&&element.checked)??enabled[0]}function nativeFallbackForElement(semantic,submissions){return{element:()=>semantic,semanticControl:()=>semantic,focusTarget:()=>semantic,validationTarget:()=>semantic,submissions:submissions.map(element=>({element:()=>element,capabilities:nativeSubmissionCapabilities(element)})),labelMode:nativeLabelMode(semantic),capabilities:nativeControlCapabilities(semantic)}}function isHiddenInput(element){return element.tagName==="INPUT"&&element.getAttribute("type")?.toLowerCase()==="hidden"}function isNativeCheckedGroup(candidates){if(candidates.length<2)return false;const types=candidates.map(candidate=>candidate.tagName==="INPUT"?candidate.type.toLowerCase():null);return types.every(type=>type===types[0])&&(types[0]==="checkbox"||types[0]==="radio")}function nativeSemanticControl(candidates){return candidates.find(candidate=>!isHiddenInput(candidate))??candidates[0]}function isFormSubmissionElement(element){return["INPUT","SELECT","TEXTAREA"].includes(element.tagName)}function nativeLabelMode(element){if(element.tagName==="FIELDSET")return"legend";if(element.tagName==="INPUT"&&element.getAttribute("type")?.toLowerCase()==="hidden"){return"labelledby"}return["BUTTON","INPUT","SELECT","TEXTAREA"].includes(element.tagName)?"for":"labelledby"}function nativeControlCapabilities(element){const tag=element.tagName;const labelable=nativeLabelMode(element)==="for";return Object.freeze({id:true,describedBy:true,invalid:true,labelledBy:!labelable,required:["INPUT","SELECT","TEXTAREA"].includes(tag),disabled:["BUTTON","FIELDSET","INPUT","SELECT","TEXTAREA"].includes(tag),readonly:tag==="TEXTAREA"||tag==="INPUT"&&supportsReadonly(element)})}function nativeSubmissionCapabilities(element){const tag=element.tagName;return Object.freeze({name:true,form:true,required:["INPUT","SELECT","TEXTAREA"].includes(tag),disabled:true,readonly:tag==="TEXTAREA"||tag==="INPUT"&&supportsReadonly(element)})}function safeEncodeSubmissionName(base,relative){try{if(relative===void 0)return safeEncodeFormFieldPath(base);return safeEncodeFormFieldPath(appendFormFieldPath(base,relative))}catch{return null}}function applyMetadata(element,attributes,explicitAttributes,applied){const explicit=new Set(explicitAttributes??[]);for(const[name,value]of Object.entries(attributes)){if(name.startsWith("on")&&typeof value==="function")continue;if(value===void 0||value===false||explicit.has(name))continue;const previous=element.getAttribute(name);const mergeTokens=name==="aria-describedby"||name==="aria-labelledby";if(previous!==null&&!mergeTokens)continue;let changes=applied.get(element);if(changes===void 0){changes=new Map;applied.set(element,changes)}if(!changes.has(name))changes.set(name,previous);const next=mergeTokens&&previous!==null?[...new Set([...previous.split(/\s+/u),...String(value).split(/\s+/u)])].join(" "):value===true?"":String(value);element.setAttribute(name,next)}}function supportsReadonly(element){return!new Set(["button","checkbox","color","file","hidden","image","radio","range","reset","submit"]).has(element.type.toLowerCase())}export{FormDescription,FormField,FormFieldSelector,FormLabel,FormMessage,FormReset,FormRoot,FormSelector,FormSubmit,FormSummary,compositeControlCapabilities,defineFormSubmission,hiddenInputSubmissionCapabilities,hiddenSelectSubmissionCapabilities,hiddenValueSubmissionCapabilities,nativeInputControlCapabilities,provideFormControlOwner,useCompositeFormControl,useFormControl,useFormFieldController,useFormFieldSelector,useFormSelector,useNativeInputFormControl};
1
+ import{computed,defineComponent,h,mergeProps,nextTick,onBeforeUnmount,onMounted,onScopeDispose,provide,shallowRef,watch}from"vue";import{createForm}from"@sectile/dom/form";import{getFormFieldIDByPath}from"@sectile/form/state";import{appendFormFieldPath,encodeFormFieldPath,tryCreateFormFieldPath}from"@sectile/form/path";import{compositeControlCapabilities,hiddenInputSubmissionCapabilities,hiddenSelectSubmissionCapabilities,hiddenValueSubmissionCapabilities,nativeInputControlCapabilities,provideFormControlFieldContext,provideFormControlOwner,useCompositeFormControl,useFormControl,useNativeInputFormControl}from"./internal/form-control.js";import{useNextTickTask}from"./internal/scheduled-task.js";import{Primitive}from"./primitive.js";import{useHostId}from"./host-provider.js";import{formContextKey,formFieldContextKey,useFormContext,useFormFieldContext,useFormSelectorFromContext}from"./internal/form-context.js";function defineFormSubmission(definition){return Object.freeze({...definition})}const partProps={as:{type:[String,Object,Function],default:"div"},asChild:{type:Boolean,default:false}};const FormRootImpl=defineComponent({name:"SectileFormRoot",inheritAttrs:false,props:{issues:{type:Array,default:()=>[]},schema:{type:Object,default:void 0},validate:{type:Function,default:void 0},validateOn:{type:Array,default:()=>[]},revalidateOn:{type:Array,default:()=>["input"]},onSubmit:{type:Function,default:void 0},mapSubmitError:{type:Function,default:void 0}},emits:{reset:()=>true,stateChange:_state=>true},slots:Object,setup(props,{attrs,emit,expose,slots}){const root=shallowRef(null);const summary=shallowRef(null);const summaryId=`${useHostId()}-summary`;const connection=shallowRef(null);const participants=new Map;const fieldDiagnostics=new Map;let syncConfiguredIssues=()=>{};let syncFieldDiagnostics=()=>{};const register=participant=>{const existing=participants.get(participant.id);existing?.unregister?.();const registered={participant};participants.set(participant.id,registered);if(connection.value!==null)registered.unregister=connection.value.registerParticipant(participant);void nextTick(()=>{syncConfiguredIssues();syncFieldDiagnostics()});return()=>{if(participants.get(participant.id)!==registered)return;registered.unregister?.();participants.delete(participant.id);void nextTick(()=>{syncConfiguredIssues();syncFieldDiagnostics()})}};const setFieldDiagnostic=(id,issue)=>{if(issue===null)fieldDiagnostics.delete(id);else fieldDiagnostics.set(id,issue);void nextTick(syncFieldDiagnostics)};const submit=payload=>{const handler=props.onSubmit;if(handler===void 0)return;const target=connection.value;if(target===null)return;let result;try{result=handler(toFormSubmitEvent(payload))}catch(error){return{ok:false,failure:mapSubmissionError(props.mapSubmitError,error)}}const settle=resolved=>{if(typeof resolved!=="object"||resolved===null||resolved.ok!==false){return{ok:true}}const issues=resolveIssueInputs(target,"server",resolved.issues??[]);const failure=resolved.failure??(issues.length===0?submissionErrorFailure():void 0);return{ok:false,...failure===void 0?{}:{failure},...issues.length===0?{}:{issues}}};if(isPromiseLike(result)){return Promise.resolve(result).then(settle,error=>({ok:false,failure:mapSubmissionError(props.mapSubmitError,error)}))}return settle(result)};const configuration=()=>({...summary.value===null?{}:{summary:summary.value},renderSummaryContent:false,manageSummaryVisibility:false,...props.schema===void 0?{}:{schema:props.schema},...props.validate===void 0?{}:{validate:props.validate},validateOn:props.validateOn,revalidateOn:props.revalidateOn,...props.onSubmit===void 0?{}:{onSubmit:submit},onReset:()=>{emit("reset");void nextTick(syncFieldDiagnostics)},onStateChange:next=>{emit("stateChange",next)}});syncConfiguredIssues=()=>{const target=connection.value;if(target===null)return;target.replaceIssues("form",resolveIssueInputs(target,"form",props.issues))};syncFieldDiagnostics=()=>{connection.value?.replaceIssues("field",[...fieldDiagnostics.values()])};const mount=()=>{if(root.value===null)return;connection.value?.destroy();connection.value=createForm({form:root.value,...configuration()});for(const registered of participants.values()){registered.unregister=connection.value.registerParticipant(registered.participant)}syncConfiguredIssues();syncFieldDiagnostics();emit("stateChange",connection.value.state)};const mountTask=useNextTickTask(mount);onMounted(mountTask.schedule);onBeforeUnmount(()=>{mountTask.cancel();connection.value?.destroy();connection.value=null});watch([summary,()=>props.schema,()=>props.validate,()=>[...props.validateOn],()=>[...props.revalidateOn],()=>props.onSubmit,()=>props.mapSubmitError],()=>{void nextTick(()=>connection.value?.reconfigure(configuration()))});watch(()=>props.issues,()=>{void nextTick(syncConfiguredIssues)},{deep:true});const actions={submitStarted:()=>connection.value?.submitStarted()??null,submitSucceeded:generation=>connection.value?.submitSucceeded(generation)??false,submitFailed:(generation,result)=>connection.value?.submitFailed(generation,result)??false,replaceIssues:(source,issues)=>connection.value?.replaceIssues(source,issues)??false,reinitialize:options=>connection.value?.reinitialize(options),reset:()=>connection.value?.reset()};const formContext={summary,summaryId,register,setFieldDiagnostic,connection};provide(formContextKey,formContext);const validation=useFormSelectorFromContext(formContext,()=>current=>current.validation);const submission=useFormSelectorFromContext(formContext,()=>current=>current.submission);const selectedState=useFormSelectorFromContext(formContext,()=>current=>current);const valid=useFormSelectorFromContext(formContext,()=>current=>current.valid);const touched=useFormSelectorFromContext(formContext,()=>current=>current.touched);const dirty=useFormSelectorFromContext(formContext,()=>current=>current.dirty);const slotProps=Object.freeze({get state(){return selectedState.value},get validation(){return validation.value},get submission(){return submission.value},get valid(){return valid.value},get touched(){return touched.value},get dirty(){return dirty.value},get submitted(){return submission.value.count>0},get submitCount(){return submission.value.count},...actions});expose(actions);return()=>h("form",mergeProps(attrs,{ref:element=>{root.value=element},"data-scope":"form","data-part":"root","data-validation-status":validation.value.status,"data-submission-status":submission.value.status}),slots["default"]?.(slotProps)??[])}});const FormRoot=FormRootImpl;function toFormSubmitEvent(payload){return Object.freeze({formData:payload.formData,values:payload.values,submitter:payload.submitter,state:payload.state,reinitialize:payload.reinitialize,nativeEvent:payload.event,get defaultPrevented(){return payload.event.defaultPrevented},preventDefault:()=>payload.event.preventDefault(),stopPropagation:()=>payload.event.stopPropagation(),stopImmediatePropagation:()=>payload.event.stopImmediatePropagation()})}function isPromiseLike(value){return typeof value==="object"&&value!==null&&"then"in value&&typeof value.then==="function"}function resolveIssueInputs(target,source,input){const state=target.getSnapshot().state;return Object.freeze(input.map((issue,index)=>{const owner=issue.path===void 0?null:getFormFieldIDByPath(state,issue.path);const relatedFieldIds=new Set;for(const path of issue.relatedPaths??[]){const related2=getFormFieldIDByPath(state,path);if(related2!==null&&related2!==owner)relatedFieldIds.add(related2)}const related=Object.freeze([...relatedFieldIds]);return Object.freeze({id:issue.id??`form-${source}-issue-${index+1}`,message:issue.message,source,...owner===null?{}:{fieldId:owner},...related.length===0?{}:{relatedFieldIds:related}})}))}function safeEncodeFormFieldPath(path){const result=tryCreateFormFieldPath(path);return result.ok?encodeFormFieldPath(result.value):null}function mapSubmissionError(mapper,reason){if(mapper!==void 0){try{const mapped=mapper(reason);if(mapped!==void 0)return Object.freeze({message:mapped.message})}catch{}}return submissionErrorFailure()}function submissionErrorFailure(){return Object.freeze({message:"Form submission failed."})}function useFormFieldSelectorFromContext(context,idSource,selectorSource,equalsSource=()=>Object.is){const initialSelector=selectorSource();const selected=shallowRef(initialSelector(context.connection.value?.getField(idSource())??null));let unsubscribe;const stop=watch([context.connection,idSource,selectorSource,equalsSource],([target,id,selector,equals])=>{unsubscribe?.();unsubscribe=void 0;const next=selector(target?.getField(id)??null);if(!equals(selected.value,next))selected.value=next;if(target!==null){unsubscribe=target.subscribeField(id,selector,value=>{selected.value=value},{equals})}},{immediate:true,flush:"sync"});onScopeDispose(()=>{unsubscribe?.();stop()});return selected}function useFormSelector(selector,options={}){const context=useFormContext("useFormSelector");return useFormSelectorFromContext(context,()=>selector,()=>options.equals??Object.is)}function useFormFieldSelector(id,selector,options={}){const context=useFormContext("useFormFieldSelector");return useFormFieldSelectorFromContext(context,()=>id,()=>selector,()=>options.equals??Object.is)}function useFormFieldController(id){const context=useFormContext("useFormFieldController");const state=useFormFieldSelectorFromContext(context,()=>id,()=>field=>field);return Object.freeze({state,setMeta:meta=>context.connection.value?.setFieldMeta(id,meta)??false,replaceIssues:(source,issues)=>context.connection.value?.replaceFieldIssues(id,source,issues)??false,upsertIssue:issue=>context.connection.value?.upsertFieldIssue(id,issue)??false,removeIssue:issueId=>context.connection.value?.removeFieldIssue(id,issueId)??false,clearIssues:source=>context.connection.value?.clearFieldIssues(id,source)??false})}const FormSelectorRuntime=defineComponent({name:"SectileFormSelector",props:{select:{type:Function,required:true},equals:{type:Function,default:Object.is}},slots:Object,setup(props,{slots}){const context=useFormContext("FormSelector");const selected=useFormSelectorFromContext(context,()=>props.select,()=>props.equals);return()=>slots["default"]?.({selected:selected.value})??[]}});const FormSelector=FormSelectorRuntime;const FormFieldSelectorRuntime=defineComponent({name:"SectileFormFieldSelector",props:{id:{type:String,required:true},select:{type:Function,required:true},equals:{type:Function,default:Object.is}},slots:Object,setup(props,{slots}){const context=useFormContext("FormFieldSelector");const selected=useFormFieldSelectorFromContext(context,()=>props.id,()=>props.select,()=>props.equals);return()=>slots["default"]?.({selected:selected.value})??[]}});const FormFieldSelector=FormFieldSelectorRuntime;const FormField=defineComponent({name:"SectileFormField",inheritAttrs:false,props:{id:{type:String,default:void 0},name:{type:[String,Array],default:void 0},form:{type:String,default:void 0},required:{type:Boolean,default:void 0},disabled:{type:Boolean,default:void 0},readonly:{type:Boolean,default:void 0},...partProps},slots:Object,setup(props,{attrs,slots}){const formContext=useFormContext("FormField");const generatedId=useHostId();const id=computed(()=>props.id??`form-field-${generatedId}`);const nameKey=computed(()=>props.name===void 0?void 0:safeEncodeFormFieldPath(props.name)??void 0);const root=shallowRef(null);const controls=shallowRef([]);const fallback=shallowRef(null);const nativeFallbackProblem=shallowRef(null);const appliedAttributes=new Map;let observer;let unregister;let diagnosticId;let observedTargets=[];let warnedMultipleControls=false;const activeRegistrations=computed(()=>controls.value.filter(registration=>resolveElement(registration.element)!==null));const activeControl=computed(()=>activeRegistrations.value.length===1?activeRegistrations.value[0]:controls.value.length===0?fallback.value:null);const labelMode=computed(()=>activeControl.value?.labelMode??"for");const semanticControl=()=>{const registration=activeControl.value;if(registration===void 0||registration===null)return null;return resolveElement(registration.semanticControl??registration.element)};const effectiveControlId=computed(()=>semanticControl()?.getAttribute("id")?.trim()||`${id.value}-control`);const fieldState=useFormFieldSelectorFromContext(formContext,()=>id.value,()=>field=>field);const fieldActions=Object.freeze({setMeta:meta=>formContext.connection.value?.setFieldMeta(id.value,meta)??false,replaceIssues:(source,issues)=>formContext.connection.value?.replaceFieldIssues(id.value,source,issues)??false,upsertIssue:issue=>formContext.connection.value?.upsertFieldIssue(id.value,issue)??false,removeIssue:issueId=>formContext.connection.value?.removeFieldIssue(id.value,issueId)??false,clearIssues:source=>formContext.connection.value?.clearFieldIssues(id.value,source)??false});const slotProps=computed(()=>{const current=fieldState.value;const descriptionId=`${id.value}-description`;const messageId=`${id.value}-message`;const relatedIssues=current?.relatedIssues??[];const describedBy=`${descriptionId} ${messageId}${relatedIssues.length===0?"":` ${formContext.summaryId}`}`;const valid=current?.valid??true;return Object.freeze({id:id.value,controlId:effectiveControlId.value,labelId:`${id.value}-label`,descriptionId,messageId,describedBy,valid,touched:current?.touched??false,dirty:current?.dirty??false,issues:current?.issues??[],relatedIssues,...fieldActions})});const attributesFor=registration=>{const explicit=new Set(registration.explicit??[]);const capabilities=registration.capabilities??{};const attributes={};const assign=(attribute,value)=>{if(!explicit.has(attribute)&&value!==void 0)attributes[attribute]=value};if(capabilities.id===true)assign("id",slotProps.value.controlId);if(capabilities.describedBy===true){assign("aria-describedby",slotProps.value.describedBy);assign("aria-errormessage",slotProps.value.issues.length>0?slotProps.value.messageId:slotProps.value.relatedIssues.length>0?formContext.summaryId:slotProps.value.messageId)}if(capabilities.invalid===true&&!slotProps.value.valid)assign("aria-invalid","true");if(capabilities.labelledBy===true&&labelMode.value==="labelledby"){assign("aria-labelledby",slotProps.value.labelId)}if(capabilities.required===true&&props.required===true)assign("required",true);else if(labelMode.value!=="for"&&props.required===true)assign("aria-required","true");if(capabilities.disabled===true&&props.disabled===true)assign("disabled",true);else if(labelMode.value!=="for"&&props.disabled===true)assign("aria-disabled","true");if(capabilities.readonly===true&&props.readonly===true)assign("readonly",true);else if(labelMode.value!=="for"&&props.readonly===true)assign("aria-readonly","true");if(labelMode.value!=="for"){const refreshValue=()=>{queueMicrotask(()=>formContext.connection.value?.refreshParticipant(id.value))};attributes["onClick"]=refreshValue;attributes["onKeydown"]=refreshValue}return Object.freeze(attributes)};const restoreControlAttributes=()=>{for(const[element,attributes]of appliedAttributes){for(const[name,previous]of attributes){if(previous===null)element.removeAttribute(name);else element.setAttribute(name,previous)}}appliedAttributes.clear()};const applyControlAttributes=()=>{restoreControlAttributes();const registration=activeControl.value;if(registration===void 0||registration===null)return;const semantic=resolveElement(registration.semanticControl??registration.element);if(semantic!==null){applyMetadata(semantic,attributesFor(registration),registration.explicit,appliedAttributes)}for(const submission of resolveSubmissionRegistrations(registration)){const element=resolveElement(submission.element);if(element===null)continue;const capabilities=submission.capabilities??nativeSubmissionCapabilities(element);const explicit=submission.explicit??registration.explicit;const attributes={};if(capabilities.name===true&&nameKey.value!==void 0){const submissionName=safeEncodeSubmissionName(nameKey.value,submission.relativeName);if(submissionName!==null)attributes["name"]=submissionName}if(capabilities.form===true&&props.form!==void 0)attributes["form"]=props.form;if(capabilities.required===true&&props.required===true)attributes["required"]=true;if(capabilities.disabled===true&&props.disabled===true)attributes["disabled"]=true;if(capabilities.readonly===true&&props.readonly===true)attributes["readonly"]=true;applyMetadata(element,attributes,explicit,appliedAttributes)}};const discoverNativeFallback=()=>{if(controls.value.length>0||root.value===null){fallback.value=null;nativeFallbackProblem.value=null;return}const candidates=nativeCandidates(root.value);const discovered=createNativeFallbackRegistration(root.value,candidates);nativeFallbackProblem.value=discovered.problem;if(discovered.registration===null){fallback.value=null;return}const next=discovered.registration;const current=fallback.value;if(current!==null&&resolveElement(current.semanticControl??current.element)===resolveElement(next.semanticControl??next.element)&&sameSubmissionElements(resolveSubmissionRegistrations(current),resolveSubmissionRegistrations(next)))return;fallback.value=next};const syncDiagnostic=()=>{const currentId=id.value;if(diagnosticId!==void 0&&diagnosticId!==currentId){formContext.setFieldDiagnostic(diagnosticId,null)}diagnosticId=currentId;let message=null;if(props.name!==void 0&&nameKey.value===void 0){message="FormField received an invalid field path."}else if(activeRegistrations.value.length>1){message="FormField received multiple active controls. Register one composite control with explicit targets."}else if(controls.value.length>0&&activeRegistrations.value.length===0){message="FormField has no mounted control target."}else if(nativeFallbackProblem.value!==null){message=nativeFallbackProblem.value}else{const registration=activeControl.value;if(registration!==null&&registration!==void 0){const invalidRelativeName=resolveSubmissionRegistrations(registration).some(submission=>submission.relativeName!==void 0&&nameKey.value!==void 0&&safeEncodeSubmissionName(nameKey.value,submission.relativeName)===null);if(invalidRelativeName)message="FormField received an invalid relative submission path."}}formContext.setFieldDiagnostic(currentId,message===null?null:Object.freeze({id:`${currentId}:composition`,fieldId:currentId,message,source:"field"}))};const refreshParticipantTargets=()=>{const registration=activeControl.value;const next=registration===null||registration===void 0?root.value===null?[]:[root.value]:[root.value,resolveElement(registration.semanticControl??registration.element),resolveElement(registration.focusTarget??registration.element),resolveElement(registration.validationTarget??registration.element),...resolveSubmissionRegistrations(registration).map(submission=>resolveElement(submission.element))].filter(element=>element!==null);if(next.length===observedTargets.length&&next.every((element,index)=>element===observedTargets[index]))return;observedTargets=Object.freeze([...next]);formContext.connection.value?.refreshParticipant(id.value)};const registerControl=registration=>{controls.value=[...controls.value,registration];fallback.value=null;void nextTick(()=>{if(!warnedMultipleControls&&activeRegistrations.value.length>1){warnedMultipleControls=true;console.warn("[Sectile] FormField received multiple active control registrations. Register one composite control with explicit semantic, focus, and submission targets.")}applyControlAttributes();syncDiagnostic();refreshParticipantTargets()});return()=>{controls.value=controls.value.filter(candidate=>candidate!==registration);discoverNativeFallback();void nextTick(()=>{applyControlAttributes();syncDiagnostic();refreshParticipantTargets()})}};const mount=()=>{unregister?.();unregister=void 0;if(root.value===null)return;discoverNativeFallback();observer?.disconnect();observer=new MutationObserver(()=>{discoverNativeFallback();applyControlAttributes();syncDiagnostic();refreshParticipantTargets()});observer.observe(root.value,{childList:true,subtree:true});applyControlAttributes();const participant={id:id.value,get element(){return root.value},get semanticControl(){return semanticControl()??root.value},get focusTarget(){const registration=activeControl.value;return registration===void 0||registration===null?root.value:resolveElement(registration.focusTarget??registration.semanticControl??registration.element)??root.value},get validationTarget(){const registration=activeControl.value;return registration===void 0||registration===null?root.value:resolveElement(registration.validationTarget??registration.semanticControl??registration.element)??root.value},get submissionElements(){const registration=activeControl.value;if(registration===void 0||registration===null)return[];return resolveSubmissionRegistrations(registration).map(submission=>resolveElement(submission.element)).filter(element=>element!==null)},focus:()=>{const registration=activeControl.value;const control=registration===void 0||registration===null?null:resolveElement(registration.focusTarget??registration.semanticControl??registration.element);control?.focus();return control!==null&&document.activeElement===control},reset:()=>activeControl.value?.reset?.(),get getValue(){return activeControl.value?.getValue},get isValueEqual(){return activeControl.value?.isValueEqual},...nameKey.value===void 0?{}:{name:nameKey.value}};unregister=formContext.register(participant);observedTargets=Object.freeze([participant.element,participant.semanticControl??participant.element,participant.focusTarget??participant.element,participant.validationTarget??participant.element,...participant.submissionElements??[]]);syncDiagnostic()};const mountTask=useNextTickTask(mount);onMounted(mountTask.schedule);onBeforeUnmount(()=>{mountTask.cancel();observer?.disconnect();observer=void 0;restoreControlAttributes();if(diagnosticId!==void 0)formContext.setFieldDiagnostic(diagnosticId,null);unregister?.();unregister=void 0});watch([id,nameKey],mountTask.schedule);watch([activeControl,effectiveControlId,labelMode,nameKey,()=>props.form,()=>props.required,()=>props.disabled,()=>props.readonly,()=>slotProps.value.valid],()=>{applyControlAttributes();syncDiagnostic()},{flush:"post"});provide(formFieldContextKey,{slotProps,labelMode,registerControl,attributesFor});provideFormControlFieldContext({registerControl,attributesFor});return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,elementRef:element=>{root.value=element},"data-scope":"form","data-part":"field","data-valid":slotProps.value.valid?"":void 0,"data-invalid":slotProps.value.valid?void 0:"","data-touched":slotProps.value.touched?"":void 0,"data-dirty":slotProps.value.dirty?"":void 0}),{default:()=>slots["default"]?.(slotProps.value)})}});const FormLabel=defineComponent({name:"SectileFormLabel",inheritAttrs:false,props:{as:{type:[String,Object,Function],default:void 0},asChild:{type:Boolean,default:false}},setup(props,{attrs,slots}){const field=useFormFieldContext("FormLabel");return()=>{const mode=field.labelMode.value;return renderFieldPart({as:props.as??(mode==="legend"?"legend":mode==="for"?"label":"span"),asChild:props.asChild},attrs,slots,"label",{id:field.slotProps.value.labelId,...mode==="for"?{for:field.slotProps.value.controlId}:{}})}}});const FormDescription=defineComponent({name:"SectileFormDescription",inheritAttrs:false,props:{...partProps,as:{...partProps.as,default:"p"}},setup(props,{attrs,slots}){const field=useFormFieldContext("FormDescription");return()=>renderFieldPart(props,attrs,slots,"description",{id:field.slotProps.value.descriptionId})}});import{FormMessage,FormSummary}from"./internal/form-presence-parts.js";const FormReset=defineComponent({name:"SectileFormReset",inheritAttrs:false,props:{...partProps,as:{...partProps.as,default:"button"}},setup(props,{attrs,slots}){return()=>h(Primitive,mergeProps(attrs,{as:props.as,asChild:props.asChild,...props.as==="button"&&!props.asChild?{type:"reset"}:{},"data-scope":"form","data-part":"reset"}),{default:()=>slots["default"]?.()})}});const FormSubmit=defineComponent({name:"SectileFormSubmit",inheritAttrs:false,props:{...partProps,as:{...partProps.as,default:"button"}},slots:Object,setup(props,{attrs,slots}){const form=useFormContext("FormSubmit");const valid=useFormSelectorFromContext(form,()=>state=>state.valid);const submission=useFormSelectorFromContext(form,()=>state=>state.submission);const slotProps=computed(()=>{const submitting=submission.value.status==="submitting";return Object.freeze({valid:valid.value,submitting,canSubmit:valid.value&&!submitting,submission:submission.value})});const blockPendingSubmit=event=>{if(!slotProps.value.submitting)return;event.preventDefault();event.stopImmediatePropagation()};return()=>h(Primitive,mergeProps({onClickCapture:blockPendingSubmit},attrs,{as:props.as,asChild:props.asChild,...props.as==="button"&&!props.asChild?{type:"submit"}:{},...props.as==="button"&&!props.asChild&&slotProps.value.submitting?{disabled:true}:{},...props.asChild&&slotProps.value.submitting?{"aria-disabled":"true"}:{},"data-scope":"form","data-part":"submit","data-submission-status":slotProps.value.submission.status}),{default:()=>slots["default"]?.(slotProps.value)})}});function renderFieldPart(props,attrs,slots,part,attributes){return h(Primitive,mergeProps(attributes,attrs,{as:props.as,asChild:props.asChild,"data-scope":"form","data-part":part}),{default:()=>slots.default?.()})}function resolveElement(source){return typeof source==="function"?source():source.value??null}function resolveSubmissionRegistrations(registration){if(registration.submissions!==void 0){return typeof registration.submissions==="function"?registration.submissions():registration.submissions}const element=resolveElement(registration.element);if(element===null||!isFormSubmissionElement(element))return[];return[{element:()=>element,capabilities:nativeSubmissionCapabilities(element),...registration.explicit===void 0?{}:{explicit:registration.explicit}}]}function sameSubmissionElements(left,right){return left.length===right.length&&left.every((submission,index)=>resolveElement(submission.element)===resolveElement(right[index].element))}function nativeCandidates(root){const selector="fieldset, input, select, textarea";const candidates=[...root.matches(selector)?[root]:[],...root.querySelectorAll(selector)];return candidates.filter(candidate=>candidate.closest('[data-scope="form"][data-part="field"]')===root)}function createNativeFallbackRegistration(root,candidates){const semantic=nativeSemanticControl(candidates);if(semantic===void 0||isHiddenInput(semantic)){return{registration:null,problem:"FormField has no visible native semantic or focus target."}}const submissions=candidates.filter(isFormSubmissionElement);const visible=candidates.filter(candidate=>!isHiddenInput(candidate));const fieldset=visible.find(candidate=>candidate.tagName==="FIELDSET");if(fieldset!==void 0){return{registration:nativeFallbackForFieldset(fieldset,submissions),problem:null}}if(visible.length===1){return{registration:nativeFallbackForElement(semantic,submissions),problem:null}}if(isNativeCheckedGroup(visible)){const focusTarget=visible.find(candidate=>!candidate.disabled)??visible[0];return{registration:{element:()=>root,semanticControl:()=>root,focusTarget:()=>focusTarget,validationTarget:()=>root,submissions:submissions.map(element=>({element:()=>element,capabilities:Object.freeze({...nativeSubmissionCapabilities(element),required:false})})),labelMode:"labelledby",capabilities:compositeControlCapabilities},problem:null}}return{registration:null,problem:"FormField contains multiple unrelated native controls. Use a fieldset or one composite registration."}}function nativeFallbackForFieldset(fieldset,submissions){const visibleSubmissions=submissions.filter(element=>!isHiddenInput(element));const checkboxGroup=isNativeCheckedGroup(visibleSubmissions)&&visibleSubmissions[0]?.tagName==="INPUT"&&visibleSubmissions[0].type.toLowerCase()==="checkbox";return{element:()=>fieldset,semanticControl:()=>fieldset,focusTarget:()=>fieldsetFocusTarget(submissions)??fieldset,validationTarget:()=>fieldset,submissions:submissions.map(element=>({element:()=>element,capabilities:Object.freeze({...nativeSubmissionCapabilities(element),...checkboxGroup?{required:false}:{}})})),labelMode:"legend",capabilities:nativeControlCapabilities(fieldset)}}function fieldsetFocusTarget(submissions){const enabled=submissions.filter(element=>!isHiddenInput(element)&&!element.disabled&&!element.matches(":disabled"));const invalid=enabled.find(element=>element.willValidate&&!element.validity.valid);if(invalid!==void 0)return invalid;return enabled.find(element=>element.tagName==="INPUT"&&element.type.toLowerCase()==="radio"&&element.checked)??enabled[0]}function nativeFallbackForElement(semantic,submissions){return{element:()=>semantic,semanticControl:()=>semantic,focusTarget:()=>semantic,validationTarget:()=>semantic,submissions:submissions.map(element=>({element:()=>element,capabilities:nativeSubmissionCapabilities(element)})),labelMode:nativeLabelMode(semantic),capabilities:nativeControlCapabilities(semantic)}}function isHiddenInput(element){return element.tagName==="INPUT"&&element.getAttribute("type")?.toLowerCase()==="hidden"}function isNativeCheckedGroup(candidates){if(candidates.length<2)return false;const types=candidates.map(candidate=>candidate.tagName==="INPUT"?candidate.type.toLowerCase():null);return types.every(type=>type===types[0])&&(types[0]==="checkbox"||types[0]==="radio")}function nativeSemanticControl(candidates){return candidates.find(candidate=>!isHiddenInput(candidate))??candidates[0]}function isFormSubmissionElement(element){return["INPUT","SELECT","TEXTAREA"].includes(element.tagName)}function nativeLabelMode(element){if(element.tagName==="FIELDSET")return"legend";if(element.tagName==="INPUT"&&element.getAttribute("type")?.toLowerCase()==="hidden"){return"labelledby"}return["BUTTON","INPUT","SELECT","TEXTAREA"].includes(element.tagName)?"for":"labelledby"}function nativeControlCapabilities(element){const tag=element.tagName;const labelable=nativeLabelMode(element)==="for";return Object.freeze({id:true,describedBy:true,invalid:true,labelledBy:!labelable,required:["INPUT","SELECT","TEXTAREA"].includes(tag),disabled:["BUTTON","FIELDSET","INPUT","SELECT","TEXTAREA"].includes(tag),readonly:tag==="TEXTAREA"||tag==="INPUT"&&supportsReadonly(element)})}function nativeSubmissionCapabilities(element){const tag=element.tagName;return Object.freeze({name:true,form:true,required:["INPUT","SELECT","TEXTAREA"].includes(tag),disabled:true,readonly:tag==="TEXTAREA"||tag==="INPUT"&&supportsReadonly(element)})}function safeEncodeSubmissionName(base,relative){try{if(relative===void 0)return safeEncodeFormFieldPath(base);return safeEncodeFormFieldPath(appendFormFieldPath(base,relative))}catch{return null}}function applyMetadata(element,attributes,explicitAttributes,applied){const explicit=new Set(explicitAttributes??[]);for(const[name,value]of Object.entries(attributes)){if(name.startsWith("on")&&typeof value==="function")continue;if(value===void 0||value===false||explicit.has(name))continue;const previous=element.getAttribute(name);const mergeTokens=name==="aria-describedby"||name==="aria-labelledby";if(previous!==null&&!mergeTokens)continue;let changes=applied.get(element);if(changes===void 0){changes=new Map;applied.set(element,changes)}if(!changes.has(name))changes.set(name,previous);const next=mergeTokens&&previous!==null?[...new Set([...previous.split(/\s+/u),...String(value).split(/\s+/u)])].join(" "):value===true?"":String(value);element.setAttribute(name,next)}}function supportsReadonly(element){return!new Set(["button","checkbox","color","file","hidden","image","radio","range","reset","submit"]).has(element.type.toLowerCase())}export{FormDescription,FormField,FormFieldSelector,FormLabel,FormMessage,FormReset,FormRoot,FormSelector,FormSubmit,FormSummary,compositeControlCapabilities,defineFormSubmission,hiddenInputSubmissionCapabilities,hiddenSelectSubmissionCapabilities,hiddenValueSubmissionCapabilities,nativeInputControlCapabilities,provideFormControlOwner,useCompositeFormControl,useFormControl,useFormFieldController,useFormFieldSelector,useFormSelector,useNativeInputFormControl};
2
2
  //# sourceMappingURL=form.js.map