@featherk/ui 0.13.2 → 0.13.4

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.
@@ -1,7 +1,7 @@
1
1
  // Generated by scripts/generate-docs-manifest.mjs. Do not edit.
2
2
  export const packageName = "@featherk/ui";
3
3
 
4
- export const version = "0.13.2";
4
+ export const version = "0.13.4";
5
5
 
6
6
  export const paths = {
7
7
  ActionCell: "table/ActionCell.md",
@@ -10,9 +10,9 @@ export const paths = {
10
10
  };
11
11
 
12
12
  export const docs = {
13
- ActionCell: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.13.2/docs/table/ActionCell.md",
14
- USAddress: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.13.2/docs/address/USAddress.md",
15
- useActionCellMenu: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.13.2/docs/table/useActionCellMenu.md",
13
+ ActionCell: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.13.4/docs/table/ActionCell.md",
14
+ USAddress: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.13.4/docs/address/USAddress.md",
15
+ useActionCellMenu: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.13.4/docs/table/useActionCellMenu.md",
16
16
  };
17
17
 
18
18
  export const docUrl = (name, host = "https://cdn.jsdelivr.net/npm") =>
@@ -1 +1 @@
1
- {"version":3,"file":"featherk-ui.es.js","sources":["../src/address/USAddress.vue","../src/table/ActionCell.vue","../src/table/useActionCellMenu.ts"],"sourcesContent":["<template>\n <div\n class=\"fkui-us-address\"\n :class=\"{ 'fkui-us-address--fieldset-scope': fieldsetScope }\"\n >\n <div class=\"address1\">\n <TextBox\n :id=\"fieldIds.address1\"\n :placeholder=\"resolvedMessages.placeholder.address1\"\n :value=\"address.formData.address1\"\n :valid=\"address1DisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onAddress1Input\"\n />\n <template v-if=\"fieldScope\">\n <Error v-if=\"showAddress1Error\">\n {{ resolvedMessages.field.error.address1 }}\n </Error>\n <Hint v-else>{{ resolvedMessages.field.hint.address1 }}</Hint>\n </template>\n </div>\n\n <div v-if=\"showAddress2\" class=\"address2\">\n <TextBox\n :id=\"fieldIds.address2\"\n :placeholder=\"address2PlaceholderDisplay\"\n :value=\"address.formData.address2\"\n @input=\"address.onAddress2Input\"\n />\n <Hint v-if=\"fieldScope\">{{ resolvedMessages.field.hint.address2 }}</Hint>\n </div>\n\n <div class=\"city\">\n <TextBox\n :id=\"fieldIds.city\"\n :placeholder=\"resolvedMessages.placeholder.city\"\n :value=\"address.formData.city\"\n :valid=\"cityDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onCityInput\"\n />\n <Error v-if=\"fieldScope && showCityError\">\n {{ resolvedMessages.field.error.city }}\n </Error>\n </div>\n\n <div class=\"state\">\n <DropDownList\n :id=\"fieldIds.state\"\n :value=\"address.formData.state\"\n @change=\"address.onStateChange\"\n :defaultItem=\"address.stateDefaultItem\"\n :dataItems=\"address.stateOptions\"\n textField=\"label\"\n valueField=\"value\"\n dataItemKey=\"value\"\n :valuePrimitive=\"true\"\n :valid=\"stateDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n />\n <Error v-if=\"fieldScope && showStateError\">\n {{ resolvedMessages.field.error.state }}\n </Error>\n </div>\n\n <div class=\"zip\">\n <TextBox\n :id=\"fieldIds.zip\"\n :placeholder=\"resolvedMessages.placeholder.zip\"\n :wrapperClass=\"address.zipWrapperClass\"\n :value=\"address.zipDisplay.value\"\n @input=\"address.onZipInput\"\n :valid=\"zipDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n :style=\"{ width: '100%' }\"\n />\n <Error v-if=\"fieldScope && showZipError\">\n {{ resolvedMessages.field.error.zip }}\n </Error>\n <Hint v-if=\"fieldScope && !showZipError\">\n {{ resolvedMessages.field.hint.zip }}\n </Hint>\n </div>\n\n <div v-if=\"fieldsetScope\" class=\"messages\">\n <Error v-if=\"showErrors && !address.addressValid.value\">\n {{ fieldsetErrorMessage }}\n </Error>\n <Error v-else-if=\"showOptionalFeedback\">\n {{ optionalFieldsetErrorMessage }}\n </Error>\n <Hint v-else>{{ resolvedMessages.fieldset.hint.address }}</Hint>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { Error, Hint } from \"@progress/kendo-vue-labels\";\nimport { TextBox } from \"@progress/kendo-vue-inputs\";\nimport { DropDownList } from \"@progress/kendo-vue-dropdowns\";\nimport type {\n USAddressMessageScope,\n USAddressMessages,\n USAddressViewModel,\n} from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n id: string;\n address: USAddressViewModel;\n required?: boolean;\n messageScope?: USAddressMessageScope;\n messages?: USAddressMessages;\n showAddress2?: boolean;\n }>(),\n {\n required: true,\n messageScope: \"fieldset\",\n showAddress2: true,\n },\n);\n\nconst ZIP_CODE_MESSAGE = \"Enter a 5 or 9 digit zip code.\";\nconst OPTIONAL_FIELDS_MESSAGE = \"Incomplete address.\";\n\ntype USAddressResolvedMessages = {\n placeholder: {\n address1: string;\n address2: string;\n city: string;\n zip: string;\n };\n fieldset: {\n error: {\n required: string;\n zip: string;\n };\n hint: {\n address: string;\n };\n };\n field: {\n error: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n hint: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n };\n};\n\nconst DEFAULT_MESSAGES: USAddressResolvedMessages = {\n placeholder: {\n address1: \"Address Line 1\",\n address2: \"Address Line 2\",\n city: \"City\",\n zip: \"00000-0000\",\n },\n fieldset: {\n error: {\n required: \"Required fields are missing.\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address: \"Enter address information.\",\n },\n },\n field: {\n error: {\n address1: \"Required\",\n address2: \"\",\n city: \"Required\",\n state: \"Required\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address1: \"Enter address line 1.\",\n address2: \"Optional\",\n city: \"\",\n state: \"\",\n zip: ZIP_CODE_MESSAGE,\n },\n },\n};\n\nconst resolveMessages = (\n source?: USAddressMessages,\n): USAddressResolvedMessages => {\n return {\n placeholder: {\n address1:\n source?.placeholder?.address1 ?? DEFAULT_MESSAGES.placeholder.address1,\n address2:\n source?.placeholder?.address2 ?? DEFAULT_MESSAGES.placeholder.address2,\n city: source?.placeholder?.city ?? DEFAULT_MESSAGES.placeholder.city,\n zip: source?.placeholder?.zip ?? DEFAULT_MESSAGES.placeholder.zip,\n },\n fieldset: {\n error: {\n required:\n source?.fieldset?.error?.required ??\n DEFAULT_MESSAGES.fieldset.error.required,\n zip:\n source?.fieldset?.error?.zip ?? DEFAULT_MESSAGES.fieldset.error.zip,\n },\n hint: {\n address:\n source?.fieldset?.hint?.address ??\n DEFAULT_MESSAGES.fieldset.hint.address,\n },\n },\n field: {\n error: {\n address1:\n source?.field?.error?.address1 ??\n DEFAULT_MESSAGES.field.error.address1,\n address2:\n source?.field?.error?.address2 ??\n DEFAULT_MESSAGES.field.error.address2,\n city: source?.field?.error?.city ?? DEFAULT_MESSAGES.field.error.city,\n state:\n source?.field?.error?.state ?? DEFAULT_MESSAGES.field.error.state,\n zip: source?.field?.error?.zip ?? DEFAULT_MESSAGES.field.error.zip,\n },\n hint: {\n address1:\n source?.field?.hint?.address1 ?? DEFAULT_MESSAGES.field.hint.address1,\n address2:\n source?.field?.hint?.address2 ?? DEFAULT_MESSAGES.field.hint.address2,\n city: source?.field?.hint?.city ?? DEFAULT_MESSAGES.field.hint.city,\n state: source?.field?.hint?.state ?? DEFAULT_MESSAGES.field.hint.state,\n zip: source?.field?.hint?.zip ?? DEFAULT_MESSAGES.field.hint.zip,\n },\n },\n };\n};\n\nconst resolvedMessages = computed(() => resolveMessages(props.messages));\n\nconst fieldScope = computed(() => {\n return props.messageScope === \"field\";\n});\n\nconst fieldsetScope = computed(() => {\n return props.messageScope === \"fieldset\";\n});\n\nconst isRequired = computed(() => props.required);\n\nconst showErrors = computed(() => isRequired.value);\n\nconst fieldIds = computed(() => ({\n address1: `${props.id}-address1`,\n address2: `${props.id}-address2`,\n city: `${props.id}-city`,\n state: `${props.id}-state`,\n zip: `${props.id}-zip`,\n}));\n\nconst address = computed(() => props.address);\n\nconst nonZipRequiredFieldsValid = computed(() => {\n return (\n address.value.address1Valid.value &&\n address.value.cityValid.value &&\n address.value.stateValid.value\n );\n});\n\nconst hasAnyOptionalInput = computed(() => {\n return (\n address.value.formData.address1.trim() !== \"\" ||\n address.value.formData.address2.trim() !== \"\" ||\n address.value.formData.city.trim() !== \"\" ||\n (address.value.formData.state ?? \"\").trim() !== \"\" ||\n address.value.formData.zip.replace(/\\D/g, \"\") !== \"\"\n );\n});\n\nconst optionalZipInvalid = computed(() => {\n if (address.value.optionalZipInvalid) {\n return address.value.optionalZipInvalid.value;\n }\n\n const zipDigits = address.value.formData.zip.replace(/\\D/g, \"\");\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n});\n\nconst optionalPartialInvalid = computed(() => {\n if (address.value.optionalPartialInvalid) {\n return address.value.optionalPartialInvalid.value;\n }\n\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n !address.value.addressValid.value\n );\n});\n\nconst showOptionalFeedback = computed(() => {\n if (isRequired.value || !optionalPartialInvalid.value) {\n return false;\n }\n\n if (address.value.optionalFeedbackActive) {\n return address.value.optionalFeedbackActive.value;\n }\n\n return false;\n});\n\nconst showAddress1Error = computed(() => {\n return (\n (showErrors.value && !address.value.address1Valid.value) ||\n (showOptionalFeedback.value &&\n address.value.formData.address1.trim() === \"\")\n );\n});\n\nconst showCityError = computed(() => {\n return (\n (showErrors.value && !address.value.cityValid.value) ||\n (showOptionalFeedback.value && address.value.formData.city.trim() === \"\")\n );\n});\n\nconst showStateError = computed(() => {\n return (\n (showErrors.value && !address.value.stateValid.value) ||\n (showOptionalFeedback.value &&\n (address.value.formData.state ?? \"\").trim() === \"\")\n );\n});\n\nconst showZipError = computed(() => {\n return (\n (showErrors.value && !address.value.zipValid.value) ||\n (showOptionalFeedback.value && optionalZipInvalid.value)\n );\n});\n\nconst validationStylesActive = computed(() => {\n return isRequired.value\n ? address.value.addressValidate.value\n : showOptionalFeedback.value;\n});\n\nconst address1DisplayValid = computed(() => {\n return isRequired.value\n ? address.value.address1Valid.value\n : !showAddress1Error.value;\n});\n\nconst cityDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.cityValid.value\n : !showCityError.value;\n});\n\nconst stateDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.stateValid.value\n : !showStateError.value;\n});\n\nconst zipDisplayValid = computed(() => {\n return isRequired.value ? address.value.zipValid.value : !showZipError.value;\n});\n\nconst address2PlaceholderDisplay = computed(() => {\n const basePlaceholder = resolvedMessages.value.placeholder.address2;\n\n if (fieldsetScope.value && isRequired.value) {\n return `${basePlaceholder} (Optional)`;\n }\n return basePlaceholder;\n});\n\nconst fieldsetErrorMessage = computed(() => {\n const messages: string[] = [];\n\n if (!nonZipRequiredFieldsValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.required);\n }\n\n if (!address.value.zipValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n\nconst optionalFieldsetErrorMessage = computed(() => {\n const messages: string[] = [OPTIONAL_FIELDS_MESSAGE];\n\n if (optionalZipInvalid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n</script>\n\n<style scoped>\n.fkui-us-address {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n grid-template-areas:\n \"address1 address1 address1\"\n \"address2 address2 address2\"\n \"city state zip\"\n \"messages messages messages\";\n gap: 0.75rem;\n margin-bottom: 1rem;\n\n .address1 {\n grid-area: address1;\n }\n\n .address2 {\n grid-area: address2;\n }\n\n .city {\n grid-area: city;\n }\n\n .state {\n grid-area: state;\n }\n\n .zip {\n grid-area: zip;\n }\n\n .messages {\n grid-area: messages;\n }\n\n :deep(.fk-zip-textbox) {\n min-width: 100%;\n }\n}\n\n.fkui-us-address--fieldset-scope {\n row-gap: 0.5rem;\n\n .messages {\n margin-top: -0.375rem;\n }\n}\n</style>\n","<template>\n <td\n :id=\"id ?? ids.instanceId\"\n :class=\"['fkui-action-cell', 'k-table-td', className]\"\n :style=\"style\"\n :colspan=\"colSpan\"\n role=\"gridcell\"\n :aria-colindex=\"ariaColumnIndex\"\n :aria-selected=\"isSelected\"\n :data-grid-col-index=\"columnIndex\"\n >\n <Button\n v-for=\"trigger in config.triggers\"\n :key=\"trigger.key\"\n :ref=\"\n hasMenu(trigger)\n ? (element) => registerTrigger(trigger, element)\n : undefined\n \"\n :id=\"ids.compose(trigger.key, 'trigger')\"\n :svg-icon=\"trigger.icon\"\n type=\"button\"\n fill-mode=\"flat\"\n theme-color=\"primary\"\n rounded=\"full\"\n :aria-label=\"trigger.ariaLabel\"\n :aria-haspopup=\"hasMenu(trigger) ? 'menu' : undefined\"\n :aria-expanded=\"hasMenu(trigger) ? isTriggerActive(trigger) : undefined\"\n :disabled=\"trigger.disabled?.(dataItem)\"\n :tabindex=\"tabIndex\"\n @click=\"onTriggerClick(trigger)\"\n @keydown=\"onTriggerKeydown(trigger, $event)\"\n />\n </td>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ComponentPublicInstance } from \"vue\";\nimport { Button } from \"@progress/kendo-vue-buttons\";\nimport type { GridCellProps } from \"@progress/kendo-vue-grid\";\nimport {\n useCompositeId,\n type RegisterableElement,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellMenuController,\n ActionCellTrigger,\n} from \"./types\";\n\ndefineOptions({ inheritAttrs: false });\n\ntype ActionCellProps = Partial<\n Pick<\n GridCellProps,\n | \"id\"\n | \"className\"\n | \"style\"\n | \"colSpan\"\n | \"ariaColumnIndex\"\n | \"isSelected\"\n | \"columnIndex\"\n >\n> & {\n dataItem: any;\n config: ActionCellConfig<any>;\n menuController: ActionCellMenuController<any>;\n tabIndex?: number;\n};\n\nconst props = withDefaults(defineProps<ActionCellProps>(), {\n tabIndex: -1,\n});\n\nconst ids = useCompositeId(\"action-cell\");\n\nconst getTriggerId = (trigger: ActionCellTrigger<any>) =>\n props.menuController.getTriggerId(trigger, props.dataItem);\n\nconst isTriggerActive = (trigger: ActionCellTrigger<any>) =>\n props.menuController.registry.isIdActive(getTriggerId(trigger));\n\nconst hasMenu = (trigger: ActionCellTrigger<any>) =>\n typeof trigger.items === \"function\";\n\nconst registerTrigger = (\n trigger: ActionCellTrigger<any>,\n element: Element | ComponentPublicInstance | null,\n) => {\n props.menuController.registry.register(\n getTriggerId(trigger),\n element as RegisterableElement,\n );\n};\n\nconst onTriggerClick = (trigger: ActionCellTrigger<any>) => {\n if (!hasMenu(trigger)) {\n props.menuController.handleDirectAction?.(trigger, props.dataItem);\n return;\n }\n props.menuController.handleTriggerClick(getTriggerId(trigger));\n};\n\nconst onTriggerKeydown = (\n trigger: ActionCellTrigger<any>,\n ...args: unknown[]\n) => {\n if (!hasMenu(trigger)) return;\n props.menuController.handleTriggerKeydown(getTriggerId(trigger), ...args);\n};\n</script>\n","import {\n computed,\n nextTick,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport {\n useActiveIdRegistry,\n usePopupMenu,\n type KendoMenuSelectEvent,\n type PopupMenuAnchorOptions,\n type PopupMenuElementRef,\n type PopupMenuOffset,\n type PopupMenuTriggerMode,\n type UseExclusiveGroupReturn,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellDataItem,\n ActionCellMenuController,\n ActionCellMenuItem,\n} from \"./types\";\n\nexport type UseActionCellMenuOptions<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Repeatable trigger configuration, rendered by every `ActionCell` instance. */\n config: TConfig;\n /** All rows currently rendered; used to resolve the active row from its registry id. */\n rows: MaybeRefOrGetter<TData[]>;\n /** Derives a stable row id used to build the default registry id for each trigger. */\n getRowId: (row: TData) => string | number;\n /**\n * Overrides the registry ID formatting while preserving `<trigger.key>:<rowId>` semantics.\n * Active row and trigger resolution parse the first colon-separated segment as the trigger\n * key and the remaining segments as the row ID.\n */\n getTriggerId?: (trigger: TConfig[\"triggers\"][number], row: TData) => string;\n /** Ref to the single shared Kendo Menu instance. */\n menuRef: PopupMenuElementRef;\n /**\n * Ref to the full rendered popup content (e.g. a wrapper containing both\n * `activeTitle` and the Menu). Forwarded to `usePopupMenu`'s\n * `popupContentRef`; only needed for a non-\"left\"/\"top\" `anchor.popupAlign`,\n * otherwise `menuRef` alone under-measures the popup whenever anything\n * besides the Menu (e.g. the title) is rendered inside it.\n */\n popupContentRef?: PopupMenuElementRef;\n /** Forwarded to `usePopupMenu`. Defaults to `\"button\"`. */\n triggerMode?: PopupMenuTriggerMode;\n /** Forwarded to `usePopupMenu`. Defaults to `true` for shared-popup positioning. */\n anchor?: PopupMenuAnchorOptions | true;\n /** Forwarded to `usePopupMenu`. */\n resolveFocusTarget?: () => HTMLElement | null;\n /** Forwarded to `usePopupMenu`. */\n focusTargetContainerSelector?: string;\n /** Coordinates mutual exclusivity with other active-id registries in this group. */\n group?: UseExclusiveGroupReturn;\n /**\n * Runs after a menu item is selected, with its original item and resolved row/trigger.\n * Direct-action triggers have no menu item and pass `undefined`.\n */\n onActionSelected: (\n item: ActionCellMenuItem | undefined,\n row: TData,\n trigger: TConfig[\"triggers\"][number],\n ) => void;\n};\n\nexport type UseActionCellMenuReturn<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Spread onto every `<ActionCell>` instance. */\n actionCellProps: {\n config: TConfig;\n menuController: ActionCellMenuController<TData>;\n };\n /** Spread onto the single shared `<Popup>`. */\n popupProps: ComputedRef<{\n show: boolean;\n offset: PopupMenuOffset;\n onClose: () => void;\n }>;\n /** Spread onto the single shared Kendo `<Menu>`. */\n menuProps: ComputedRef<{\n items: ActionCellMenuItem[];\n vertical: true;\n onKeydown: (event: KeyboardEvent) => void;\n onSelect: (event: KendoMenuSelectEvent<ActionCellMenuItem>) => void;\n }>;\n /** Row resolved from the currently active trigger id, if any. */\n activeRow: ComputedRef<TData | null>;\n /** Trigger config resolved from the currently active trigger id, if any. */\n activeTrigger: ComputedRef<TConfig[\"triggers\"][number] | null>;\n /** Resolved `trigger.title(activeRow)`, or `null` when unset/no trigger is active. Render this yourself (e.g. `<strong>`) above the `<Menu>` — it is not part of `menuProps.items`. */\n activeTitle: ComputedRef<string | null>;\n};\n\n/**\n * Bundles the shared-popup wiring a parent needs to drive `ActionCell`: one\n * `useActiveIdRegistry`, one `usePopupMenu`, and the derived active\n * row/trigger/menu items. The parent still owns the `<Popup>`/`<Menu>`\n * template elements and any business logic for the selected action.\n */\nexport const useActionCellMenu = <\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n>(\n options: UseActionCellMenuOptions<TData, TConfig>,\n): UseActionCellMenuReturn<TData, TConfig> => {\n const registry = useActiveIdRegistry<string>();\n options.group?.register(registry);\n\n const getTriggerId =\n options.getTriggerId ??\n ((trigger: TConfig[\"triggers\"][number], row: TData) =>\n `${trigger.key}:${options.getRowId(row)}`);\n\n const activeTrigger = computed(() => {\n const key = registry.activeId.value?.split(\":\")[0];\n return (\n (options.config.triggers.find((trigger) => trigger.key === key) as\n | TConfig[\"triggers\"][number]\n | undefined) ?? null\n );\n });\n\n const activeRow = computed(() => {\n const rowId = registry.activeId.value?.split(\":\").slice(1).join(\":\");\n if (rowId === undefined) return null;\n return (\n toValue(options.rows).find(\n (row) => String(options.getRowId(row)) === rowId,\n ) ?? null\n );\n });\n\n const activeMenuItems = computed<ActionCellMenuItem[]>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row && trigger ? (trigger.items?.(row) ?? []) : [];\n });\n\n const activeTitle = computed<string | null>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row &&\n trigger &&\n typeof trigger.items === \"function\" &&\n trigger.title\n ? trigger.title(row)\n : null;\n });\n\n const popupMenu = usePopupMenu({\n isOpen: registry.isActive,\n triggerRef: registry.activeElement,\n menuRef: options.menuRef,\n popupContentRef: options.popupContentRef,\n triggerMode: options.triggerMode ?? \"button\",\n anchor: options.anchor ?? true,\n resolveFocusTarget: options.resolveFocusTarget,\n focusTargetContainerSelector: options.focusTargetContainerSelector,\n requestShow: (id) => {\n if (typeof id === \"string\") registry.activate(id);\n },\n requestHide: () => registry.deactivate(),\n menuLabel: activeTitle,\n });\n\n let triggerInteractionSequence = 0;\n\n const handleTriggerClick = (id: string) => {\n const interactionSequence = ++triggerInteractionSequence;\n options.group?.deactivateOthers(registry);\n\n if (registry.isActive.value && !registry.isIdActive(id)) {\n registry.deactivate();\n void nextTick(() => {\n if (interactionSequence === triggerInteractionSequence) {\n popupMenu.handleTriggerClick(id);\n }\n });\n return;\n }\n\n popupMenu.handleTriggerClick(id);\n };\n\n const handleDirectAction = (\n trigger: TConfig[\"triggers\"][number],\n row: TData,\n ) => {\n triggerInteractionSequence++;\n options.group?.deactivateOthers(registry);\n registry.deactivate();\n options.onActionSelected(undefined, row, trigger);\n };\n\n const handleTriggerKeydown = (id: string, ...args: unknown[]) => {\n const event = args[0] as KeyboardEvent;\n if (event.key === \"Enter\" || event.code === \"Space\") {\n event.preventDefault();\n handleTriggerClick(id);\n return;\n }\n popupMenu.handleTriggerKeydown(event, id);\n };\n\n const onMenuKeydown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") popupMenu.handleMenuEscape(event);\n };\n\n const onMenuSelect = (event: KendoMenuSelectEvent<ActionCellMenuItem>) => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n popupMenu.handleMenuSelect(event, () => {\n if (row && trigger) {\n options.onActionSelected(event.item, row, trigger);\n }\n });\n };\n\n return {\n actionCellProps: {\n config: options.config,\n menuController: {\n registry,\n getTriggerId,\n handleTriggerClick,\n handleDirectAction,\n handleTriggerKeydown,\n },\n },\n popupProps: computed(() => ({\n show: registry.isActive.value,\n offset: popupMenu.offset.value,\n onClose: popupMenu.handlePopupClose,\n })),\n menuProps: computed(() => ({\n items: activeMenuItems.value,\n vertical: true as const,\n onKeydown: onMenuKeydown,\n onSelect: onMenuSelect,\n })),\n activeRow,\n activeTrigger,\n activeTitle,\n };\n};\n"],"names":["ZIP_CODE_MESSAGE","OPTIONAL_FIELDS_MESSAGE","props","__props","DEFAULT_MESSAGES","resolveMessages","source","resolvedMessages","computed","fieldScope","fieldsetScope","isRequired","showErrors","fieldIds","address","nonZipRequiredFieldsValid","hasAnyOptionalInput","optionalZipInvalid","zipDigits","optionalPartialInvalid","showOptionalFeedback","showAddress1Error","showCityError","showStateError","showZipError","validationStylesActive","address1DisplayValid","cityDisplayValid","stateDisplayValid","zipDisplayValid","address2PlaceholderDisplay","basePlaceholder","fieldsetErrorMessage","messages","optionalFieldsetErrorMessage","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_createVNode","_unref","TextBox","_Fragment","_createBlock","Error","_createTextVNode","_toDisplayString","Hint","showAddress2","_openBlock","_hoisted_2","_hoisted_3","_hoisted_4","DropDownList","_hoisted_5","_hoisted_6","ids","useCompositeId","getTriggerId","trigger","isTriggerActive","hasMenu","registerTrigger","element","onTriggerClick","onTriggerKeydown","args","id","className","style","colSpan","ariaColumnIndex","isSelected","columnIndex","_renderList","config","Button","dataItem","tabIndex","$event","useActionCellMenu","options","registry","useActiveIdRegistry","row","activeTrigger","key","activeRow","rowId","toValue","activeMenuItems","activeTitle","popupMenu","usePopupMenu","triggerInteractionSequence","handleTriggerClick","interactionSequence","nextTick","handleDirectAction","handleTriggerKeydown","event","onMenuKeydown","onMenuSelect"],"mappings":"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"}
1
+ {"version":3,"file":"featherk-ui.es.js","sources":["../src/address/USAddress.vue","../src/table/ActionCell.vue","../src/table/useActionCellMenu.ts"],"sourcesContent":["<template>\n <div\n class=\"fkui-us-address\"\n :class=\"{ 'fkui-us-address--fieldset-scope': fieldsetScope }\"\n >\n <div class=\"address1\">\n <TextBox\n :id=\"fieldIds.address1\"\n :placeholder=\"resolvedMessages.placeholder.address1\"\n :value=\"address.formData.address1\"\n :valid=\"address1DisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onAddress1Input\"\n />\n <template v-if=\"fieldScope\">\n <Error v-if=\"showAddress1Error\">\n {{ resolvedMessages.field.error.address1 }}\n </Error>\n <Hint v-else>{{ resolvedMessages.field.hint.address1 }}</Hint>\n </template>\n </div>\n\n <div v-if=\"showAddress2\" class=\"address2\">\n <TextBox\n :id=\"fieldIds.address2\"\n :placeholder=\"address2PlaceholderDisplay\"\n :value=\"address.formData.address2\"\n @input=\"address.onAddress2Input\"\n />\n <Hint v-if=\"fieldScope\">{{ resolvedMessages.field.hint.address2 }}</Hint>\n </div>\n\n <div class=\"city\">\n <TextBox\n :id=\"fieldIds.city\"\n :placeholder=\"resolvedMessages.placeholder.city\"\n :value=\"address.formData.city\"\n :valid=\"cityDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onCityInput\"\n />\n <Error v-if=\"fieldScope && showCityError\">\n {{ resolvedMessages.field.error.city }}\n </Error>\n </div>\n\n <div class=\"state\">\n <DropDownList\n :id=\"fieldIds.state\"\n :value=\"address.formData.state\"\n @change=\"address.onStateChange\"\n :defaultItem=\"address.stateDefaultItem\"\n :dataItems=\"address.stateOptions\"\n textField=\"label\"\n valueField=\"value\"\n dataItemKey=\"value\"\n :valuePrimitive=\"true\"\n :valid=\"stateDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n />\n <Error v-if=\"fieldScope && showStateError\">\n {{ resolvedMessages.field.error.state }}\n </Error>\n </div>\n\n <div class=\"zip\">\n <TextBox\n :id=\"fieldIds.zip\"\n :placeholder=\"resolvedMessages.placeholder.zip\"\n :wrapperClass=\"address.zipWrapperClass\"\n :value=\"address.zipDisplay.value\"\n @input=\"address.onZipInput\"\n :valid=\"zipDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n :style=\"{ width: '100%' }\"\n />\n <Error v-if=\"fieldScope && showZipError\">\n {{ resolvedMessages.field.error.zip }}\n </Error>\n <Hint v-if=\"fieldScope && !showZipError\">\n {{ resolvedMessages.field.hint.zip }}\n </Hint>\n </div>\n\n <div v-if=\"fieldsetScope\" class=\"messages\">\n <Error v-if=\"showErrors && !address.addressValid.value\">\n {{ fieldsetErrorMessage }}\n </Error>\n <Error v-else-if=\"showOptionalFeedback\">\n {{ optionalFieldsetErrorMessage }}\n </Error>\n <Hint v-else>{{ resolvedMessages.fieldset.hint.address }}</Hint>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { Error, Hint } from \"@progress/kendo-vue-labels\";\nimport { TextBox } from \"@progress/kendo-vue-inputs\";\nimport { DropDownList } from \"@progress/kendo-vue-dropdowns\";\nimport type {\n USAddressMessageScope,\n USAddressMessages,\n USAddressViewModel,\n} from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n id: string;\n address: USAddressViewModel;\n required?: boolean;\n messageScope?: USAddressMessageScope;\n messages?: USAddressMessages;\n showAddress2?: boolean;\n }>(),\n {\n required: true,\n messageScope: \"fieldset\",\n showAddress2: true,\n },\n);\n\nconst ZIP_CODE_MESSAGE = \"Enter a 5 or 9 digit zip code.\";\nconst OPTIONAL_FIELDS_MESSAGE = \"Incomplete address.\";\n\ntype USAddressResolvedMessages = {\n placeholder: {\n address1: string;\n address2: string;\n city: string;\n zip: string;\n };\n fieldset: {\n error: {\n required: string;\n zip: string;\n };\n hint: {\n address: string;\n };\n };\n field: {\n error: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n hint: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n };\n};\n\nconst DEFAULT_MESSAGES: USAddressResolvedMessages = {\n placeholder: {\n address1: \"Address Line 1\",\n address2: \"Address Line 2\",\n city: \"City\",\n zip: \"00000-0000\",\n },\n fieldset: {\n error: {\n required: \"Required fields are missing.\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address: \"Enter address information.\",\n },\n },\n field: {\n error: {\n address1: \"Required\",\n address2: \"\",\n city: \"Required\",\n state: \"Required\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address1: \"Enter address line 1.\",\n address2: \"Optional\",\n city: \"\",\n state: \"\",\n zip: ZIP_CODE_MESSAGE,\n },\n },\n};\n\nconst resolveMessages = (\n source?: USAddressMessages,\n): USAddressResolvedMessages => {\n return {\n placeholder: {\n address1:\n source?.placeholder?.address1 ?? DEFAULT_MESSAGES.placeholder.address1,\n address2:\n source?.placeholder?.address2 ?? DEFAULT_MESSAGES.placeholder.address2,\n city: source?.placeholder?.city ?? DEFAULT_MESSAGES.placeholder.city,\n zip: source?.placeholder?.zip ?? DEFAULT_MESSAGES.placeholder.zip,\n },\n fieldset: {\n error: {\n required:\n source?.fieldset?.error?.required ??\n DEFAULT_MESSAGES.fieldset.error.required,\n zip:\n source?.fieldset?.error?.zip ?? DEFAULT_MESSAGES.fieldset.error.zip,\n },\n hint: {\n address:\n source?.fieldset?.hint?.address ??\n DEFAULT_MESSAGES.fieldset.hint.address,\n },\n },\n field: {\n error: {\n address1:\n source?.field?.error?.address1 ??\n DEFAULT_MESSAGES.field.error.address1,\n address2:\n source?.field?.error?.address2 ??\n DEFAULT_MESSAGES.field.error.address2,\n city: source?.field?.error?.city ?? DEFAULT_MESSAGES.field.error.city,\n state:\n source?.field?.error?.state ?? DEFAULT_MESSAGES.field.error.state,\n zip: source?.field?.error?.zip ?? DEFAULT_MESSAGES.field.error.zip,\n },\n hint: {\n address1:\n source?.field?.hint?.address1 ?? DEFAULT_MESSAGES.field.hint.address1,\n address2:\n source?.field?.hint?.address2 ?? DEFAULT_MESSAGES.field.hint.address2,\n city: source?.field?.hint?.city ?? DEFAULT_MESSAGES.field.hint.city,\n state: source?.field?.hint?.state ?? DEFAULT_MESSAGES.field.hint.state,\n zip: source?.field?.hint?.zip ?? DEFAULT_MESSAGES.field.hint.zip,\n },\n },\n };\n};\n\nconst resolvedMessages = computed(() => resolveMessages(props.messages));\n\nconst fieldScope = computed(() => {\n return props.messageScope === \"field\";\n});\n\nconst fieldsetScope = computed(() => {\n return props.messageScope === \"fieldset\";\n});\n\nconst isRequired = computed(() => props.required);\n\nconst showErrors = computed(() => isRequired.value);\n\nconst fieldIds = computed(() => ({\n address1: `${props.id}-address1`,\n address2: `${props.id}-address2`,\n city: `${props.id}-city`,\n state: `${props.id}-state`,\n zip: `${props.id}-zip`,\n}));\n\nconst address = computed(() => props.address);\n\nconst nonZipRequiredFieldsValid = computed(() => {\n return (\n address.value.address1Valid.value &&\n address.value.cityValid.value &&\n address.value.stateValid.value\n );\n});\n\nconst hasAnyOptionalInput = computed(() => {\n return (\n address.value.formData.address1.trim() !== \"\" ||\n address.value.formData.address2.trim() !== \"\" ||\n address.value.formData.city.trim() !== \"\" ||\n (address.value.formData.state ?? \"\").trim() !== \"\" ||\n address.value.formData.zip.replace(/\\D/g, \"\") !== \"\"\n );\n});\n\nconst optionalZipInvalid = computed(() => {\n if (address.value.optionalZipInvalid) {\n return address.value.optionalZipInvalid.value;\n }\n\n const zipDigits = address.value.formData.zip.replace(/\\D/g, \"\");\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n});\n\nconst optionalPartialInvalid = computed(() => {\n if (address.value.optionalPartialInvalid) {\n return address.value.optionalPartialInvalid.value;\n }\n\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n !address.value.addressValid.value\n );\n});\n\nconst showOptionalFeedback = computed(() => {\n if (isRequired.value || !optionalPartialInvalid.value) {\n return false;\n }\n\n if (address.value.optionalFeedbackActive) {\n return address.value.optionalFeedbackActive.value;\n }\n\n return false;\n});\n\nconst showAddress1Error = computed(() => {\n return (\n (showErrors.value && !address.value.address1Valid.value) ||\n (showOptionalFeedback.value &&\n address.value.formData.address1.trim() === \"\")\n );\n});\n\nconst showCityError = computed(() => {\n return (\n (showErrors.value && !address.value.cityValid.value) ||\n (showOptionalFeedback.value && address.value.formData.city.trim() === \"\")\n );\n});\n\nconst showStateError = computed(() => {\n return (\n (showErrors.value && !address.value.stateValid.value) ||\n (showOptionalFeedback.value &&\n (address.value.formData.state ?? \"\").trim() === \"\")\n );\n});\n\nconst showZipError = computed(() => {\n return (\n (showErrors.value && !address.value.zipValid.value) ||\n (showOptionalFeedback.value && optionalZipInvalid.value)\n );\n});\n\nconst validationStylesActive = computed(() => {\n return isRequired.value\n ? address.value.addressValidate.value\n : showOptionalFeedback.value;\n});\n\nconst address1DisplayValid = computed(() => {\n return isRequired.value\n ? address.value.address1Valid.value\n : !showAddress1Error.value;\n});\n\nconst cityDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.cityValid.value\n : !showCityError.value;\n});\n\nconst stateDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.stateValid.value\n : !showStateError.value;\n});\n\nconst zipDisplayValid = computed(() => {\n return isRequired.value ? address.value.zipValid.value : !showZipError.value;\n});\n\nconst address2PlaceholderDisplay = computed(() => {\n const basePlaceholder = resolvedMessages.value.placeholder.address2;\n\n if (fieldsetScope.value && isRequired.value) {\n return `${basePlaceholder} (Optional)`;\n }\n return basePlaceholder;\n});\n\nconst fieldsetErrorMessage = computed(() => {\n const messages: string[] = [];\n\n if (!nonZipRequiredFieldsValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.required);\n }\n\n if (!address.value.zipValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n\nconst optionalFieldsetErrorMessage = computed(() => {\n const messages: string[] = [OPTIONAL_FIELDS_MESSAGE];\n\n if (optionalZipInvalid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n</script>\n\n<style scoped>\n.fkui-us-address {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n grid-template-areas:\n \"address1 address1 address1\"\n \"address2 address2 address2\"\n \"city state zip\"\n \"messages messages messages\";\n gap: 0.75rem;\n margin-bottom: 1rem;\n\n .address1 {\n grid-area: address1;\n }\n\n .address2 {\n grid-area: address2;\n }\n\n .city {\n grid-area: city;\n }\n\n .state {\n grid-area: state;\n }\n\n .zip {\n grid-area: zip;\n }\n\n .messages {\n grid-area: messages;\n }\n\n :deep(.fk-zip-textbox) {\n min-width: 100%;\n }\n}\n\n.fkui-us-address--fieldset-scope {\n row-gap: 0.5rem;\n\n .messages {\n margin-top: -0.375rem;\n }\n}\n</style>\n","<template>\n <td\n :id=\"id ?? ids.instanceId\"\n :class=\"['fkui-action-cell', 'k-table-td', className]\"\n :style=\"style\"\n :colspan=\"colSpan\"\n role=\"gridcell\"\n :aria-colindex=\"ariaColumnIndex\"\n :aria-selected=\"isSelected\"\n :data-grid-col-index=\"columnIndex\"\n >\n <Button\n v-for=\"trigger in config.triggers\"\n :key=\"trigger.key\"\n :ref=\"\n hasMenu(trigger)\n ? (element) => registerTrigger(trigger, element)\n : undefined\n \"\n :id=\"ids.compose(trigger.key, 'trigger')\"\n :svg-icon=\"trigger.icon\"\n type=\"button\"\n fill-mode=\"flat\"\n theme-color=\"primary\"\n rounded=\"full\"\n :aria-label=\"trigger.ariaLabel\"\n :aria-haspopup=\"hasMenu(trigger) ? 'menu' : undefined\"\n :aria-expanded=\"hasMenu(trigger) ? isTriggerActive(trigger) : undefined\"\n :disabled=\"trigger.disabled?.(dataItem)\"\n :tabindex=\"tabIndex\"\n @click=\"onTriggerClick(trigger)\"\n @keydown=\"onTriggerKeydown(trigger, $event)\"\n />\n </td>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ComponentPublicInstance } from \"vue\";\nimport { Button } from \"@progress/kendo-vue-buttons\";\nimport type { GridCellProps } from \"@progress/kendo-vue-grid\";\nimport {\n useCompositeId,\n type RegisterableElement,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellMenuController,\n ActionCellTrigger,\n} from \"./types\";\n\ndefineOptions({ inheritAttrs: false });\n\ntype ActionCellProps = Partial<\n Pick<\n GridCellProps,\n | \"id\"\n | \"className\"\n | \"style\"\n | \"colSpan\"\n | \"ariaColumnIndex\"\n | \"isSelected\"\n | \"columnIndex\"\n >\n> & {\n dataItem: any;\n config: ActionCellConfig<any>;\n menuController: ActionCellMenuController<any>;\n tabIndex?: number;\n};\n\nconst props = withDefaults(defineProps<ActionCellProps>(), {\n tabIndex: -1,\n});\n\nconst ids = useCompositeId(\"action-cell\");\n\nconst getTriggerId = (trigger: ActionCellTrigger<any>) =>\n props.menuController.getTriggerId(trigger, props.dataItem);\n\nconst isTriggerActive = (trigger: ActionCellTrigger<any>) =>\n props.menuController.registry.isIdActive(getTriggerId(trigger));\n\nconst hasMenu = (trigger: ActionCellTrigger<any>) =>\n typeof trigger.items === \"function\";\n\nconst registerTrigger = (\n trigger: ActionCellTrigger<any>,\n element: Element | ComponentPublicInstance | null,\n) => {\n props.menuController.registry.register(\n getTriggerId(trigger),\n element as RegisterableElement,\n );\n};\n\nconst onTriggerClick = (trigger: ActionCellTrigger<any>) => {\n if (!hasMenu(trigger)) {\n props.menuController.handleDirectAction?.(trigger, props.dataItem);\n return;\n }\n props.menuController.handleTriggerClick(getTriggerId(trigger));\n};\n\nconst onTriggerKeydown = (\n trigger: ActionCellTrigger<any>,\n ...args: unknown[]\n) => {\n if (!hasMenu(trigger)) return;\n props.menuController.handleTriggerKeydown(getTriggerId(trigger), ...args);\n};\n</script>\n","import {\n computed,\n nextTick,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport {\n useActiveIdRegistry,\n usePopupMenu,\n type KendoMenuSelectEvent,\n type PopupMenuAnchorOptions,\n type PopupMenuElementRef,\n type PopupMenuOffset,\n type PopupMenuTriggerMode,\n type UseExclusiveGroupReturn,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellDataItem,\n ActionCellMenuController,\n ActionCellMenuItem,\n} from \"./types\";\n\nexport type UseActionCellMenuOptions<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Repeatable trigger configuration, rendered by every `ActionCell` instance. */\n config: TConfig;\n /** All rows currently rendered; used to resolve the active row from its registry id. */\n rows: MaybeRefOrGetter<TData[]>;\n /** Derives a stable row id used to build the default registry id for each trigger. */\n getRowId: (row: TData) => string | number;\n /**\n * Overrides the registry ID formatting while preserving `<trigger.key>:<rowId>` semantics.\n * Active row and trigger resolution parse the first colon-separated segment as the trigger\n * key and the remaining segments as the row ID.\n */\n getTriggerId?: (trigger: TConfig[\"triggers\"][number], row: TData) => string;\n /** Ref to the single shared Kendo Menu instance. */\n menuRef: PopupMenuElementRef;\n /**\n * Optional custom popup measurement source forwarded to `usePopupMenu`.\n * Normal Kendo Popup markup is measured from the nearest `.k-popup` border\n * box automatically, including `activeTitle` and other sibling content.\n */\n popupContentRef?: PopupMenuElementRef;\n /** Forwarded to `usePopupMenu`. Defaults to `\"button\"`. */\n triggerMode?: PopupMenuTriggerMode;\n /** Forwarded to `usePopupMenu`. Defaults to `true` for shared-popup positioning. */\n anchor?: PopupMenuAnchorOptions | true;\n /** Forwarded to `usePopupMenu`. */\n resolveFocusTarget?: () => HTMLElement | null;\n /** Forwarded to `usePopupMenu`. */\n focusTargetContainerSelector?: string;\n /** Coordinates mutual exclusivity with other active-id registries in this group. */\n group?: UseExclusiveGroupReturn;\n /**\n * Runs after a menu item is selected, with its original item and resolved row/trigger.\n * Direct-action triggers have no menu item and pass `undefined`.\n */\n onActionSelected: (\n item: ActionCellMenuItem | undefined,\n row: TData,\n trigger: TConfig[\"triggers\"][number],\n ) => void;\n};\n\nexport type UseActionCellMenuReturn<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Spread onto every `<ActionCell>` instance. */\n actionCellProps: {\n config: TConfig;\n menuController: ActionCellMenuController<TData>;\n };\n /** Spread onto the single shared `<Popup>`. */\n popupProps: ComputedRef<{\n show: boolean;\n offset: PopupMenuOffset;\n onClose: () => void;\n }>;\n /** Spread onto the single shared Kendo `<Menu>`. */\n menuProps: ComputedRef<{\n items: ActionCellMenuItem[];\n vertical: true;\n onKeydown: (event: KeyboardEvent) => void;\n onSelect: (event: KendoMenuSelectEvent<ActionCellMenuItem>) => void;\n }>;\n /** Row resolved from the currently active trigger id, if any. */\n activeRow: ComputedRef<TData | null>;\n /** Trigger config resolved from the currently active trigger id, if any. */\n activeTrigger: ComputedRef<TConfig[\"triggers\"][number] | null>;\n /** Resolved `trigger.title(activeRow)`, or `null` when unset/no trigger is active. Render this yourself (e.g. `<strong>`) above the `<Menu>` — it is not part of `menuProps.items`. */\n activeTitle: ComputedRef<string | null>;\n};\n\n/**\n * Bundles the shared-popup wiring a parent needs to drive `ActionCell`: one\n * `useActiveIdRegistry`, one `usePopupMenu`, and the derived active\n * row/trigger/menu items. The parent still owns the `<Popup>`/`<Menu>`\n * template elements and any business logic for the selected action.\n */\nexport const useActionCellMenu = <\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n>(\n options: UseActionCellMenuOptions<TData, TConfig>,\n): UseActionCellMenuReturn<TData, TConfig> => {\n const registry = useActiveIdRegistry<string>();\n options.group?.register(registry);\n\n const getTriggerId =\n options.getTriggerId ??\n ((trigger: TConfig[\"triggers\"][number], row: TData) =>\n `${trigger.key}:${options.getRowId(row)}`);\n\n const activeTrigger = computed(() => {\n const key = registry.activeId.value?.split(\":\")[0];\n return (\n (options.config.triggers.find((trigger) => trigger.key === key) as\n | TConfig[\"triggers\"][number]\n | undefined) ?? null\n );\n });\n\n const activeRow = computed(() => {\n const rowId = registry.activeId.value?.split(\":\").slice(1).join(\":\");\n if (rowId === undefined) return null;\n return (\n toValue(options.rows).find(\n (row) => String(options.getRowId(row)) === rowId,\n ) ?? null\n );\n });\n\n const activeMenuItems = computed<ActionCellMenuItem[]>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row && trigger ? (trigger.items?.(row) ?? []) : [];\n });\n\n const activeTitle = computed<string | null>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row &&\n trigger &&\n typeof trigger.items === \"function\" &&\n trigger.title\n ? trigger.title(row)\n : null;\n });\n\n const popupMenu = usePopupMenu({\n isOpen: registry.isActive,\n triggerRef: registry.activeElement,\n menuRef: options.menuRef,\n popupContentRef: options.popupContentRef,\n triggerMode: options.triggerMode ?? \"button\",\n anchor: options.anchor ?? true,\n resolveFocusTarget: options.resolveFocusTarget,\n focusTargetContainerSelector: options.focusTargetContainerSelector,\n requestShow: (id) => {\n if (typeof id === \"string\") registry.activate(id);\n },\n requestHide: () => registry.deactivate(),\n menuLabel: activeTitle,\n });\n\n let triggerInteractionSequence = 0;\n\n const handleTriggerClick = (id: string) => {\n const interactionSequence = ++triggerInteractionSequence;\n options.group?.deactivateOthers(registry);\n\n if (registry.isActive.value && !registry.isIdActive(id)) {\n registry.deactivate();\n void nextTick(() => {\n if (interactionSequence === triggerInteractionSequence) {\n popupMenu.handleTriggerClick(id);\n }\n });\n return;\n }\n\n popupMenu.handleTriggerClick(id);\n };\n\n const handleDirectAction = (\n trigger: TConfig[\"triggers\"][number],\n row: TData,\n ) => {\n triggerInteractionSequence++;\n options.group?.deactivateOthers(registry);\n registry.deactivate();\n options.onActionSelected(undefined, row, trigger);\n };\n\n const handleTriggerKeydown = (id: string, ...args: unknown[]) => {\n const event = args[0] as KeyboardEvent;\n if (event.key === \"Enter\" || event.code === \"Space\") {\n event.preventDefault();\n handleTriggerClick(id);\n return;\n }\n popupMenu.handleTriggerKeydown(event, id);\n };\n\n const onMenuKeydown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") popupMenu.handleMenuEscape(event);\n };\n\n const onMenuSelect = (event: KendoMenuSelectEvent<ActionCellMenuItem>) => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n popupMenu.handleMenuSelect(event, () => {\n if (row && trigger) {\n options.onActionSelected(event.item, row, trigger);\n }\n });\n };\n\n return {\n actionCellProps: {\n config: options.config,\n menuController: {\n registry,\n getTriggerId,\n handleTriggerClick,\n handleDirectAction,\n handleTriggerKeydown,\n },\n },\n popupProps: computed(() => ({\n show: registry.isActive.value,\n offset: popupMenu.offset.value,\n onClose: popupMenu.handlePopupClose,\n })),\n menuProps: computed(() => ({\n items: activeMenuItems.value,\n vertical: true as const,\n onKeydown: onMenuKeydown,\n onSelect: onMenuSelect,\n })),\n activeRow,\n activeTrigger,\n activeTitle,\n };\n};\n"],"names":["ZIP_CODE_MESSAGE","OPTIONAL_FIELDS_MESSAGE","props","__props","DEFAULT_MESSAGES","resolveMessages","source","resolvedMessages","computed","fieldScope","fieldsetScope","isRequired","showErrors","fieldIds","address","nonZipRequiredFieldsValid","hasAnyOptionalInput","optionalZipInvalid","zipDigits","optionalPartialInvalid","showOptionalFeedback","showAddress1Error","showCityError","showStateError","showZipError","validationStylesActive","address1DisplayValid","cityDisplayValid","stateDisplayValid","zipDisplayValid","address2PlaceholderDisplay","basePlaceholder","fieldsetErrorMessage","messages","optionalFieldsetErrorMessage","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_createVNode","_unref","TextBox","_Fragment","_createBlock","Error","_createTextVNode","_toDisplayString","Hint","showAddress2","_openBlock","_hoisted_2","_hoisted_3","_hoisted_4","DropDownList","_hoisted_5","_hoisted_6","ids","useCompositeId","getTriggerId","trigger","isTriggerActive","hasMenu","registerTrigger","element","onTriggerClick","onTriggerKeydown","args","id","className","style","colSpan","ariaColumnIndex","isSelected","columnIndex","_renderList","config","Button","dataItem","tabIndex","$event","useActionCellMenu","options","registry","useActiveIdRegistry","row","activeTrigger","key","activeRow","rowId","toValue","activeMenuItems","activeTitle","popupMenu","usePopupMenu","triggerInteractionSequence","handleTriggerClick","interactionSequence","nextTick","handleDirectAction","handleTriggerKeydown","event","onMenuKeydown","onMenuSelect"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"featherk-ui.umd.js","sources":["../src/address/USAddress.vue","../src/table/ActionCell.vue","../src/table/useActionCellMenu.ts"],"sourcesContent":["<template>\n <div\n class=\"fkui-us-address\"\n :class=\"{ 'fkui-us-address--fieldset-scope': fieldsetScope }\"\n >\n <div class=\"address1\">\n <TextBox\n :id=\"fieldIds.address1\"\n :placeholder=\"resolvedMessages.placeholder.address1\"\n :value=\"address.formData.address1\"\n :valid=\"address1DisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onAddress1Input\"\n />\n <template v-if=\"fieldScope\">\n <Error v-if=\"showAddress1Error\">\n {{ resolvedMessages.field.error.address1 }}\n </Error>\n <Hint v-else>{{ resolvedMessages.field.hint.address1 }}</Hint>\n </template>\n </div>\n\n <div v-if=\"showAddress2\" class=\"address2\">\n <TextBox\n :id=\"fieldIds.address2\"\n :placeholder=\"address2PlaceholderDisplay\"\n :value=\"address.formData.address2\"\n @input=\"address.onAddress2Input\"\n />\n <Hint v-if=\"fieldScope\">{{ resolvedMessages.field.hint.address2 }}</Hint>\n </div>\n\n <div class=\"city\">\n <TextBox\n :id=\"fieldIds.city\"\n :placeholder=\"resolvedMessages.placeholder.city\"\n :value=\"address.formData.city\"\n :valid=\"cityDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onCityInput\"\n />\n <Error v-if=\"fieldScope && showCityError\">\n {{ resolvedMessages.field.error.city }}\n </Error>\n </div>\n\n <div class=\"state\">\n <DropDownList\n :id=\"fieldIds.state\"\n :value=\"address.formData.state\"\n @change=\"address.onStateChange\"\n :defaultItem=\"address.stateDefaultItem\"\n :dataItems=\"address.stateOptions\"\n textField=\"label\"\n valueField=\"value\"\n dataItemKey=\"value\"\n :valuePrimitive=\"true\"\n :valid=\"stateDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n />\n <Error v-if=\"fieldScope && showStateError\">\n {{ resolvedMessages.field.error.state }}\n </Error>\n </div>\n\n <div class=\"zip\">\n <TextBox\n :id=\"fieldIds.zip\"\n :placeholder=\"resolvedMessages.placeholder.zip\"\n :wrapperClass=\"address.zipWrapperClass\"\n :value=\"address.zipDisplay.value\"\n @input=\"address.onZipInput\"\n :valid=\"zipDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n :style=\"{ width: '100%' }\"\n />\n <Error v-if=\"fieldScope && showZipError\">\n {{ resolvedMessages.field.error.zip }}\n </Error>\n <Hint v-if=\"fieldScope && !showZipError\">\n {{ resolvedMessages.field.hint.zip }}\n </Hint>\n </div>\n\n <div v-if=\"fieldsetScope\" class=\"messages\">\n <Error v-if=\"showErrors && !address.addressValid.value\">\n {{ fieldsetErrorMessage }}\n </Error>\n <Error v-else-if=\"showOptionalFeedback\">\n {{ optionalFieldsetErrorMessage }}\n </Error>\n <Hint v-else>{{ resolvedMessages.fieldset.hint.address }}</Hint>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { Error, Hint } from \"@progress/kendo-vue-labels\";\nimport { TextBox } from \"@progress/kendo-vue-inputs\";\nimport { DropDownList } from \"@progress/kendo-vue-dropdowns\";\nimport type {\n USAddressMessageScope,\n USAddressMessages,\n USAddressViewModel,\n} from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n id: string;\n address: USAddressViewModel;\n required?: boolean;\n messageScope?: USAddressMessageScope;\n messages?: USAddressMessages;\n showAddress2?: boolean;\n }>(),\n {\n required: true,\n messageScope: \"fieldset\",\n showAddress2: true,\n },\n);\n\nconst ZIP_CODE_MESSAGE = \"Enter a 5 or 9 digit zip code.\";\nconst OPTIONAL_FIELDS_MESSAGE = \"Incomplete address.\";\n\ntype USAddressResolvedMessages = {\n placeholder: {\n address1: string;\n address2: string;\n city: string;\n zip: string;\n };\n fieldset: {\n error: {\n required: string;\n zip: string;\n };\n hint: {\n address: string;\n };\n };\n field: {\n error: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n hint: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n };\n};\n\nconst DEFAULT_MESSAGES: USAddressResolvedMessages = {\n placeholder: {\n address1: \"Address Line 1\",\n address2: \"Address Line 2\",\n city: \"City\",\n zip: \"00000-0000\",\n },\n fieldset: {\n error: {\n required: \"Required fields are missing.\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address: \"Enter address information.\",\n },\n },\n field: {\n error: {\n address1: \"Required\",\n address2: \"\",\n city: \"Required\",\n state: \"Required\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address1: \"Enter address line 1.\",\n address2: \"Optional\",\n city: \"\",\n state: \"\",\n zip: ZIP_CODE_MESSAGE,\n },\n },\n};\n\nconst resolveMessages = (\n source?: USAddressMessages,\n): USAddressResolvedMessages => {\n return {\n placeholder: {\n address1:\n source?.placeholder?.address1 ?? DEFAULT_MESSAGES.placeholder.address1,\n address2:\n source?.placeholder?.address2 ?? DEFAULT_MESSAGES.placeholder.address2,\n city: source?.placeholder?.city ?? DEFAULT_MESSAGES.placeholder.city,\n zip: source?.placeholder?.zip ?? DEFAULT_MESSAGES.placeholder.zip,\n },\n fieldset: {\n error: {\n required:\n source?.fieldset?.error?.required ??\n DEFAULT_MESSAGES.fieldset.error.required,\n zip:\n source?.fieldset?.error?.zip ?? DEFAULT_MESSAGES.fieldset.error.zip,\n },\n hint: {\n address:\n source?.fieldset?.hint?.address ??\n DEFAULT_MESSAGES.fieldset.hint.address,\n },\n },\n field: {\n error: {\n address1:\n source?.field?.error?.address1 ??\n DEFAULT_MESSAGES.field.error.address1,\n address2:\n source?.field?.error?.address2 ??\n DEFAULT_MESSAGES.field.error.address2,\n city: source?.field?.error?.city ?? DEFAULT_MESSAGES.field.error.city,\n state:\n source?.field?.error?.state ?? DEFAULT_MESSAGES.field.error.state,\n zip: source?.field?.error?.zip ?? DEFAULT_MESSAGES.field.error.zip,\n },\n hint: {\n address1:\n source?.field?.hint?.address1 ?? DEFAULT_MESSAGES.field.hint.address1,\n address2:\n source?.field?.hint?.address2 ?? DEFAULT_MESSAGES.field.hint.address2,\n city: source?.field?.hint?.city ?? DEFAULT_MESSAGES.field.hint.city,\n state: source?.field?.hint?.state ?? DEFAULT_MESSAGES.field.hint.state,\n zip: source?.field?.hint?.zip ?? DEFAULT_MESSAGES.field.hint.zip,\n },\n },\n };\n};\n\nconst resolvedMessages = computed(() => resolveMessages(props.messages));\n\nconst fieldScope = computed(() => {\n return props.messageScope === \"field\";\n});\n\nconst fieldsetScope = computed(() => {\n return props.messageScope === \"fieldset\";\n});\n\nconst isRequired = computed(() => props.required);\n\nconst showErrors = computed(() => isRequired.value);\n\nconst fieldIds = computed(() => ({\n address1: `${props.id}-address1`,\n address2: `${props.id}-address2`,\n city: `${props.id}-city`,\n state: `${props.id}-state`,\n zip: `${props.id}-zip`,\n}));\n\nconst address = computed(() => props.address);\n\nconst nonZipRequiredFieldsValid = computed(() => {\n return (\n address.value.address1Valid.value &&\n address.value.cityValid.value &&\n address.value.stateValid.value\n );\n});\n\nconst hasAnyOptionalInput = computed(() => {\n return (\n address.value.formData.address1.trim() !== \"\" ||\n address.value.formData.address2.trim() !== \"\" ||\n address.value.formData.city.trim() !== \"\" ||\n (address.value.formData.state ?? \"\").trim() !== \"\" ||\n address.value.formData.zip.replace(/\\D/g, \"\") !== \"\"\n );\n});\n\nconst optionalZipInvalid = computed(() => {\n if (address.value.optionalZipInvalid) {\n return address.value.optionalZipInvalid.value;\n }\n\n const zipDigits = address.value.formData.zip.replace(/\\D/g, \"\");\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n});\n\nconst optionalPartialInvalid = computed(() => {\n if (address.value.optionalPartialInvalid) {\n return address.value.optionalPartialInvalid.value;\n }\n\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n !address.value.addressValid.value\n );\n});\n\nconst showOptionalFeedback = computed(() => {\n if (isRequired.value || !optionalPartialInvalid.value) {\n return false;\n }\n\n if (address.value.optionalFeedbackActive) {\n return address.value.optionalFeedbackActive.value;\n }\n\n return false;\n});\n\nconst showAddress1Error = computed(() => {\n return (\n (showErrors.value && !address.value.address1Valid.value) ||\n (showOptionalFeedback.value &&\n address.value.formData.address1.trim() === \"\")\n );\n});\n\nconst showCityError = computed(() => {\n return (\n (showErrors.value && !address.value.cityValid.value) ||\n (showOptionalFeedback.value && address.value.formData.city.trim() === \"\")\n );\n});\n\nconst showStateError = computed(() => {\n return (\n (showErrors.value && !address.value.stateValid.value) ||\n (showOptionalFeedback.value &&\n (address.value.formData.state ?? \"\").trim() === \"\")\n );\n});\n\nconst showZipError = computed(() => {\n return (\n (showErrors.value && !address.value.zipValid.value) ||\n (showOptionalFeedback.value && optionalZipInvalid.value)\n );\n});\n\nconst validationStylesActive = computed(() => {\n return isRequired.value\n ? address.value.addressValidate.value\n : showOptionalFeedback.value;\n});\n\nconst address1DisplayValid = computed(() => {\n return isRequired.value\n ? address.value.address1Valid.value\n : !showAddress1Error.value;\n});\n\nconst cityDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.cityValid.value\n : !showCityError.value;\n});\n\nconst stateDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.stateValid.value\n : !showStateError.value;\n});\n\nconst zipDisplayValid = computed(() => {\n return isRequired.value ? address.value.zipValid.value : !showZipError.value;\n});\n\nconst address2PlaceholderDisplay = computed(() => {\n const basePlaceholder = resolvedMessages.value.placeholder.address2;\n\n if (fieldsetScope.value && isRequired.value) {\n return `${basePlaceholder} (Optional)`;\n }\n return basePlaceholder;\n});\n\nconst fieldsetErrorMessage = computed(() => {\n const messages: string[] = [];\n\n if (!nonZipRequiredFieldsValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.required);\n }\n\n if (!address.value.zipValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n\nconst optionalFieldsetErrorMessage = computed(() => {\n const messages: string[] = [OPTIONAL_FIELDS_MESSAGE];\n\n if (optionalZipInvalid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n</script>\n\n<style scoped>\n.fkui-us-address {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n grid-template-areas:\n \"address1 address1 address1\"\n \"address2 address2 address2\"\n \"city state zip\"\n \"messages messages messages\";\n gap: 0.75rem;\n margin-bottom: 1rem;\n\n .address1 {\n grid-area: address1;\n }\n\n .address2 {\n grid-area: address2;\n }\n\n .city {\n grid-area: city;\n }\n\n .state {\n grid-area: state;\n }\n\n .zip {\n grid-area: zip;\n }\n\n .messages {\n grid-area: messages;\n }\n\n :deep(.fk-zip-textbox) {\n min-width: 100%;\n }\n}\n\n.fkui-us-address--fieldset-scope {\n row-gap: 0.5rem;\n\n .messages {\n margin-top: -0.375rem;\n }\n}\n</style>\n","<template>\n <td\n :id=\"id ?? ids.instanceId\"\n :class=\"['fkui-action-cell', 'k-table-td', className]\"\n :style=\"style\"\n :colspan=\"colSpan\"\n role=\"gridcell\"\n :aria-colindex=\"ariaColumnIndex\"\n :aria-selected=\"isSelected\"\n :data-grid-col-index=\"columnIndex\"\n >\n <Button\n v-for=\"trigger in config.triggers\"\n :key=\"trigger.key\"\n :ref=\"\n hasMenu(trigger)\n ? (element) => registerTrigger(trigger, element)\n : undefined\n \"\n :id=\"ids.compose(trigger.key, 'trigger')\"\n :svg-icon=\"trigger.icon\"\n type=\"button\"\n fill-mode=\"flat\"\n theme-color=\"primary\"\n rounded=\"full\"\n :aria-label=\"trigger.ariaLabel\"\n :aria-haspopup=\"hasMenu(trigger) ? 'menu' : undefined\"\n :aria-expanded=\"hasMenu(trigger) ? isTriggerActive(trigger) : undefined\"\n :disabled=\"trigger.disabled?.(dataItem)\"\n :tabindex=\"tabIndex\"\n @click=\"onTriggerClick(trigger)\"\n @keydown=\"onTriggerKeydown(trigger, $event)\"\n />\n </td>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ComponentPublicInstance } from \"vue\";\nimport { Button } from \"@progress/kendo-vue-buttons\";\nimport type { GridCellProps } from \"@progress/kendo-vue-grid\";\nimport {\n useCompositeId,\n type RegisterableElement,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellMenuController,\n ActionCellTrigger,\n} from \"./types\";\n\ndefineOptions({ inheritAttrs: false });\n\ntype ActionCellProps = Partial<\n Pick<\n GridCellProps,\n | \"id\"\n | \"className\"\n | \"style\"\n | \"colSpan\"\n | \"ariaColumnIndex\"\n | \"isSelected\"\n | \"columnIndex\"\n >\n> & {\n dataItem: any;\n config: ActionCellConfig<any>;\n menuController: ActionCellMenuController<any>;\n tabIndex?: number;\n};\n\nconst props = withDefaults(defineProps<ActionCellProps>(), {\n tabIndex: -1,\n});\n\nconst ids = useCompositeId(\"action-cell\");\n\nconst getTriggerId = (trigger: ActionCellTrigger<any>) =>\n props.menuController.getTriggerId(trigger, props.dataItem);\n\nconst isTriggerActive = (trigger: ActionCellTrigger<any>) =>\n props.menuController.registry.isIdActive(getTriggerId(trigger));\n\nconst hasMenu = (trigger: ActionCellTrigger<any>) =>\n typeof trigger.items === \"function\";\n\nconst registerTrigger = (\n trigger: ActionCellTrigger<any>,\n element: Element | ComponentPublicInstance | null,\n) => {\n props.menuController.registry.register(\n getTriggerId(trigger),\n element as RegisterableElement,\n );\n};\n\nconst onTriggerClick = (trigger: ActionCellTrigger<any>) => {\n if (!hasMenu(trigger)) {\n props.menuController.handleDirectAction?.(trigger, props.dataItem);\n return;\n }\n props.menuController.handleTriggerClick(getTriggerId(trigger));\n};\n\nconst onTriggerKeydown = (\n trigger: ActionCellTrigger<any>,\n ...args: unknown[]\n) => {\n if (!hasMenu(trigger)) return;\n props.menuController.handleTriggerKeydown(getTriggerId(trigger), ...args);\n};\n</script>\n","import {\n computed,\n nextTick,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport {\n useActiveIdRegistry,\n usePopupMenu,\n type KendoMenuSelectEvent,\n type PopupMenuAnchorOptions,\n type PopupMenuElementRef,\n type PopupMenuOffset,\n type PopupMenuTriggerMode,\n type UseExclusiveGroupReturn,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellDataItem,\n ActionCellMenuController,\n ActionCellMenuItem,\n} from \"./types\";\n\nexport type UseActionCellMenuOptions<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Repeatable trigger configuration, rendered by every `ActionCell` instance. */\n config: TConfig;\n /** All rows currently rendered; used to resolve the active row from its registry id. */\n rows: MaybeRefOrGetter<TData[]>;\n /** Derives a stable row id used to build the default registry id for each trigger. */\n getRowId: (row: TData) => string | number;\n /**\n * Overrides the registry ID formatting while preserving `<trigger.key>:<rowId>` semantics.\n * Active row and trigger resolution parse the first colon-separated segment as the trigger\n * key and the remaining segments as the row ID.\n */\n getTriggerId?: (trigger: TConfig[\"triggers\"][number], row: TData) => string;\n /** Ref to the single shared Kendo Menu instance. */\n menuRef: PopupMenuElementRef;\n /**\n * Ref to the full rendered popup content (e.g. a wrapper containing both\n * `activeTitle` and the Menu). Forwarded to `usePopupMenu`'s\n * `popupContentRef`; only needed for a non-\"left\"/\"top\" `anchor.popupAlign`,\n * otherwise `menuRef` alone under-measures the popup whenever anything\n * besides the Menu (e.g. the title) is rendered inside it.\n */\n popupContentRef?: PopupMenuElementRef;\n /** Forwarded to `usePopupMenu`. Defaults to `\"button\"`. */\n triggerMode?: PopupMenuTriggerMode;\n /** Forwarded to `usePopupMenu`. Defaults to `true` for shared-popup positioning. */\n anchor?: PopupMenuAnchorOptions | true;\n /** Forwarded to `usePopupMenu`. */\n resolveFocusTarget?: () => HTMLElement | null;\n /** Forwarded to `usePopupMenu`. */\n focusTargetContainerSelector?: string;\n /** Coordinates mutual exclusivity with other active-id registries in this group. */\n group?: UseExclusiveGroupReturn;\n /**\n * Runs after a menu item is selected, with its original item and resolved row/trigger.\n * Direct-action triggers have no menu item and pass `undefined`.\n */\n onActionSelected: (\n item: ActionCellMenuItem | undefined,\n row: TData,\n trigger: TConfig[\"triggers\"][number],\n ) => void;\n};\n\nexport type UseActionCellMenuReturn<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Spread onto every `<ActionCell>` instance. */\n actionCellProps: {\n config: TConfig;\n menuController: ActionCellMenuController<TData>;\n };\n /** Spread onto the single shared `<Popup>`. */\n popupProps: ComputedRef<{\n show: boolean;\n offset: PopupMenuOffset;\n onClose: () => void;\n }>;\n /** Spread onto the single shared Kendo `<Menu>`. */\n menuProps: ComputedRef<{\n items: ActionCellMenuItem[];\n vertical: true;\n onKeydown: (event: KeyboardEvent) => void;\n onSelect: (event: KendoMenuSelectEvent<ActionCellMenuItem>) => void;\n }>;\n /** Row resolved from the currently active trigger id, if any. */\n activeRow: ComputedRef<TData | null>;\n /** Trigger config resolved from the currently active trigger id, if any. */\n activeTrigger: ComputedRef<TConfig[\"triggers\"][number] | null>;\n /** Resolved `trigger.title(activeRow)`, or `null` when unset/no trigger is active. Render this yourself (e.g. `<strong>`) above the `<Menu>` — it is not part of `menuProps.items`. */\n activeTitle: ComputedRef<string | null>;\n};\n\n/**\n * Bundles the shared-popup wiring a parent needs to drive `ActionCell`: one\n * `useActiveIdRegistry`, one `usePopupMenu`, and the derived active\n * row/trigger/menu items. The parent still owns the `<Popup>`/`<Menu>`\n * template elements and any business logic for the selected action.\n */\nexport const useActionCellMenu = <\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n>(\n options: UseActionCellMenuOptions<TData, TConfig>,\n): UseActionCellMenuReturn<TData, TConfig> => {\n const registry = useActiveIdRegistry<string>();\n options.group?.register(registry);\n\n const getTriggerId =\n options.getTriggerId ??\n ((trigger: TConfig[\"triggers\"][number], row: TData) =>\n `${trigger.key}:${options.getRowId(row)}`);\n\n const activeTrigger = computed(() => {\n const key = registry.activeId.value?.split(\":\")[0];\n return (\n (options.config.triggers.find((trigger) => trigger.key === key) as\n | TConfig[\"triggers\"][number]\n | undefined) ?? null\n );\n });\n\n const activeRow = computed(() => {\n const rowId = registry.activeId.value?.split(\":\").slice(1).join(\":\");\n if (rowId === undefined) return null;\n return (\n toValue(options.rows).find(\n (row) => String(options.getRowId(row)) === rowId,\n ) ?? null\n );\n });\n\n const activeMenuItems = computed<ActionCellMenuItem[]>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row && trigger ? (trigger.items?.(row) ?? []) : [];\n });\n\n const activeTitle = computed<string | null>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row &&\n trigger &&\n typeof trigger.items === \"function\" &&\n trigger.title\n ? trigger.title(row)\n : null;\n });\n\n const popupMenu = usePopupMenu({\n isOpen: registry.isActive,\n triggerRef: registry.activeElement,\n menuRef: options.menuRef,\n popupContentRef: options.popupContentRef,\n triggerMode: options.triggerMode ?? \"button\",\n anchor: options.anchor ?? true,\n resolveFocusTarget: options.resolveFocusTarget,\n focusTargetContainerSelector: options.focusTargetContainerSelector,\n requestShow: (id) => {\n if (typeof id === \"string\") registry.activate(id);\n },\n requestHide: () => registry.deactivate(),\n menuLabel: activeTitle,\n });\n\n let triggerInteractionSequence = 0;\n\n const handleTriggerClick = (id: string) => {\n const interactionSequence = ++triggerInteractionSequence;\n options.group?.deactivateOthers(registry);\n\n if (registry.isActive.value && !registry.isIdActive(id)) {\n registry.deactivate();\n void nextTick(() => {\n if (interactionSequence === triggerInteractionSequence) {\n popupMenu.handleTriggerClick(id);\n }\n });\n return;\n }\n\n popupMenu.handleTriggerClick(id);\n };\n\n const handleDirectAction = (\n trigger: TConfig[\"triggers\"][number],\n row: TData,\n ) => {\n triggerInteractionSequence++;\n options.group?.deactivateOthers(registry);\n registry.deactivate();\n options.onActionSelected(undefined, row, trigger);\n };\n\n const handleTriggerKeydown = (id: string, ...args: unknown[]) => {\n const event = args[0] as KeyboardEvent;\n if (event.key === \"Enter\" || event.code === \"Space\") {\n event.preventDefault();\n handleTriggerClick(id);\n return;\n }\n popupMenu.handleTriggerKeydown(event, id);\n };\n\n const onMenuKeydown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") popupMenu.handleMenuEscape(event);\n };\n\n const onMenuSelect = (event: KendoMenuSelectEvent<ActionCellMenuItem>) => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n popupMenu.handleMenuSelect(event, () => {\n if (row && trigger) {\n options.onActionSelected(event.item, row, trigger);\n }\n });\n };\n\n return {\n actionCellProps: {\n config: options.config,\n menuController: {\n registry,\n getTriggerId,\n handleTriggerClick,\n handleDirectAction,\n handleTriggerKeydown,\n },\n },\n popupProps: computed(() => ({\n show: registry.isActive.value,\n offset: popupMenu.offset.value,\n onClose: popupMenu.handlePopupClose,\n })),\n menuProps: computed(() => ({\n items: activeMenuItems.value,\n vertical: true as const,\n onKeydown: onMenuKeydown,\n onSelect: onMenuSelect,\n })),\n activeRow,\n activeTrigger,\n activeTitle,\n };\n};\n"],"names":["ZIP_CODE_MESSAGE","OPTIONAL_FIELDS_MESSAGE","props","__props","DEFAULT_MESSAGES","resolveMessages","source","resolvedMessages","computed","fieldScope","fieldsetScope","isRequired","showErrors","fieldIds","address","nonZipRequiredFieldsValid","hasAnyOptionalInput","optionalZipInvalid","zipDigits","optionalPartialInvalid","showOptionalFeedback","showAddress1Error","showCityError","showStateError","showZipError","validationStylesActive","address1DisplayValid","cityDisplayValid","stateDisplayValid","zipDisplayValid","address2PlaceholderDisplay","basePlaceholder","fieldsetErrorMessage","messages","optionalFieldsetErrorMessage","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_createVNode","_unref","TextBox","_Fragment","_createBlock","Error","_createTextVNode","_toDisplayString","Hint","showAddress2","_openBlock","_hoisted_2","_hoisted_3","_hoisted_4","DropDownList","_hoisted_5","_hoisted_6","ids","useCompositeId","getTriggerId","trigger","isTriggerActive","hasMenu","registerTrigger","element","onTriggerClick","onTriggerKeydown","args","id","className","style","colSpan","ariaColumnIndex","isSelected","columnIndex","_renderList","config","Button","dataItem","tabIndex","$event","useActionCellMenu","options","registry","useActiveIdRegistry","row","activeTrigger","key","activeRow","rowId","toValue","activeMenuItems","activeTitle","popupMenu","usePopupMenu","triggerInteractionSequence","handleTriggerClick","interactionSequence","nextTick","handleDirectAction","handleTriggerKeydown","event","onMenuKeydown","onMenuSelect"],"mappings":"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"}
1
+ {"version":3,"file":"featherk-ui.umd.js","sources":["../src/address/USAddress.vue","../src/table/ActionCell.vue","../src/table/useActionCellMenu.ts"],"sourcesContent":["<template>\n <div\n class=\"fkui-us-address\"\n :class=\"{ 'fkui-us-address--fieldset-scope': fieldsetScope }\"\n >\n <div class=\"address1\">\n <TextBox\n :id=\"fieldIds.address1\"\n :placeholder=\"resolvedMessages.placeholder.address1\"\n :value=\"address.formData.address1\"\n :valid=\"address1DisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onAddress1Input\"\n />\n <template v-if=\"fieldScope\">\n <Error v-if=\"showAddress1Error\">\n {{ resolvedMessages.field.error.address1 }}\n </Error>\n <Hint v-else>{{ resolvedMessages.field.hint.address1 }}</Hint>\n </template>\n </div>\n\n <div v-if=\"showAddress2\" class=\"address2\">\n <TextBox\n :id=\"fieldIds.address2\"\n :placeholder=\"address2PlaceholderDisplay\"\n :value=\"address.formData.address2\"\n @input=\"address.onAddress2Input\"\n />\n <Hint v-if=\"fieldScope\">{{ resolvedMessages.field.hint.address2 }}</Hint>\n </div>\n\n <div class=\"city\">\n <TextBox\n :id=\"fieldIds.city\"\n :placeholder=\"resolvedMessages.placeholder.city\"\n :value=\"address.formData.city\"\n :valid=\"cityDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onCityInput\"\n />\n <Error v-if=\"fieldScope && showCityError\">\n {{ resolvedMessages.field.error.city }}\n </Error>\n </div>\n\n <div class=\"state\">\n <DropDownList\n :id=\"fieldIds.state\"\n :value=\"address.formData.state\"\n @change=\"address.onStateChange\"\n :defaultItem=\"address.stateDefaultItem\"\n :dataItems=\"address.stateOptions\"\n textField=\"label\"\n valueField=\"value\"\n dataItemKey=\"value\"\n :valuePrimitive=\"true\"\n :valid=\"stateDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n />\n <Error v-if=\"fieldScope && showStateError\">\n {{ resolvedMessages.field.error.state }}\n </Error>\n </div>\n\n <div class=\"zip\">\n <TextBox\n :id=\"fieldIds.zip\"\n :placeholder=\"resolvedMessages.placeholder.zip\"\n :wrapperClass=\"address.zipWrapperClass\"\n :value=\"address.zipDisplay.value\"\n @input=\"address.onZipInput\"\n :valid=\"zipDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n :style=\"{ width: '100%' }\"\n />\n <Error v-if=\"fieldScope && showZipError\">\n {{ resolvedMessages.field.error.zip }}\n </Error>\n <Hint v-if=\"fieldScope && !showZipError\">\n {{ resolvedMessages.field.hint.zip }}\n </Hint>\n </div>\n\n <div v-if=\"fieldsetScope\" class=\"messages\">\n <Error v-if=\"showErrors && !address.addressValid.value\">\n {{ fieldsetErrorMessage }}\n </Error>\n <Error v-else-if=\"showOptionalFeedback\">\n {{ optionalFieldsetErrorMessage }}\n </Error>\n <Hint v-else>{{ resolvedMessages.fieldset.hint.address }}</Hint>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { Error, Hint } from \"@progress/kendo-vue-labels\";\nimport { TextBox } from \"@progress/kendo-vue-inputs\";\nimport { DropDownList } from \"@progress/kendo-vue-dropdowns\";\nimport type {\n USAddressMessageScope,\n USAddressMessages,\n USAddressViewModel,\n} from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n id: string;\n address: USAddressViewModel;\n required?: boolean;\n messageScope?: USAddressMessageScope;\n messages?: USAddressMessages;\n showAddress2?: boolean;\n }>(),\n {\n required: true,\n messageScope: \"fieldset\",\n showAddress2: true,\n },\n);\n\nconst ZIP_CODE_MESSAGE = \"Enter a 5 or 9 digit zip code.\";\nconst OPTIONAL_FIELDS_MESSAGE = \"Incomplete address.\";\n\ntype USAddressResolvedMessages = {\n placeholder: {\n address1: string;\n address2: string;\n city: string;\n zip: string;\n };\n fieldset: {\n error: {\n required: string;\n zip: string;\n };\n hint: {\n address: string;\n };\n };\n field: {\n error: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n hint: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n };\n};\n\nconst DEFAULT_MESSAGES: USAddressResolvedMessages = {\n placeholder: {\n address1: \"Address Line 1\",\n address2: \"Address Line 2\",\n city: \"City\",\n zip: \"00000-0000\",\n },\n fieldset: {\n error: {\n required: \"Required fields are missing.\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address: \"Enter address information.\",\n },\n },\n field: {\n error: {\n address1: \"Required\",\n address2: \"\",\n city: \"Required\",\n state: \"Required\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address1: \"Enter address line 1.\",\n address2: \"Optional\",\n city: \"\",\n state: \"\",\n zip: ZIP_CODE_MESSAGE,\n },\n },\n};\n\nconst resolveMessages = (\n source?: USAddressMessages,\n): USAddressResolvedMessages => {\n return {\n placeholder: {\n address1:\n source?.placeholder?.address1 ?? DEFAULT_MESSAGES.placeholder.address1,\n address2:\n source?.placeholder?.address2 ?? DEFAULT_MESSAGES.placeholder.address2,\n city: source?.placeholder?.city ?? DEFAULT_MESSAGES.placeholder.city,\n zip: source?.placeholder?.zip ?? DEFAULT_MESSAGES.placeholder.zip,\n },\n fieldset: {\n error: {\n required:\n source?.fieldset?.error?.required ??\n DEFAULT_MESSAGES.fieldset.error.required,\n zip:\n source?.fieldset?.error?.zip ?? DEFAULT_MESSAGES.fieldset.error.zip,\n },\n hint: {\n address:\n source?.fieldset?.hint?.address ??\n DEFAULT_MESSAGES.fieldset.hint.address,\n },\n },\n field: {\n error: {\n address1:\n source?.field?.error?.address1 ??\n DEFAULT_MESSAGES.field.error.address1,\n address2:\n source?.field?.error?.address2 ??\n DEFAULT_MESSAGES.field.error.address2,\n city: source?.field?.error?.city ?? DEFAULT_MESSAGES.field.error.city,\n state:\n source?.field?.error?.state ?? DEFAULT_MESSAGES.field.error.state,\n zip: source?.field?.error?.zip ?? DEFAULT_MESSAGES.field.error.zip,\n },\n hint: {\n address1:\n source?.field?.hint?.address1 ?? DEFAULT_MESSAGES.field.hint.address1,\n address2:\n source?.field?.hint?.address2 ?? DEFAULT_MESSAGES.field.hint.address2,\n city: source?.field?.hint?.city ?? DEFAULT_MESSAGES.field.hint.city,\n state: source?.field?.hint?.state ?? DEFAULT_MESSAGES.field.hint.state,\n zip: source?.field?.hint?.zip ?? DEFAULT_MESSAGES.field.hint.zip,\n },\n },\n };\n};\n\nconst resolvedMessages = computed(() => resolveMessages(props.messages));\n\nconst fieldScope = computed(() => {\n return props.messageScope === \"field\";\n});\n\nconst fieldsetScope = computed(() => {\n return props.messageScope === \"fieldset\";\n});\n\nconst isRequired = computed(() => props.required);\n\nconst showErrors = computed(() => isRequired.value);\n\nconst fieldIds = computed(() => ({\n address1: `${props.id}-address1`,\n address2: `${props.id}-address2`,\n city: `${props.id}-city`,\n state: `${props.id}-state`,\n zip: `${props.id}-zip`,\n}));\n\nconst address = computed(() => props.address);\n\nconst nonZipRequiredFieldsValid = computed(() => {\n return (\n address.value.address1Valid.value &&\n address.value.cityValid.value &&\n address.value.stateValid.value\n );\n});\n\nconst hasAnyOptionalInput = computed(() => {\n return (\n address.value.formData.address1.trim() !== \"\" ||\n address.value.formData.address2.trim() !== \"\" ||\n address.value.formData.city.trim() !== \"\" ||\n (address.value.formData.state ?? \"\").trim() !== \"\" ||\n address.value.formData.zip.replace(/\\D/g, \"\") !== \"\"\n );\n});\n\nconst optionalZipInvalid = computed(() => {\n if (address.value.optionalZipInvalid) {\n return address.value.optionalZipInvalid.value;\n }\n\n const zipDigits = address.value.formData.zip.replace(/\\D/g, \"\");\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n});\n\nconst optionalPartialInvalid = computed(() => {\n if (address.value.optionalPartialInvalid) {\n return address.value.optionalPartialInvalid.value;\n }\n\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n !address.value.addressValid.value\n );\n});\n\nconst showOptionalFeedback = computed(() => {\n if (isRequired.value || !optionalPartialInvalid.value) {\n return false;\n }\n\n if (address.value.optionalFeedbackActive) {\n return address.value.optionalFeedbackActive.value;\n }\n\n return false;\n});\n\nconst showAddress1Error = computed(() => {\n return (\n (showErrors.value && !address.value.address1Valid.value) ||\n (showOptionalFeedback.value &&\n address.value.formData.address1.trim() === \"\")\n );\n});\n\nconst showCityError = computed(() => {\n return (\n (showErrors.value && !address.value.cityValid.value) ||\n (showOptionalFeedback.value && address.value.formData.city.trim() === \"\")\n );\n});\n\nconst showStateError = computed(() => {\n return (\n (showErrors.value && !address.value.stateValid.value) ||\n (showOptionalFeedback.value &&\n (address.value.formData.state ?? \"\").trim() === \"\")\n );\n});\n\nconst showZipError = computed(() => {\n return (\n (showErrors.value && !address.value.zipValid.value) ||\n (showOptionalFeedback.value && optionalZipInvalid.value)\n );\n});\n\nconst validationStylesActive = computed(() => {\n return isRequired.value\n ? address.value.addressValidate.value\n : showOptionalFeedback.value;\n});\n\nconst address1DisplayValid = computed(() => {\n return isRequired.value\n ? address.value.address1Valid.value\n : !showAddress1Error.value;\n});\n\nconst cityDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.cityValid.value\n : !showCityError.value;\n});\n\nconst stateDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.stateValid.value\n : !showStateError.value;\n});\n\nconst zipDisplayValid = computed(() => {\n return isRequired.value ? address.value.zipValid.value : !showZipError.value;\n});\n\nconst address2PlaceholderDisplay = computed(() => {\n const basePlaceholder = resolvedMessages.value.placeholder.address2;\n\n if (fieldsetScope.value && isRequired.value) {\n return `${basePlaceholder} (Optional)`;\n }\n return basePlaceholder;\n});\n\nconst fieldsetErrorMessage = computed(() => {\n const messages: string[] = [];\n\n if (!nonZipRequiredFieldsValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.required);\n }\n\n if (!address.value.zipValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n\nconst optionalFieldsetErrorMessage = computed(() => {\n const messages: string[] = [OPTIONAL_FIELDS_MESSAGE];\n\n if (optionalZipInvalid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n</script>\n\n<style scoped>\n.fkui-us-address {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n grid-template-areas:\n \"address1 address1 address1\"\n \"address2 address2 address2\"\n \"city state zip\"\n \"messages messages messages\";\n gap: 0.75rem;\n margin-bottom: 1rem;\n\n .address1 {\n grid-area: address1;\n }\n\n .address2 {\n grid-area: address2;\n }\n\n .city {\n grid-area: city;\n }\n\n .state {\n grid-area: state;\n }\n\n .zip {\n grid-area: zip;\n }\n\n .messages {\n grid-area: messages;\n }\n\n :deep(.fk-zip-textbox) {\n min-width: 100%;\n }\n}\n\n.fkui-us-address--fieldset-scope {\n row-gap: 0.5rem;\n\n .messages {\n margin-top: -0.375rem;\n }\n}\n</style>\n","<template>\n <td\n :id=\"id ?? ids.instanceId\"\n :class=\"['fkui-action-cell', 'k-table-td', className]\"\n :style=\"style\"\n :colspan=\"colSpan\"\n role=\"gridcell\"\n :aria-colindex=\"ariaColumnIndex\"\n :aria-selected=\"isSelected\"\n :data-grid-col-index=\"columnIndex\"\n >\n <Button\n v-for=\"trigger in config.triggers\"\n :key=\"trigger.key\"\n :ref=\"\n hasMenu(trigger)\n ? (element) => registerTrigger(trigger, element)\n : undefined\n \"\n :id=\"ids.compose(trigger.key, 'trigger')\"\n :svg-icon=\"trigger.icon\"\n type=\"button\"\n fill-mode=\"flat\"\n theme-color=\"primary\"\n rounded=\"full\"\n :aria-label=\"trigger.ariaLabel\"\n :aria-haspopup=\"hasMenu(trigger) ? 'menu' : undefined\"\n :aria-expanded=\"hasMenu(trigger) ? isTriggerActive(trigger) : undefined\"\n :disabled=\"trigger.disabled?.(dataItem)\"\n :tabindex=\"tabIndex\"\n @click=\"onTriggerClick(trigger)\"\n @keydown=\"onTriggerKeydown(trigger, $event)\"\n />\n </td>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ComponentPublicInstance } from \"vue\";\nimport { Button } from \"@progress/kendo-vue-buttons\";\nimport type { GridCellProps } from \"@progress/kendo-vue-grid\";\nimport {\n useCompositeId,\n type RegisterableElement,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellMenuController,\n ActionCellTrigger,\n} from \"./types\";\n\ndefineOptions({ inheritAttrs: false });\n\ntype ActionCellProps = Partial<\n Pick<\n GridCellProps,\n | \"id\"\n | \"className\"\n | \"style\"\n | \"colSpan\"\n | \"ariaColumnIndex\"\n | \"isSelected\"\n | \"columnIndex\"\n >\n> & {\n dataItem: any;\n config: ActionCellConfig<any>;\n menuController: ActionCellMenuController<any>;\n tabIndex?: number;\n};\n\nconst props = withDefaults(defineProps<ActionCellProps>(), {\n tabIndex: -1,\n});\n\nconst ids = useCompositeId(\"action-cell\");\n\nconst getTriggerId = (trigger: ActionCellTrigger<any>) =>\n props.menuController.getTriggerId(trigger, props.dataItem);\n\nconst isTriggerActive = (trigger: ActionCellTrigger<any>) =>\n props.menuController.registry.isIdActive(getTriggerId(trigger));\n\nconst hasMenu = (trigger: ActionCellTrigger<any>) =>\n typeof trigger.items === \"function\";\n\nconst registerTrigger = (\n trigger: ActionCellTrigger<any>,\n element: Element | ComponentPublicInstance | null,\n) => {\n props.menuController.registry.register(\n getTriggerId(trigger),\n element as RegisterableElement,\n );\n};\n\nconst onTriggerClick = (trigger: ActionCellTrigger<any>) => {\n if (!hasMenu(trigger)) {\n props.menuController.handleDirectAction?.(trigger, props.dataItem);\n return;\n }\n props.menuController.handleTriggerClick(getTriggerId(trigger));\n};\n\nconst onTriggerKeydown = (\n trigger: ActionCellTrigger<any>,\n ...args: unknown[]\n) => {\n if (!hasMenu(trigger)) return;\n props.menuController.handleTriggerKeydown(getTriggerId(trigger), ...args);\n};\n</script>\n","import {\n computed,\n nextTick,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport {\n useActiveIdRegistry,\n usePopupMenu,\n type KendoMenuSelectEvent,\n type PopupMenuAnchorOptions,\n type PopupMenuElementRef,\n type PopupMenuOffset,\n type PopupMenuTriggerMode,\n type UseExclusiveGroupReturn,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellDataItem,\n ActionCellMenuController,\n ActionCellMenuItem,\n} from \"./types\";\n\nexport type UseActionCellMenuOptions<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Repeatable trigger configuration, rendered by every `ActionCell` instance. */\n config: TConfig;\n /** All rows currently rendered; used to resolve the active row from its registry id. */\n rows: MaybeRefOrGetter<TData[]>;\n /** Derives a stable row id used to build the default registry id for each trigger. */\n getRowId: (row: TData) => string | number;\n /**\n * Overrides the registry ID formatting while preserving `<trigger.key>:<rowId>` semantics.\n * Active row and trigger resolution parse the first colon-separated segment as the trigger\n * key and the remaining segments as the row ID.\n */\n getTriggerId?: (trigger: TConfig[\"triggers\"][number], row: TData) => string;\n /** Ref to the single shared Kendo Menu instance. */\n menuRef: PopupMenuElementRef;\n /**\n * Optional custom popup measurement source forwarded to `usePopupMenu`.\n * Normal Kendo Popup markup is measured from the nearest `.k-popup` border\n * box automatically, including `activeTitle` and other sibling content.\n */\n popupContentRef?: PopupMenuElementRef;\n /** Forwarded to `usePopupMenu`. Defaults to `\"button\"`. */\n triggerMode?: PopupMenuTriggerMode;\n /** Forwarded to `usePopupMenu`. Defaults to `true` for shared-popup positioning. */\n anchor?: PopupMenuAnchorOptions | true;\n /** Forwarded to `usePopupMenu`. */\n resolveFocusTarget?: () => HTMLElement | null;\n /** Forwarded to `usePopupMenu`. */\n focusTargetContainerSelector?: string;\n /** Coordinates mutual exclusivity with other active-id registries in this group. */\n group?: UseExclusiveGroupReturn;\n /**\n * Runs after a menu item is selected, with its original item and resolved row/trigger.\n * Direct-action triggers have no menu item and pass `undefined`.\n */\n onActionSelected: (\n item: ActionCellMenuItem | undefined,\n row: TData,\n trigger: TConfig[\"triggers\"][number],\n ) => void;\n};\n\nexport type UseActionCellMenuReturn<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Spread onto every `<ActionCell>` instance. */\n actionCellProps: {\n config: TConfig;\n menuController: ActionCellMenuController<TData>;\n };\n /** Spread onto the single shared `<Popup>`. */\n popupProps: ComputedRef<{\n show: boolean;\n offset: PopupMenuOffset;\n onClose: () => void;\n }>;\n /** Spread onto the single shared Kendo `<Menu>`. */\n menuProps: ComputedRef<{\n items: ActionCellMenuItem[];\n vertical: true;\n onKeydown: (event: KeyboardEvent) => void;\n onSelect: (event: KendoMenuSelectEvent<ActionCellMenuItem>) => void;\n }>;\n /** Row resolved from the currently active trigger id, if any. */\n activeRow: ComputedRef<TData | null>;\n /** Trigger config resolved from the currently active trigger id, if any. */\n activeTrigger: ComputedRef<TConfig[\"triggers\"][number] | null>;\n /** Resolved `trigger.title(activeRow)`, or `null` when unset/no trigger is active. Render this yourself (e.g. `<strong>`) above the `<Menu>` — it is not part of `menuProps.items`. */\n activeTitle: ComputedRef<string | null>;\n};\n\n/**\n * Bundles the shared-popup wiring a parent needs to drive `ActionCell`: one\n * `useActiveIdRegistry`, one `usePopupMenu`, and the derived active\n * row/trigger/menu items. The parent still owns the `<Popup>`/`<Menu>`\n * template elements and any business logic for the selected action.\n */\nexport const useActionCellMenu = <\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n>(\n options: UseActionCellMenuOptions<TData, TConfig>,\n): UseActionCellMenuReturn<TData, TConfig> => {\n const registry = useActiveIdRegistry<string>();\n options.group?.register(registry);\n\n const getTriggerId =\n options.getTriggerId ??\n ((trigger: TConfig[\"triggers\"][number], row: TData) =>\n `${trigger.key}:${options.getRowId(row)}`);\n\n const activeTrigger = computed(() => {\n const key = registry.activeId.value?.split(\":\")[0];\n return (\n (options.config.triggers.find((trigger) => trigger.key === key) as\n | TConfig[\"triggers\"][number]\n | undefined) ?? null\n );\n });\n\n const activeRow = computed(() => {\n const rowId = registry.activeId.value?.split(\":\").slice(1).join(\":\");\n if (rowId === undefined) return null;\n return (\n toValue(options.rows).find(\n (row) => String(options.getRowId(row)) === rowId,\n ) ?? null\n );\n });\n\n const activeMenuItems = computed<ActionCellMenuItem[]>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row && trigger ? (trigger.items?.(row) ?? []) : [];\n });\n\n const activeTitle = computed<string | null>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row &&\n trigger &&\n typeof trigger.items === \"function\" &&\n trigger.title\n ? trigger.title(row)\n : null;\n });\n\n const popupMenu = usePopupMenu({\n isOpen: registry.isActive,\n triggerRef: registry.activeElement,\n menuRef: options.menuRef,\n popupContentRef: options.popupContentRef,\n triggerMode: options.triggerMode ?? \"button\",\n anchor: options.anchor ?? true,\n resolveFocusTarget: options.resolveFocusTarget,\n focusTargetContainerSelector: options.focusTargetContainerSelector,\n requestShow: (id) => {\n if (typeof id === \"string\") registry.activate(id);\n },\n requestHide: () => registry.deactivate(),\n menuLabel: activeTitle,\n });\n\n let triggerInteractionSequence = 0;\n\n const handleTriggerClick = (id: string) => {\n const interactionSequence = ++triggerInteractionSequence;\n options.group?.deactivateOthers(registry);\n\n if (registry.isActive.value && !registry.isIdActive(id)) {\n registry.deactivate();\n void nextTick(() => {\n if (interactionSequence === triggerInteractionSequence) {\n popupMenu.handleTriggerClick(id);\n }\n });\n return;\n }\n\n popupMenu.handleTriggerClick(id);\n };\n\n const handleDirectAction = (\n trigger: TConfig[\"triggers\"][number],\n row: TData,\n ) => {\n triggerInteractionSequence++;\n options.group?.deactivateOthers(registry);\n registry.deactivate();\n options.onActionSelected(undefined, row, trigger);\n };\n\n const handleTriggerKeydown = (id: string, ...args: unknown[]) => {\n const event = args[0] as KeyboardEvent;\n if (event.key === \"Enter\" || event.code === \"Space\") {\n event.preventDefault();\n handleTriggerClick(id);\n return;\n }\n popupMenu.handleTriggerKeydown(event, id);\n };\n\n const onMenuKeydown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") popupMenu.handleMenuEscape(event);\n };\n\n const onMenuSelect = (event: KendoMenuSelectEvent<ActionCellMenuItem>) => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n popupMenu.handleMenuSelect(event, () => {\n if (row && trigger) {\n options.onActionSelected(event.item, row, trigger);\n }\n });\n };\n\n return {\n actionCellProps: {\n config: options.config,\n menuController: {\n registry,\n getTriggerId,\n handleTriggerClick,\n handleDirectAction,\n handleTriggerKeydown,\n },\n },\n popupProps: computed(() => ({\n show: registry.isActive.value,\n offset: popupMenu.offset.value,\n onClose: popupMenu.handlePopupClose,\n })),\n menuProps: computed(() => ({\n items: activeMenuItems.value,\n vertical: true as const,\n onKeydown: onMenuKeydown,\n onSelect: onMenuSelect,\n })),\n activeRow,\n activeTrigger,\n activeTitle,\n };\n};\n"],"names":["ZIP_CODE_MESSAGE","OPTIONAL_FIELDS_MESSAGE","props","__props","DEFAULT_MESSAGES","resolveMessages","source","resolvedMessages","computed","fieldScope","fieldsetScope","isRequired","showErrors","fieldIds","address","nonZipRequiredFieldsValid","hasAnyOptionalInput","optionalZipInvalid","zipDigits","optionalPartialInvalid","showOptionalFeedback","showAddress1Error","showCityError","showStateError","showZipError","validationStylesActive","address1DisplayValid","cityDisplayValid","stateDisplayValid","zipDisplayValid","address2PlaceholderDisplay","basePlaceholder","fieldsetErrorMessage","messages","optionalFieldsetErrorMessage","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_createVNode","_unref","TextBox","_Fragment","_createBlock","Error","_createTextVNode","_toDisplayString","Hint","showAddress2","_openBlock","_hoisted_2","_hoisted_3","_hoisted_4","DropDownList","_hoisted_5","_hoisted_6","ids","useCompositeId","getTriggerId","trigger","isTriggerActive","hasMenu","registerTrigger","element","onTriggerClick","onTriggerKeydown","args","id","className","style","colSpan","ariaColumnIndex","isSelected","columnIndex","_renderList","config","Button","dataItem","tabIndex","$event","useActionCellMenu","options","registry","useActiveIdRegistry","row","activeTrigger","key","activeRow","rowId","toValue","activeMenuItems","activeTitle","popupMenu","usePopupMenu","triggerInteractionSequence","handleTriggerClick","interactionSequence","nextTick","handleDirectAction","handleTriggerKeydown","event","onMenuKeydown","onMenuSelect"],"mappings":"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"}
@@ -17,11 +17,9 @@ export type UseActionCellMenuOptions<TData extends ActionCellDataItem = ActionCe
17
17
  /** Ref to the single shared Kendo Menu instance. */
18
18
  menuRef: PopupMenuElementRef;
19
19
  /**
20
- * Ref to the full rendered popup content (e.g. a wrapper containing both
21
- * `activeTitle` and the Menu). Forwarded to `usePopupMenu`'s
22
- * `popupContentRef`; only needed for a non-"left"/"top" `anchor.popupAlign`,
23
- * otherwise `menuRef` alone under-measures the popup whenever anything
24
- * besides the Menu (e.g. the title) is rendered inside it.
20
+ * Optional custom popup measurement source forwarded to `usePopupMenu`.
21
+ * Normal Kendo Popup markup is measured from the nearest `.k-popup` border
22
+ * box automatically, including `activeTitle` and other sibling content.
25
23
  */
26
24
  popupContentRef?: PopupMenuElementRef;
27
25
  /** Forwarded to `usePopupMenu`. Defaults to `"button"`. */
@@ -113,19 +113,20 @@ const actionCellMenu = useActionCellMenu({
113
113
 
114
114
  ## API
115
115
 
116
- | Option | Required | Description |
117
- | ------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
118
- | `config` | Yes | `ActionCellConfig`-shaped trigger configuration, passed straight through to every `ActionCell`. |
119
- | `rows` | Yes | Current row list (ref, getter, or plain array); used to resolve the active row from its registry id. |
120
- | `getRowId` | Yes | Derives a stable row id used to build the default `"<trigger.key>:<rowId>"` registry id. |
121
- | `getTriggerId` | No | Overrides registry ID formatting, but must preserve `<trigger.key>:<rowId>` semantics because active row and trigger resolution parse the ID. |
122
- | `menuRef` | Yes | Ref to the single shared Kendo `Menu` instance. |
123
- | `triggerMode` | No | Forwarded to `usePopupMenu`. Defaults to `"button"`. |
124
- | `anchor` | No | Forwarded to `usePopupMenu` for offset positioning. Defaults to `true` because the shared popup targets dynamically resolved ActionCell triggers. |
125
- | `resolveFocusTarget` | No | Forwarded to `usePopupMenu` for keyboard-close focus restoration. |
126
- | `focusTargetContainerSelector` | No | Forwarded to `usePopupMenu`; focuses the trigger's closest matching ancestor after a keyboard-driven close. |
127
- | `group` | No | A `useExclusiveGroup()` instance that deactivates other registered members before this menu opens. |
128
- | `onActionSelected` | Yes | Runs after a menu item is selected, with the original `(item, row, trigger)`. Direct actions pass `undefined` as `item`. |
116
+ | Option | Required | Description |
117
+ | ------------------------------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
118
+ | `config` | Yes | `ActionCellConfig`-shaped trigger configuration, passed straight through to every `ActionCell`. |
119
+ | `rows` | Yes | Current row list (ref, getter, or plain array); used to resolve the active row from its registry id. |
120
+ | `getRowId` | Yes | Derives a stable row id used to build the default `"<trigger.key>:<rowId>"` registry id. |
121
+ | `getTriggerId` | No | Overrides registry ID formatting, but must preserve `<trigger.key>:<rowId>` semantics because active row and trigger resolution parse the ID. |
122
+ | `menuRef` | Yes | Ref to the single shared Kendo `Menu` instance. |
123
+ | `popupContentRef` | No | Optional custom popup measurement source forwarded to `usePopupMenu`. Normal Kendo markup is measured from the nearest `.k-popup` border box automatically. |
124
+ | `triggerMode` | No | Forwarded to `usePopupMenu`. Defaults to `"button"`. |
125
+ | `anchor` | No | Forwarded to `usePopupMenu` for offset positioning, alignment, clipping, and per-axis `"fit"`/`"flip"` collision behavior. Defaults to `true`, including `"flip"` on both axes. |
126
+ | `resolveFocusTarget` | No | Forwarded to `usePopupMenu` for keyboard-close focus restoration. |
127
+ | `focusTargetContainerSelector` | No | Forwarded to `usePopupMenu`; focuses the trigger's closest matching ancestor after a keyboard-driven close. |
128
+ | `group` | No | A `useExclusiveGroup()` instance that deactivates other registered members before this menu opens. |
129
+ | `onActionSelected` | Yes | For menu items, runs synchronously after popup close is requested, with the original `(item, row, trigger)` captured before registry deactivation. Direct actions pass `undefined` as `item`. |
129
130
 
130
131
  Each trigger in `config.triggers` may also define an optional `title?: (dataItem) => string`.
131
132
  When set, the resolved string is exposed via the returned `activeTitle` — it is _not_ mixed
@@ -135,6 +136,29 @@ yourself as real markup with the shared `fk-menu-title` class (e.g.
135
136
  `<strong v-if="activeTitle" class="fk-menu-title">{{ activeTitle }}</strong>`) as a sibling
136
137
  of `<Menu>` inside the `<Popup>`.
137
138
 
139
+ ### Popup Collision
140
+
141
+ Configure collision behavior through `anchor`. `useActionCellMenu` forwards the complete
142
+ anchor options object to `usePopupMenu`; `ActionCell` itself does not position the shared
143
+ popup.
144
+
145
+ ```ts
146
+ const actionCellMenu = useActionCellMenu({
147
+ config: actionCellConfig,
148
+ rows,
149
+ getRowId: (row) => row.id,
150
+ menuRef,
151
+ anchor: {
152
+ collision: { horizontal: "fit", vertical: "flip" },
153
+ },
154
+ onActionSelected: runAction,
155
+ });
156
+ ```
157
+
158
+ `"fit"` shifts the popup inside the viewport or configured `clipRoot` without changing
159
+ anchor sides. `"flip"` moves it to the opposite side when doing so reduces overflow. Both
160
+ axes default to `"flip"`.
161
+
138
162
  ### Exclusive Menus
139
163
 
140
164
  Use `useExclusiveGroup` from `@featherk/composables/registry` when ActionCell menus and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@featherk/ui",
3
- "version": "0.13.2",
3
+ "version": "0.13.4",
4
4
  "main": "dist/featherk-ui.umd.js",
5
5
  "module": "dist/featherk-ui.es.js",
6
6
  "types": "dist/index.d.ts",