@nhtio/lucid-resourceful-vue-components 1.20260107.0 → 1.20260108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/{VChip-DWwcL8cL.mjs → VChip-DakTCdq2.mjs} +2 -2
  2. package/{VChip-DWwcL8cL.mjs.map → VChip-DakTCdq2.mjs.map} +1 -1
  3. package/{VDatePicker-C7_ULYfO.mjs → VDatePicker-DlZlcF2O.mjs} +4 -4
  4. package/{VDatePicker-C7_ULYfO.mjs.map → VDatePicker-DlZlcF2O.mjs.map} +1 -1
  5. package/{VDialog-BVRDhoD7.mjs → VDialog-BljV_Pfu.mjs} +3 -3
  6. package/{VDialog-BVRDhoD7.mjs.map → VDialog-BljV_Pfu.mjs.map} +1 -1
  7. package/{VEmptyState-C2B0Znk9.mjs → VEmptyState-BubXzExt.mjs} +2 -2
  8. package/{VEmptyState-C2B0Znk9.mjs.map → VEmptyState-BubXzExt.mjs.map} +1 -1
  9. package/{VHover-DnB1GlWG.mjs → VHover-DYt7f7-R.mjs} +3 -3
  10. package/{VHover-DnB1GlWG.mjs.map → VHover-DYt7f7-R.mjs.map} +1 -1
  11. package/{VListItem-DojRgtpe.mjs → VListItem-CHkJtaF9.mjs} +4 -4
  12. package/{VListItem-DojRgtpe.mjs.map → VListItem-CHkJtaF9.mjs.map} +1 -1
  13. package/{VMenu-D2biKkpd.mjs → VMenu-Xveh72QZ.mjs} +3 -3
  14. package/{VMenu-D2biKkpd.mjs.map → VMenu-Xveh72QZ.mjs.map} +1 -1
  15. package/{VPicker-dxKS1KK4.mjs → VPicker-D9TBI61U.mjs} +4 -4
  16. package/{VPicker-dxKS1KK4.mjs.map → VPicker-D9TBI61U.mjs.map} +1 -1
  17. package/{VRadioGroup-lC_c6Ath.mjs → VRadioGroup-CFazRh5q.mjs} +4 -4
  18. package/{VRadioGroup-lC_c6Ath.mjs.map → VRadioGroup-CFazRh5q.mjs.map} +1 -1
  19. package/{VRow-BBY2gEjT.mjs → VRow-Db84ydOG.mjs} +2 -2
  20. package/{VRow-BBY2gEjT.mjs.map → VRow-Db84ydOG.mjs.map} +1 -1
  21. package/{VSheet-B4SA9_dv.mjs → VSheet-CX-0tYk0.mjs} +2 -2
  22. package/{VSheet-B4SA9_dv.mjs.map → VSheet-CX-0tYk0.mjs.map} +1 -1
  23. package/{actions-CXhEUJp6.mjs → actions-CAGyXfrI.mjs} +12 -12
  24. package/{actions-CXhEUJp6.mjs.map → actions-CAGyXfrI.mjs.map} +1 -1
  25. package/{alert-B0j6GH3V.mjs → alert-D4Zq_X5a.mjs} +11 -11
  26. package/{alert-B0j6GH3V.mjs.map → alert-D4Zq_X5a.mjs.map} +1 -1
  27. package/{bigint-DXS_rVbG.mjs → bigint-MqcXh7nS.mjs} +7 -7
  28. package/{bigint-DXS_rVbG.mjs.map → bigint-MqcXh7nS.mjs.map} +1 -1
  29. package/{boolean-BTu-4Ihs.mjs → boolean-h31TIpoH.mjs} +10 -10
  30. package/{boolean-BTu-4Ihs.mjs.map → boolean-h31TIpoH.mjs.map} +1 -1
  31. package/{clipboard-C6YTX8YB.mjs → clipboard-jPiC4eq0.mjs} +7 -7
  32. package/{clipboard-C6YTX8YB.mjs.map → clipboard-jPiC4eq0.mjs.map} +1 -1
  33. package/{common-a_cd4SQg.mjs → common-CRFL2oQX.mjs} +1362 -1362
  34. package/common-CRFL2oQX.mjs.map +1 -0
  35. package/components/autorefresh_controller.mjs +1 -1
  36. package/components/control_button.mjs +1 -1
  37. package/components/control_button_bar.mjs +2 -2
  38. package/components/control_menu.mjs +1 -1
  39. package/components/custom_field.mjs +1 -1
  40. package/components/exporter.mjs +1 -1
  41. package/components/fields/bigint.mjs +1 -1
  42. package/components/fields/boolean.mjs +1 -1
  43. package/components/fields/date.mjs +1 -1
  44. package/components/fields/date_time.mjs +1 -1
  45. package/components/fields/enum.mjs +1 -1
  46. package/components/fields/integer.mjs +1 -1
  47. package/components/fields/number.mjs +1 -1
  48. package/components/fields/string.mjs +1 -1
  49. package/components/fields/unsigned_integer.mjs +1 -1
  50. package/components/fields.mjs +9 -9
  51. package/components/form_with_validation.mjs +1 -1
  52. package/components/resourceful_alerter.mjs +1 -1
  53. package/components/resourceful_index.mjs +1 -1
  54. package/components/resourceful_record.mjs +2 -2
  55. package/components/resourceful_record_default_form.mjs +1 -1
  56. package/components/resourceful_record_form.mjs +1 -1
  57. package/components/sortable.mjs +1 -1
  58. package/components/svg_icon.mjs +1 -1
  59. package/components/timezone_picker.mjs +1 -1
  60. package/components.mjs +23 -23
  61. package/composables.mjs +11 -11
  62. package/{custom-CgyU3A_B.mjs → custom-Dj2ib6qT.mjs} +7 -7
  63. package/{custom-CgyU3A_B.mjs.map → custom-Dj2ib6qT.mjs.map} +1 -1
  64. package/{date-B8edF8kU.mjs → date-fxb-e0m9.mjs} +10 -10
  65. package/{date-B8edF8kU.mjs.map → date-fxb-e0m9.mjs.map} +1 -1
  66. package/{date_time-BNsYnH-e.mjs → date_time-n4zJtaSr.mjs} +18 -18
  67. package/{date_time-BNsYnH-e.mjs.map → date_time-n4zJtaSr.mjs.map} +1 -1
  68. package/{display-CHspVOz6.mjs → display-DNgEbAdH.mjs} +38 -38
  69. package/{display-CHspVOz6.mjs.map → display-DNgEbAdH.mjs.map} +1 -1
  70. package/{display-pfXaBUr6.mjs → display-DxJktZAm.mjs} +4 -4
  71. package/{display-pfXaBUr6.mjs.map → display-DxJktZAm.mjs.map} +1 -1
  72. package/{enum-DoxJn16e.mjs → enum-CjkTx4L6.mjs} +9 -9
  73. package/{enum-DoxJn16e.mjs.map → enum-CjkTx4L6.mjs.map} +1 -1
  74. package/{exceptions-BeFuVcrH.mjs → exceptions-lwCt3BKI.mjs} +2 -2
  75. package/{exceptions-BeFuVcrH.mjs.map → exceptions-lwCt3BKI.mjs.map} +1 -1
  76. package/exceptions.mjs +2 -2
  77. package/factories.mjs +2 -2
  78. package/{field_composer-CPqM1aSV.mjs → field_composer-B_4w9YL9.mjs} +3 -3
  79. package/{field_composer-CPqM1aSV.mjs.map → field_composer-B_4w9YL9.mjs.map} +1 -1
  80. package/{form-BkQlevYR.mjs → form-B7uOzLn2.mjs} +15 -15
  81. package/{form-BkQlevYR.mjs.map → form-B7uOzLn2.mjs.map} +1 -1
  82. package/{guards-D0G8CU2m.mjs → guards-BI3Zu4tN.mjs} +2 -2
  83. package/{guards-D0G8CU2m.mjs.map → guards-BI3Zu4tN.mjs.map} +1 -1
  84. package/guards.mjs +4 -4
  85. package/helpers.mjs +12 -12
  86. package/{http-ChBUYgv8.mjs → http-B7MNWS03.mjs} +2 -2
  87. package/{http-ChBUYgv8.mjs.map → http-B7MNWS03.mjs.map} +1 -1
  88. package/{http-C15bx-Gn.mjs → http-C2_4xIMQ.mjs} +9 -6
  89. package/{http-C15bx-Gn.mjs.map → http-C2_4xIMQ.mjs.map} +1 -1
  90. package/http.mjs +1 -1
  91. package/{index-DHoLuRuJ.mjs → index-3roRSYqk.mjs} +6 -6
  92. package/{index-DHoLuRuJ.mjs.map → index-3roRSYqk.mjs.map} +1 -1
  93. package/{index-CvhhGjZn.mjs → index-B-PEjqXn.mjs} +3 -3
  94. package/{index-CvhhGjZn.mjs.map → index-B-PEjqXn.mjs.map} +1 -1
  95. package/{index-CdaTAyzs.mjs → index-BC-vhUQX.mjs} +15 -15
  96. package/{index-CdaTAyzs.mjs.map → index-BC-vhUQX.mjs.map} +1 -1
  97. package/{index-CduefDwU.mjs → index-BJmmZly3.mjs} +3 -3
  98. package/{index-CduefDwU.mjs.map → index-BJmmZly3.mjs.map} +1 -1
  99. package/{index-DLzoBhUb.mjs → index-BawSct2l.mjs} +4 -4
  100. package/{index-DLzoBhUb.mjs.map → index-BawSct2l.mjs.map} +1 -1
  101. package/{index-Cb3Fmo7E.mjs → index-DDsxXe9z.mjs} +43 -43
  102. package/{index-Cb3Fmo7E.mjs.map → index-DDsxXe9z.mjs.map} +1 -1
  103. package/{index-BcDX9w4T.mjs → index-DLXKobUt.mjs} +8 -8
  104. package/{index-BcDX9w4T.mjs.map → index-DLXKobUt.mjs.map} +1 -1
  105. package/{index-CHELe70a.mjs → index-DWI2DYc2.mjs} +8 -8
  106. package/{index-CHELe70a.mjs.map → index-DWI2DYc2.mjs.map} +1 -1
  107. package/{index-De0W4KPF.mjs → index-Dh9Wblnw.mjs} +8 -8
  108. package/{index-De0W4KPF.mjs.map → index-Dh9Wblnw.mjs.map} +1 -1
  109. package/index.mjs +37 -37
  110. package/{integer-BWdmDp7S.mjs → integer-BYichJsH.mjs} +3 -3
  111. package/{integer-BWdmDp7S.mjs.map → integer-BYichJsH.mjs.map} +1 -1
  112. package/{ioc-Q-KAX6x1.mjs → ioc-DOAKMPdw.mjs} +2 -2
  113. package/{ioc-Q-KAX6x1.mjs.map → ioc-DOAKMPdw.mjs.map} +1 -1
  114. package/ioc.mjs +1 -1
  115. package/lucid-resourceful-vue-components.css +828 -828
  116. package/{mdi-jw9Ee7p6.mjs → mdi-VGx06N8O.mjs} +9 -9
  117. package/{mdi-jw9Ee7p6.mjs.map → mdi-VGx06N8O.mjs.map} +1 -1
  118. package/{number-Chf-qQs7.mjs → number-B5AryNzI.mjs} +8 -8
  119. package/{number-Chf-qQs7.mjs.map → number-B5AryNzI.mjs.map} +1 -1
  120. package/package.json +5 -5
  121. package/{props-eYGYq1uo.mjs → props-BZryUy0q.mjs} +4 -4
  122. package/{props-eYGYq1uo.mjs.map → props-BZryUy0q.mjs.map} +1 -1
  123. package/{props-fFnbtBgH.mjs → props-Dcuv5Iv7.mjs} +4 -4
  124. package/{props-fFnbtBgH.mjs.map → props-Dcuv5Iv7.mjs.map} +1 -1
  125. package/{renderers-DLsO8zG-.mjs → renderers-C7XOwFHb.mjs} +14 -14
  126. package/{renderers-DLsO8zG-.mjs.map → renderers-C7XOwFHb.mjs.map} +1 -1
  127. package/{string-D-UsgMTx.mjs → string-CJvxnWzd.mjs} +13 -13
  128. package/{string-D-UsgMTx.mjs.map → string-CJvxnWzd.mjs.map} +1 -1
  129. package/{unsigned_integer-7R2vw_Qn.mjs → unsigned_integer-CRQsMWxW.mjs} +4 -4
  130. package/{unsigned_integer-7R2vw_Qn.mjs.map → unsigned_integer-CRQsMWxW.mjs.map} +1 -1
  131. package/{utils-DehfJ8pT.mjs → utils-BBXjywEs.mjs} +2 -2
  132. package/{utils-DehfJ8pT.mjs.map → utils-BBXjywEs.mjs.map} +1 -1
  133. package/{validation-41gHTtyY.mjs → validation-NVIikb_s.mjs} +5 -5
  134. package/{validation-41gHTtyY.mjs.map → validation-NVIikb_s.mjs.map} +1 -1
  135. package/{vendor-nhtio-vuetifiable-CS-KbH1h.mjs → vendor-nhtio-vuetifiable-CTlDfYMJ.mjs} +7 -7
  136. package/{vendor-nhtio-vuetifiable-CS-KbH1h.mjs.map → vendor-nhtio-vuetifiable-CTlDfYMJ.mjs.map} +1 -1
  137. package/common-a_cd4SQg.mjs.map +0 -1
@@ -1,13 +1,13 @@
1
- import { a as useI18n } from "./ioc-Q-KAX6x1.mjs";
1
+ import { a as useI18n } from "./ioc-DOAKMPdw.mjs";
2
2
  import { useLocale } from "vuetify";
3
3
  import { d as deepmerge } from "./index-DGAy0amb.mjs";
4
- import { a as useSlot, s as stripUndefinedValuesFromObject, j as asAbsInt } from "./utils-DehfJ8pT.mjs";
5
- import { C as ControlMenu } from "./index-CHELe70a.mjs";
6
- import { u as useScopedDisplay } from "./display-pfXaBUr6.mjs";
7
- import { d as debounce, j as convertToUnit, u as useRender, i as forwardRefs, I as IN_BROWSER } from "./vendor-nhtio-vuetifiable-CS-KbH1h.mjs";
8
- import { c as controlButtonBarEmits, m as makeControlButtonBarProps } from "./props-eYGYq1uo.mjs";
4
+ import { a as useSlot, s as stripUndefinedValuesFromObject, j as asAbsInt } from "./utils-BBXjywEs.mjs";
5
+ import { C as ControlMenu } from "./index-DWI2DYc2.mjs";
6
+ import { u as useScopedDisplay } from "./display-DxJktZAm.mjs";
7
+ import { d as debounce, k as convertToUnit, u as useRender, j as forwardRefs, I as IN_BROWSER } from "./vendor-nhtio-vuetifiable-CTlDfYMJ.mjs";
8
+ import { c as controlButtonBarEmits, m as makeControlButtonBarProps } from "./props-BZryUy0q.mjs";
9
9
  import { defineComponent, toRefs, computed, ref, cloneVNode, mergeProps, h, onMounted, watch, onUnmounted } from "vue";
10
- import { V as VListItem } from "./VListItem-DojRgtpe.mjs";
10
+ import { V as VListItem } from "./VListItem-CHkJtaF9.mjs";
11
11
  const SUPPORTS_MUTATION_OBSERVER = IN_BROWSER && "MutationObserver" in window;
12
12
  const cloneForMenu = (vnode) => {
13
13
  const updatedProps = stripUndefinedValuesFromObject({
@@ -351,4 +351,4 @@ const ControlButtonBar = defineComponent({
351
351
  export {
352
352
  ControlButtonBar as C
353
353
  };
354
- //# sourceMappingURL=index-BcDX9w4T.mjs.map
354
+ //# sourceMappingURL=index-DLXKobUt.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-BcDX9w4T.mjs","sources":["../src/private/control-button-bar/index.ts"],"sourcesContent":["/*\n|--------------------------------------------------------------------------\n| Control Button Bar Component\n|--------------------------------------------------------------------------\n|\n| An intelligent, responsive toolbar component that automatically handles\n| button overflow with dropdown menus. Uses container-aware responsive\n| breakpoints to adapt to any layout constraint, providing seamless UX\n| across devices and contexts.\n|\n*/\n\nimport { useI18n } from '../ioc'\nimport { useLocale } from 'vuetify'\nimport { deepmerge } from 'deepmerge-ts'\nimport { useSlot } from '../common/utils'\nimport { ControlMenu } from '../control-menu'\nimport { useScopedDisplay } from '../ux/display'\nimport { VListItem } from 'vuetify/components/VList'\nimport { debounce } from '@nhtio/vuetifiable/util/helpers'\nimport { IN_BROWSER } from '@nhtio/vuetifiable/util/globals'\nimport { useRender } from '@nhtio/vuetifiable/util/useRender'\nimport { convertToUnit } from '@nhtio/vuetifiable/util/helpers'\nimport { forwardRefs } from '@nhtio/vuetifiable/composables/forwardRefs'\nimport { makeControlButtonBarProps, controlButtonBarEmits } from './props'\nimport { stripUndefinedValuesFromObject, asAbsInt } from '../common/utils'\nimport {\n computed,\n ref,\n h,\n defineComponent,\n onMounted,\n onUnmounted,\n toRefs,\n mergeProps,\n cloneVNode,\n watch,\n} from 'vue'\nimport type { WatchStopHandle, SlotsType, VNode } from 'vue'\nimport type { ControlButtonBarOverflowMenuButtonProps } from './props'\n\nexport type { ControlButtonBarProps } from './props'\n\nconst SUPPORTS_MUTATION_OBSERVER = IN_BROWSER && 'MutationObserver' in window\n\nconst cloneForMenu = (vnode: VNode) => {\n const updatedProps = stripUndefinedValuesFromObject({\n ...vnode.props,\n 'id': undefined,\n 'aria-controls': undefined,\n ...mergeProps(\n {\n class: vnode.props?.class ? vnode.props.class : undefined,\n },\n {\n class: ['mx-0'],\n }\n ),\n // we are adding a custom prop to identify that this button is rendered in the menu\n // if the component supports it, it can use this prop to adjust its styling/behavior\n 'inOverflowMenu': true,\n })\n return cloneVNode(vnode, updatedProps)\n}\n\n/**\n * Slot types for the ControlButtonBar component.\n *\n * @public\n */\nexport type ControlButtonBarSlots = {\n /** Content to prepend to the overflow menu */\n 'prepend-menu'?: () => any\n /** Content to append to the overflow menu */\n 'append-menu'?: () => any\n}\n\n/**\n * A responsive toolbar component that automatically handles button overflow with dropdown menus.\n *\n * Features:\n * - Container-aware responsive behavior using useScopedDisplay\n * - Automatic overflow detection with visual jumping reduction\n * - RTL support with intelligent menu positioning\n * - MutationObserver for dynamic content changes\n * - Customizable gap spacing and justification\n * - Performance-optimized with debounced calculations\n *\n * @example\n * ```vue\n * <ControlButtonBar\n * :buttons=\"[\n * h(VBtn, { text: 'Columns' }),\n * h(VBtn, { text: 'Filters' }),\n * h(VBtn, { text: 'Sorting' })\n * ]\"\n * justification=\"center\"\n * :gap=\"2\"\n * />\n * ```\n *\n * @public\n */\nexport const ControlButtonBar = defineComponent({\n name: 'ControlButtonBar',\n inheritAttrs: false,\n props: makeControlButtonBarProps(),\n emits: controlButtonBarEmits,\n slots: Object as SlotsType<ControlButtonBarSlots>,\n setup(props, { attrs, slots }) {\n const t = useI18n()\n const { isRtl } = useLocale()\n const {\n buttons,\n justification,\n gap,\n overflowMenuButtonOptions,\n class: className,\n style,\n } = toRefs(props)\n const prependMenuSlot = useSlot<ControlButtonBarSlots>('prepend-menu', slots)\n const appendMenuSlot = useSlot<ControlButtonBarSlots>('append-menu', slots)\n const normalizedOverflowMenuButtonOptions = computed<ControlButtonBarOverflowMenuButtonProps>(\n () =>\n deepmerge(\n {\n cta: t('general.more'),\n },\n stripUndefinedValuesFromObject({\n cta: overflowMenuButtonOptions.value.cta,\n }),\n {\n activator: stripUndefinedValuesFromObject({\n color: overflowMenuButtonOptions.value.color,\n density: overflowMenuButtonOptions.value.density,\n size: overflowMenuButtonOptions.value.size,\n }),\n }\n )\n )\n const containerRef = ref<HTMLDivElement | null>(null)\n const wrapperRef = ref<HTMLDivElement | null>(null)\n const overflowMenuWrapperRef = ref<HTMLElement | null>(null)\n const overflowMenuButtonRef = ref<ControlMenu | null>(null)\n const overflowMenuButtonIsOpen = computed(() => {\n if (!overflowMenuButtonRef.value) return false\n return overflowMenuButtonRef.value.isOpen\n })\n const usableButtons = computed(() => Array.from(buttons.value).map((btn) => cloneVNode(btn)))\n const clonedButtons = computed(() =>\n !overflowMenuButtonIsOpen.value\n ? []\n : Array.from(buttons.value).map((btn) => cloneForMenu(btn))\n )\n const { width: containerWidth, intersecting, xs } = useScopedDisplay(containerRef)\n const { width: wrapperWidth } = useScopedDisplay(wrapperRef)\n const { width: overflowMenuWrapperWidth, height: overflowMenuWrapperHeight } =\n useScopedDisplay(overflowMenuWrapperRef)\n const containerProps = computed(() =>\n mergeProps(\n {\n class: attrs.class || {},\n style: attrs.style || {},\n },\n {\n class: className.value,\n style: style.value,\n },\n {\n class: ['w-100', 'position-relative', 'r-control-button-bar'],\n role: 'toolbar',\n style: {\n transition: 'opacity 0.2s ease, transform 0.2s ease',\n },\n }\n )\n )\n const overflowedButtonIndexes = ref<number[]>([])\n const lastVisibleButtonEndOffset = ref<number | null>(null)\n const showOverflowMenu = computed(\n () => buttons.value.length > 1 && overflowedButtonIndexes.value.length > 0\n )\n const overflowMenuPosition = computed<'right' | 'left'>(() =>\n isRtl.value\n ? justification.value === 'start'\n ? 'left'\n : 'right'\n : justification.value === 'start'\n ? 'right'\n : 'left'\n )\n const computeOverflowedButtonIndexes = debounce(() => {\n // if there is no container, wrapper, or overflow menu wrapper, we cannot compute overflow\n if (!containerRef.value || !wrapperRef.value || !overflowMenuWrapperRef.value) return\n // if the container is not intersecting (visible), do not compute overflow\n if (!intersecting.value) return\n // if there are less than 2 buttons, then there cannot be any overflow\n if (buttons.value.length < 2) {\n overflowedButtonIndexes.value = []\n return\n }\n // we have 2 values to compare against\n // if none of the buttons extend beyond the wrapper's total width, then there is no overflow\n // otherwise anything that is beyond the wrapper's width minus the overflow button's width\n // is considered overflowed and will be set to 0 opacity + pointer-events: none and then\n // duplicated into the overflow menu\n const wrapperEl = wrapperRef.value\n const buttonWrappers = Array.from(wrapperEl.children) as HTMLDivElement[]\n const currentWrapperWidth = containerWidth.value\n const availableWidthWithOverflowMenu = containerWidth.value - overflowMenuWrapperWidth.value\n\n const buttonWrapperIndexAndOffsets = buttonWrappers.map((wrapper, index) => ({\n index,\n left: wrapper.offsetLeft,\n right: wrapper.offsetLeft + wrapper.offsetWidth,\n }))\n\n // Check if any buttons overflow the wrapper when the menu is visible\n const buttonsOverflowingWrapperIfMenuVisisble = buttonWrapperIndexAndOffsets.filter(\n ({ left, right }) =>\n 'left' === overflowMenuPosition.value\n ? left < overflowMenuWrapperWidth.value\n : right > availableWidthWithOverflowMenu\n )\n\n // if no buttons overflow the wrapper when the menu is visible, exit early\n if (buttonsOverflowingWrapperIfMenuVisisble.length === 0) {\n overflowedButtonIndexes.value = []\n lastVisibleButtonEndOffset.value = null\n return\n }\n\n // check if any of the buttons overflow the wrapper if the menu is not visible\n const someOutsideContainer = buttonsOverflowingWrapperIfMenuVisisble.some(\n ({ left, right }) =>\n 'left' === overflowMenuPosition.value ? left < 0 : right > currentWrapperWidth\n )\n // if none of the buttons overflow the wrapper if the menu is not visible, exit early\n if (!someOutsideContainer) {\n overflowedButtonIndexes.value = []\n lastVisibleButtonEndOffset.value = null\n return\n }\n\n // otherwise, the buttons that overflow the wrapper when the menu is visible are the ones that are overflowed\n overflowedButtonIndexes.value = buttonsOverflowingWrapperIfMenuVisisble.map(\n ({ index }) => index\n )\n\n // in order to make the overflow menu button flow more naturally,\n // we're going to reposition it based on the position of the first hidden button\n const computedHiddenButtons = buttonsOverflowingWrapperIfMenuVisisble.sort((a, b) => {\n if ('left' === overflowMenuPosition.value) {\n return b.right - a.right\n } else {\n return a.left - b.left\n }\n })\n\n const firstHiddenButton = computedHiddenButtons[0]\n if (!firstHiddenButton) {\n lastVisibleButtonEndOffset.value = null\n return\n }\n lastVisibleButtonEndOffset.value =\n 'left' === overflowMenuPosition.value ? firstHiddenButton.right : firstHiddenButton.left\n }, 50)\n const wrapperMutationObserverHandler = (entries: MutationRecord[]) => {\n if (entries.some((e) => e.type === 'childList')) {\n queueMicrotask(() => computeOverflowedButtonIndexes())\n }\n }\n const wrapperObserver = (is: HTMLDivElement | null, was: HTMLDivElement | null | undefined) => {\n if (was && wrapperMutationObserver) {\n wrapperMutationObserver.disconnect()\n }\n if (is && wrapperMutationObserver) {\n wrapperMutationObserver.observe(is, {\n childList: true,\n subtree: false,\n attributes: false,\n characterData: false,\n })\n }\n }\n const closeOverflowMenu = () => {\n if (overflowMenuButtonRef.value) {\n overflowMenuButtonRef.value.close()\n }\n }\n const wrapperProps = computed(() => ({\n class: [\n 'd-flex',\n 'overflow-x-hidden',\n 'w-100',\n 'r-control-button-bar__wrapper',\n {\n 'justify-start': justification.value === 'start',\n 'justify-end': justification.value === 'end',\n },\n ],\n style: {\n paddingBottom: '5px',\n marginBottom: '-5px',\n },\n }))\n const overflowMenuWrapperOffsets = computed(() => {\n if (lastVisibleButtonEndOffset.value === null || xs.value) {\n return stripUndefinedValuesFromObject({\n left: 'left' === overflowMenuPosition.value ? 0 : undefined,\n right: 'right' === overflowMenuPosition.value ? 0 : undefined,\n })\n } else {\n return stripUndefinedValuesFromObject({\n left:\n 'left' === overflowMenuPosition.value\n ? // add 8px to account for the 8px gap on the left side of the button\n convertToUnit(\n lastVisibleButtonEndOffset.value - overflowMenuWrapperWidth.value + 8,\n 'px'\n )\n : // remove 8px to account for the 8px gap on the right side of the button\n convertToUnit(lastVisibleButtonEndOffset.value - 8, 'px'),\n })\n }\n })\n const overflowMenuWrapperProps = computed(() => ({\n class: [\n 'd-flex',\n 'align-center',\n 'r-control-button-bar__overflow-menu',\n 'position-absolute',\n {\n [`ps-${gap.value}`]:\n lastVisibleButtonEndOffset.value === null &&\n asAbsInt(gap.value) > 0 &&\n 'end' !== justification.value,\n [`pe-${gap.value}`]:\n lastVisibleButtonEndOffset.value === null &&\n asAbsInt(gap.value) > 0 &&\n 'end' === justification.value,\n },\n ],\n style: {\n ...overflowMenuWrapperOffsets.value,\n ...stripUndefinedValuesFromObject({\n top: `calc(50% - ${convertToUnit(overflowMenuWrapperHeight.value / 2)})`,\n opacity: showOverflowMenu.value ? 1 : 0,\n pointerEvents: showOverflowMenu.value ? undefined : 'none',\n zIndex: showOverflowMenu.value ? 1 : undefined,\n }),\n },\n }))\n const watchStopHandles: WatchStopHandle[] = []\n let wrapperMutationObserver: MutationObserver | undefined\n useRender(() =>\n h(\n 'div',\n {\n ref: containerRef,\n ...containerProps.value,\n },\n [\n h(\n 'div',\n {\n ref: wrapperRef,\n ...wrapperProps.value,\n },\n Array.from(usableButtons.value).map((btnVNode, btnIndex) =>\n h(\n 'div',\n {\n key: `button-wrapper-${btnIndex}`,\n dataBtnIndex: btnIndex,\n class: {\n [`me-${gap.value}`]:\n btnIndex < buttons.value.length - 1 &&\n asAbsInt(gap.value) > 0 &&\n 'end' !== justification.value,\n [`ms-${gap.value}`]:\n btnIndex < buttons.value.length - 1 &&\n asAbsInt(gap.value) > 0 &&\n 'end' === justification.value,\n },\n style: stripUndefinedValuesFromObject({\n opacity: overflowedButtonIndexes.value.includes(btnIndex) ? 0 : 1,\n pointerEvents: overflowedButtonIndexes.value.includes(btnIndex)\n ? 'none'\n : undefined,\n }),\n },\n btnVNode\n )\n )\n ),\n h(\n 'div',\n { ref: overflowMenuWrapperRef, ...overflowMenuWrapperProps.value },\n h(\n ControlMenu,\n { ref: overflowMenuButtonRef, ...normalizedOverflowMenuButtonOptions.value },\n () => [\n prependMenuSlot ? prependMenuSlot() : null,\n ...Array.from(overflowedButtonIndexes.value).map((btnIndex) =>\n h(VListItem, { key: `overflowed-button-${btnIndex}` }, () =>\n h(\n 'div',\n { class: ['w-100', 'd-flex', 'justify-center'] },\n clonedButtons.value[btnIndex] || null\n )\n )\n ),\n appendMenuSlot ? appendMenuSlot() : null,\n ]\n )\n ),\n ]\n )\n )\n onMounted(() => {\n watchStopHandles.push(\n watch(containerWidth, computeOverflowedButtonIndexes, { immediate: true })\n )\n watchStopHandles.push(\n watch(justification, computeOverflowedButtonIndexes, { immediate: true })\n )\n watchStopHandles.push(\n watch(intersecting, computeOverflowedButtonIndexes, { immediate: true })\n )\n watchStopHandles.push(\n watch(wrapperWidth, computeOverflowedButtonIndexes, { immediate: true })\n )\n watchStopHandles.push(\n watch(overflowMenuWrapperWidth, computeOverflowedButtonIndexes, { immediate: true })\n )\n watchStopHandles.push(\n watch(overflowMenuPosition, computeOverflowedButtonIndexes, { immediate: true })\n )\n if (SUPPORTS_MUTATION_OBSERVER) {\n wrapperMutationObserver = new MutationObserver(wrapperMutationObserverHandler)\n }\n watchStopHandles.push(watch(wrapperRef, wrapperObserver, { immediate: true }))\n computeOverflowedButtonIndexes.immediate()\n })\n onUnmounted(() => {\n // close the menu if it is open\n closeOverflowMenu()\n // clear all of the watch stop handles\n watchStopHandles.forEach((stopHandle) => stopHandle())\n watchStopHandles.splice(0, watchStopHandles.length)\n // disconnect & cleanup the mutation observer\n if (wrapperMutationObserver) {\n wrapperMutationObserver.disconnect()\n wrapperMutationObserver = undefined\n }\n })\n return forwardRefs(\n {\n overflowMenuPosition,\n lastVisibleButtonEndOffset,\n overflowed: showOverflowMenu,\n reflow: computeOverflowedButtonIndexes,\n close: closeOverflowMenu,\n buttons: buttons,\n usableButtons: usableButtons,\n clonedButtons: clonedButtons,\n },\n containerRef as any,\n wrapperRef as any,\n overflowMenuWrapperRef as any\n )\n },\n})\n\n/**\n * Component instance type for ControlButtonBar.\n *\n * @public\n */\nexport type ControlButtonBar = InstanceType<typeof ControlButtonBar>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index-DLXKobUt.mjs","sources":["../src/private/control-button-bar/index.ts"],"sourcesContent":["/*\n|--------------------------------------------------------------------------\n| Control Button Bar Component\n|--------------------------------------------------------------------------\n|\n| An intelligent, responsive toolbar component that automatically handles\n| button overflow with dropdown menus. Uses container-aware responsive\n| breakpoints to adapt to any layout constraint, providing seamless UX\n| across devices and contexts.\n|\n*/\n\nimport { useI18n } from '../ioc'\nimport { useLocale } from 'vuetify'\nimport { deepmerge } from 'deepmerge-ts'\nimport { useSlot } from '../common/utils'\nimport { ControlMenu } from '../control-menu'\nimport { useScopedDisplay } from '../ux/display'\nimport { VListItem } from 'vuetify/components/VList'\nimport { debounce } from '@nhtio/vuetifiable/util/helpers'\nimport { IN_BROWSER } from '@nhtio/vuetifiable/util/globals'\nimport { useRender } from '@nhtio/vuetifiable/util/useRender'\nimport { convertToUnit } from '@nhtio/vuetifiable/util/helpers'\nimport { forwardRefs } from '@nhtio/vuetifiable/composables/forwardRefs'\nimport { makeControlButtonBarProps, controlButtonBarEmits } from './props'\nimport { stripUndefinedValuesFromObject, asAbsInt } from '../common/utils'\nimport {\n computed,\n ref,\n h,\n defineComponent,\n onMounted,\n onUnmounted,\n toRefs,\n mergeProps,\n cloneVNode,\n watch,\n} from 'vue'\nimport type { WatchStopHandle, SlotsType, VNode } from 'vue'\nimport type { ControlButtonBarOverflowMenuButtonProps } from './props'\n\nexport type { ControlButtonBarProps } from './props'\n\nconst SUPPORTS_MUTATION_OBSERVER = IN_BROWSER && 'MutationObserver' in window\n\nconst cloneForMenu = (vnode: VNode) => {\n const updatedProps = stripUndefinedValuesFromObject({\n ...vnode.props,\n 'id': undefined,\n 'aria-controls': undefined,\n ...mergeProps(\n {\n class: vnode.props?.class ? vnode.props.class : undefined,\n },\n {\n class: ['mx-0'],\n }\n ),\n // we are adding a custom prop to identify that this button is rendered in the menu\n // if the component supports it, it can use this prop to adjust its styling/behavior\n 'inOverflowMenu': true,\n })\n return cloneVNode(vnode, updatedProps)\n}\n\n/**\n * Slot types for the ControlButtonBar component.\n *\n * @public\n */\nexport type ControlButtonBarSlots = {\n /** Content to prepend to the overflow menu */\n 'prepend-menu'?: () => any\n /** Content to append to the overflow menu */\n 'append-menu'?: () => any\n}\n\n/**\n * A responsive toolbar component that automatically handles button overflow with dropdown menus.\n *\n * Features:\n * - Container-aware responsive behavior using useScopedDisplay\n * - Automatic overflow detection with visual jumping reduction\n * - RTL support with intelligent menu positioning\n * - MutationObserver for dynamic content changes\n * - Customizable gap spacing and justification\n * - Performance-optimized with debounced calculations\n *\n * @example\n * ```vue\n * <ControlButtonBar\n * :buttons=\"[\n * h(VBtn, { text: 'Columns' }),\n * h(VBtn, { text: 'Filters' }),\n * h(VBtn, { text: 'Sorting' })\n * ]\"\n * justification=\"center\"\n * :gap=\"2\"\n * />\n * ```\n *\n * @public\n */\nexport const ControlButtonBar = defineComponent({\n name: 'ControlButtonBar',\n inheritAttrs: false,\n props: makeControlButtonBarProps(),\n emits: controlButtonBarEmits,\n slots: Object as SlotsType<ControlButtonBarSlots>,\n setup(props, { attrs, slots }) {\n const t = useI18n()\n const { isRtl } = useLocale()\n const {\n buttons,\n justification,\n gap,\n overflowMenuButtonOptions,\n class: className,\n style,\n } = toRefs(props)\n const prependMenuSlot = useSlot<ControlButtonBarSlots>('prepend-menu', slots)\n const appendMenuSlot = useSlot<ControlButtonBarSlots>('append-menu', slots)\n const normalizedOverflowMenuButtonOptions = computed<ControlButtonBarOverflowMenuButtonProps>(\n () =>\n deepmerge(\n {\n cta: t('general.more'),\n },\n stripUndefinedValuesFromObject({\n cta: overflowMenuButtonOptions.value.cta,\n }),\n {\n activator: stripUndefinedValuesFromObject({\n color: overflowMenuButtonOptions.value.color,\n density: overflowMenuButtonOptions.value.density,\n size: overflowMenuButtonOptions.value.size,\n }),\n }\n )\n )\n const containerRef = ref<HTMLDivElement | null>(null)\n const wrapperRef = ref<HTMLDivElement | null>(null)\n const overflowMenuWrapperRef = ref<HTMLElement | null>(null)\n const overflowMenuButtonRef = ref<ControlMenu | null>(null)\n const overflowMenuButtonIsOpen = computed(() => {\n if (!overflowMenuButtonRef.value) return false\n return overflowMenuButtonRef.value.isOpen\n })\n const usableButtons = computed(() => Array.from(buttons.value).map((btn) => cloneVNode(btn)))\n const clonedButtons = computed(() =>\n !overflowMenuButtonIsOpen.value\n ? []\n : Array.from(buttons.value).map((btn) => cloneForMenu(btn))\n )\n const { width: containerWidth, intersecting, xs } = useScopedDisplay(containerRef)\n const { width: wrapperWidth } = useScopedDisplay(wrapperRef)\n const { width: overflowMenuWrapperWidth, height: overflowMenuWrapperHeight } =\n useScopedDisplay(overflowMenuWrapperRef)\n const containerProps = computed(() =>\n mergeProps(\n {\n class: attrs.class || {},\n style: attrs.style || {},\n },\n {\n class: className.value,\n style: style.value,\n },\n {\n class: ['w-100', 'position-relative', 'r-control-button-bar'],\n role: 'toolbar',\n style: {\n transition: 'opacity 0.2s ease, transform 0.2s ease',\n },\n }\n )\n )\n const overflowedButtonIndexes = ref<number[]>([])\n const lastVisibleButtonEndOffset = ref<number | null>(null)\n const showOverflowMenu = computed(\n () => buttons.value.length > 1 && overflowedButtonIndexes.value.length > 0\n )\n const overflowMenuPosition = computed<'right' | 'left'>(() =>\n isRtl.value\n ? justification.value === 'start'\n ? 'left'\n : 'right'\n : justification.value === 'start'\n ? 'right'\n : 'left'\n )\n const computeOverflowedButtonIndexes = debounce(() => {\n // if there is no container, wrapper, or overflow menu wrapper, we cannot compute overflow\n if (!containerRef.value || !wrapperRef.value || !overflowMenuWrapperRef.value) return\n // if the container is not intersecting (visible), do not compute overflow\n if (!intersecting.value) return\n // if there are less than 2 buttons, then there cannot be any overflow\n if (buttons.value.length < 2) {\n overflowedButtonIndexes.value = []\n return\n }\n // we have 2 values to compare against\n // if none of the buttons extend beyond the wrapper's total width, then there is no overflow\n // otherwise anything that is beyond the wrapper's width minus the overflow button's width\n // is considered overflowed and will be set to 0 opacity + pointer-events: none and then\n // duplicated into the overflow menu\n const wrapperEl = wrapperRef.value\n const buttonWrappers = Array.from(wrapperEl.children) as HTMLDivElement[]\n const currentWrapperWidth = containerWidth.value\n const availableWidthWithOverflowMenu = containerWidth.value - overflowMenuWrapperWidth.value\n\n const buttonWrapperIndexAndOffsets = buttonWrappers.map((wrapper, index) => ({\n index,\n left: wrapper.offsetLeft,\n right: wrapper.offsetLeft + wrapper.offsetWidth,\n }))\n\n // Check if any buttons overflow the wrapper when the menu is visible\n const buttonsOverflowingWrapperIfMenuVisisble = buttonWrapperIndexAndOffsets.filter(\n ({ left, right }) =>\n 'left' === overflowMenuPosition.value\n ? left < overflowMenuWrapperWidth.value\n : right > availableWidthWithOverflowMenu\n )\n\n // if no buttons overflow the wrapper when the menu is visible, exit early\n if (buttonsOverflowingWrapperIfMenuVisisble.length === 0) {\n overflowedButtonIndexes.value = []\n lastVisibleButtonEndOffset.value = null\n return\n }\n\n // check if any of the buttons overflow the wrapper if the menu is not visible\n const someOutsideContainer = buttonsOverflowingWrapperIfMenuVisisble.some(\n ({ left, right }) =>\n 'left' === overflowMenuPosition.value ? left < 0 : right > currentWrapperWidth\n )\n // if none of the buttons overflow the wrapper if the menu is not visible, exit early\n if (!someOutsideContainer) {\n overflowedButtonIndexes.value = []\n lastVisibleButtonEndOffset.value = null\n return\n }\n\n // otherwise, the buttons that overflow the wrapper when the menu is visible are the ones that are overflowed\n overflowedButtonIndexes.value = buttonsOverflowingWrapperIfMenuVisisble.map(\n ({ index }) => index\n )\n\n // in order to make the overflow menu button flow more naturally,\n // we're going to reposition it based on the position of the first hidden button\n const computedHiddenButtons = buttonsOverflowingWrapperIfMenuVisisble.sort((a, b) => {\n if ('left' === overflowMenuPosition.value) {\n return b.right - a.right\n } else {\n return a.left - b.left\n }\n })\n\n const firstHiddenButton = computedHiddenButtons[0]\n if (!firstHiddenButton) {\n lastVisibleButtonEndOffset.value = null\n return\n }\n lastVisibleButtonEndOffset.value =\n 'left' === overflowMenuPosition.value ? firstHiddenButton.right : firstHiddenButton.left\n }, 50)\n const wrapperMutationObserverHandler = (entries: MutationRecord[]) => {\n if (entries.some((e) => e.type === 'childList')) {\n queueMicrotask(() => computeOverflowedButtonIndexes())\n }\n }\n const wrapperObserver = (is: HTMLDivElement | null, was: HTMLDivElement | null | undefined) => {\n if (was && wrapperMutationObserver) {\n wrapperMutationObserver.disconnect()\n }\n if (is && wrapperMutationObserver) {\n wrapperMutationObserver.observe(is, {\n childList: true,\n subtree: false,\n attributes: false,\n characterData: false,\n })\n }\n }\n const closeOverflowMenu = () => {\n if (overflowMenuButtonRef.value) {\n overflowMenuButtonRef.value.close()\n }\n }\n const wrapperProps = computed(() => ({\n class: [\n 'd-flex',\n 'overflow-x-hidden',\n 'w-100',\n 'r-control-button-bar__wrapper',\n {\n 'justify-start': justification.value === 'start',\n 'justify-end': justification.value === 'end',\n },\n ],\n style: {\n paddingBottom: '5px',\n marginBottom: '-5px',\n },\n }))\n const overflowMenuWrapperOffsets = computed(() => {\n if (lastVisibleButtonEndOffset.value === null || xs.value) {\n return stripUndefinedValuesFromObject({\n left: 'left' === overflowMenuPosition.value ? 0 : undefined,\n right: 'right' === overflowMenuPosition.value ? 0 : undefined,\n })\n } else {\n return stripUndefinedValuesFromObject({\n left:\n 'left' === overflowMenuPosition.value\n ? // add 8px to account for the 8px gap on the left side of the button\n convertToUnit(\n lastVisibleButtonEndOffset.value - overflowMenuWrapperWidth.value + 8,\n 'px'\n )\n : // remove 8px to account for the 8px gap on the right side of the button\n convertToUnit(lastVisibleButtonEndOffset.value - 8, 'px'),\n })\n }\n })\n const overflowMenuWrapperProps = computed(() => ({\n class: [\n 'd-flex',\n 'align-center',\n 'r-control-button-bar__overflow-menu',\n 'position-absolute',\n {\n [`ps-${gap.value}`]:\n lastVisibleButtonEndOffset.value === null &&\n asAbsInt(gap.value) > 0 &&\n 'end' !== justification.value,\n [`pe-${gap.value}`]:\n lastVisibleButtonEndOffset.value === null &&\n asAbsInt(gap.value) > 0 &&\n 'end' === justification.value,\n },\n ],\n style: {\n ...overflowMenuWrapperOffsets.value,\n ...stripUndefinedValuesFromObject({\n top: `calc(50% - ${convertToUnit(overflowMenuWrapperHeight.value / 2)})`,\n opacity: showOverflowMenu.value ? 1 : 0,\n pointerEvents: showOverflowMenu.value ? undefined : 'none',\n zIndex: showOverflowMenu.value ? 1 : undefined,\n }),\n },\n }))\n const watchStopHandles: WatchStopHandle[] = []\n let wrapperMutationObserver: MutationObserver | undefined\n useRender(() =>\n h(\n 'div',\n {\n ref: containerRef,\n ...containerProps.value,\n },\n [\n h(\n 'div',\n {\n ref: wrapperRef,\n ...wrapperProps.value,\n },\n Array.from(usableButtons.value).map((btnVNode, btnIndex) =>\n h(\n 'div',\n {\n key: `button-wrapper-${btnIndex}`,\n dataBtnIndex: btnIndex,\n class: {\n [`me-${gap.value}`]:\n btnIndex < buttons.value.length - 1 &&\n asAbsInt(gap.value) > 0 &&\n 'end' !== justification.value,\n [`ms-${gap.value}`]:\n btnIndex < buttons.value.length - 1 &&\n asAbsInt(gap.value) > 0 &&\n 'end' === justification.value,\n },\n style: stripUndefinedValuesFromObject({\n opacity: overflowedButtonIndexes.value.includes(btnIndex) ? 0 : 1,\n pointerEvents: overflowedButtonIndexes.value.includes(btnIndex)\n ? 'none'\n : undefined,\n }),\n },\n btnVNode\n )\n )\n ),\n h(\n 'div',\n { ref: overflowMenuWrapperRef, ...overflowMenuWrapperProps.value },\n h(\n ControlMenu,\n { ref: overflowMenuButtonRef, ...normalizedOverflowMenuButtonOptions.value },\n () => [\n prependMenuSlot ? prependMenuSlot() : null,\n ...Array.from(overflowedButtonIndexes.value).map((btnIndex) =>\n h(VListItem, { key: `overflowed-button-${btnIndex}` }, () =>\n h(\n 'div',\n { class: ['w-100', 'd-flex', 'justify-center'] },\n clonedButtons.value[btnIndex] || null\n )\n )\n ),\n appendMenuSlot ? appendMenuSlot() : null,\n ]\n )\n ),\n ]\n )\n )\n onMounted(() => {\n watchStopHandles.push(\n watch(containerWidth, computeOverflowedButtonIndexes, { immediate: true })\n )\n watchStopHandles.push(\n watch(justification, computeOverflowedButtonIndexes, { immediate: true })\n )\n watchStopHandles.push(\n watch(intersecting, computeOverflowedButtonIndexes, { immediate: true })\n )\n watchStopHandles.push(\n watch(wrapperWidth, computeOverflowedButtonIndexes, { immediate: true })\n )\n watchStopHandles.push(\n watch(overflowMenuWrapperWidth, computeOverflowedButtonIndexes, { immediate: true })\n )\n watchStopHandles.push(\n watch(overflowMenuPosition, computeOverflowedButtonIndexes, { immediate: true })\n )\n if (SUPPORTS_MUTATION_OBSERVER) {\n wrapperMutationObserver = new MutationObserver(wrapperMutationObserverHandler)\n }\n watchStopHandles.push(watch(wrapperRef, wrapperObserver, { immediate: true }))\n computeOverflowedButtonIndexes.immediate()\n })\n onUnmounted(() => {\n // close the menu if it is open\n closeOverflowMenu()\n // clear all of the watch stop handles\n watchStopHandles.forEach((stopHandle) => stopHandle())\n watchStopHandles.splice(0, watchStopHandles.length)\n // disconnect & cleanup the mutation observer\n if (wrapperMutationObserver) {\n wrapperMutationObserver.disconnect()\n wrapperMutationObserver = undefined\n }\n })\n return forwardRefs(\n {\n overflowMenuPosition,\n lastVisibleButtonEndOffset,\n overflowed: showOverflowMenu,\n reflow: computeOverflowedButtonIndexes,\n close: closeOverflowMenu,\n buttons: buttons,\n usableButtons: usableButtons,\n clonedButtons: clonedButtons,\n },\n containerRef as any,\n wrapperRef as any,\n overflowMenuWrapperRef as any\n )\n },\n})\n\n/**\n * Component instance type for ControlButtonBar.\n *\n * @public\n */\nexport type ControlButtonBar = InstanceType<typeof ControlButtonBar>\n"],"names":[],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  import { useDisplay } from "vuetify";
2
- import { S as SvgIcon } from "./index-CduefDwU.mjs";
2
+ import { S as SvgIcon } from "./index-BJmmZly3.mjs";
3
3
  import { d as deepmerge } from "./index-DGAy0amb.mjs";
4
- import { a as useSlot } from "./utils-DehfJ8pT.mjs";
4
+ import { a as useSlot } from "./utils-BBXjywEs.mjs";
5
5
  import { n as numeral } from "./numeral-DmC5bR5g.mjs";
6
- import { k as mdiMenuUp, g as mdiMenuDown, V as VCard } from "./mdi-jw9Ee7p6.mjs";
7
- import { C as ControlButton } from "./index-DHoLuRuJ.mjs";
8
- import { u as useRender } from "./vendor-nhtio-vuetifiable-CS-KbH1h.mjs";
9
- import { m as makeControlMenuProps, d as defaultActivatorValues } from "./props-fFnbtBgH.mjs";
6
+ import { k as mdiMenuUp, g as mdiMenuDown, V as VCard } from "./mdi-VGx06N8O.mjs";
7
+ import { C as ControlButton } from "./index-3roRSYqk.mjs";
8
+ import { u as useRender } from "./vendor-nhtio-vuetifiable-CTlDfYMJ.mjs";
9
+ import { m as makeControlMenuProps, d as defaultActivatorValues } from "./props-Dcuv5Iv7.mjs";
10
10
  import { defineComponent, toRefs, ref, computed, h } from "vue";
11
- import { V as VMenu } from "./VMenu-D2biKkpd.mjs";
11
+ import { V as VMenu } from "./VMenu-Xveh72QZ.mjs";
12
12
  const ControlMenu = defineComponent({
13
13
  name: "ControlMenu",
14
14
  props: makeControlMenuProps(),
@@ -123,4 +123,4 @@ const ControlMenu = defineComponent({
123
123
  export {
124
124
  ControlMenu as C
125
125
  };
126
- //# sourceMappingURL=index-CHELe70a.mjs.map
126
+ //# sourceMappingURL=index-DWI2DYc2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-CHELe70a.mjs","sources":["../src/private/control-menu/index.ts"],"sourcesContent":["import { useDisplay } from 'vuetify'\nimport { SvgIcon } from '../svg-icon'\nimport { deepmerge } from 'deepmerge-ts'\nimport { useSlot } from '../common/utils'\nimport { default as numeral } from 'numeral'\nimport { VMenu } from 'vuetify/components/VMenu'\nimport { VCard } from 'vuetify/components/VCard'\nimport { mdiMenuUp, mdiMenuDown } from '@mdi/js'\nimport { ControlButton } from '../control-button'\nimport { useRender } from '@nhtio/vuetifiable/util/useRender'\nimport { makeControlMenuProps, defaultActivatorValues } from './props'\nimport { defineComponent, h, computed, toRefs, ref, SlotsType } from 'vue'\nimport type { ControlButtonProps, ControlButtonState } from '../control-button/props'\n\ntype ControMenuButtonSlots = {\n prepend: (state: ControlButtonState) => any\n cta: (state: ControlButtonState) => any\n append: (state: ControlButtonState) => any\n default: (args: { close: () => void }) => any\n}\n\nexport const ControlMenu = defineComponent({\n name: 'ControlMenu',\n props: makeControlMenuProps(),\n slots: Object as SlotsType<ControMenuButtonSlots>,\n setup(props, { slots }) {\n const {\n icon,\n cta,\n count,\n countFormat,\n activator,\n color,\n badgeColor,\n inOverflowMenu,\n disabled,\n noPadding,\n } = toRefs(props)\n const prependSlot = useSlot<ControMenuButtonSlots>('prepend', slots)\n const ctaSlot = useSlot<ControMenuButtonSlots>('cta', slots)\n const appendSlot = useSlot<ControMenuButtonSlots>('append', slots)\n const defaultSlot = useSlot<ControMenuButtonSlots>('default', slots)\n const { height } = useDisplay()\n const open = ref(false)\n const anchor = ref<ControlButton | null>(null)\n const vMenuBindings = computed(() => ({\n 'modelValue': open.value,\n 'onUpdate:modelValue': (value: boolean) => (open.value = value),\n 'closeOnBack': false,\n 'closeOnContentClick': false,\n 'contentClass': 'resourceful-option-menu-content',\n 'minWidth': 300,\n 'location': 'bottom start' as const,\n 'target': anchor.value ? anchor.value.$el : undefined,\n 'submenu': inOverflowMenu.value,\n }))\n const formattedCount = computed(() => numeral(count.value).format(countFormat.value))\n const showCount = computed(() => {\n const num = Number(count.value)\n return !Number.isNaN(num) && Math.abs(num) > 0\n })\n const menuPanelCardBindings = computed(() => ({\n color: color.value,\n minWidth: 300,\n minHeight: 20,\n maxHeight: Math.min(height.value - 200, 400),\n }))\n const doOpenMenu = () => (open.value = true)\n const close = () => (open.value = false)\n const controlButtonBindings = computed<ControlButtonProps>(() =>\n deepmerge(defaultActivatorValues, activator.value, {\n ref: anchor,\n prependIcon: icon.value,\n cta: cta.value,\n appendIcon: () => h(SvgIcon, { d: open.value ? mdiMenuUp : mdiMenuDown }),\n divideAppendIcon: true,\n badge: {\n color: badgeColor.value,\n content: showCount.value ? formattedCount.value : undefined,\n },\n class: inOverflowMenu.value ? [] : noPadding.value ? ['my-2', 'me-2'] : ['ma-2'],\n inOverflowMenu: inOverflowMenu.value,\n state: {\n disabled: disabled.value,\n },\n })\n )\n useRender(() =>\n h(\n 'div',\n {\n class: [{ 'w-100': inOverflowMenu.value }],\n },\n h(VMenu, vMenuBindings.value, {\n activator: ({ props: activatorProps }: { props: Record<string, any> }) =>\n h(\n ControlButton,\n {\n ...controlButtonBindings.value,\n ...activatorProps,\n inOverflowMenu: inOverflowMenu.value,\n },\n // eslint-disable-next-line @nht/require-function-slots-for-programmatic-components\n {\n cta: ctaSlot\n ? (state: ControlButtonState) =>\n ctaSlot({\n ...state,\n close,\n })\n : null,\n prepend: prependSlot\n ? (state: ControlButtonState) =>\n prependSlot({\n ...state,\n close,\n })\n : null,\n append: appendSlot\n ? (state: ControlButtonState) =>\n appendSlot({\n ...state,\n close,\n })\n : null,\n }\n ),\n default: () =>\n h(VCard, menuPanelCardBindings.value, () =>\n defaultSlot ? defaultSlot({ close }) : null\n ),\n })\n )\n )\n return {\n isOpen: open,\n open: doOpenMenu,\n close,\n }\n },\n})\n\nexport type ControlMenu = InstanceType<typeof ControlMenu>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index-DWI2DYc2.mjs","sources":["../src/private/control-menu/index.ts"],"sourcesContent":["import { useDisplay } from 'vuetify'\nimport { SvgIcon } from '../svg-icon'\nimport { deepmerge } from 'deepmerge-ts'\nimport { useSlot } from '../common/utils'\nimport { default as numeral } from 'numeral'\nimport { VMenu } from 'vuetify/components/VMenu'\nimport { VCard } from 'vuetify/components/VCard'\nimport { mdiMenuUp, mdiMenuDown } from '@mdi/js'\nimport { ControlButton } from '../control-button'\nimport { useRender } from '@nhtio/vuetifiable/util/useRender'\nimport { makeControlMenuProps, defaultActivatorValues } from './props'\nimport { defineComponent, h, computed, toRefs, ref, SlotsType } from 'vue'\nimport type { ControlButtonProps, ControlButtonState } from '../control-button/props'\n\ntype ControMenuButtonSlots = {\n prepend: (state: ControlButtonState) => any\n cta: (state: ControlButtonState) => any\n append: (state: ControlButtonState) => any\n default: (args: { close: () => void }) => any\n}\n\nexport const ControlMenu = defineComponent({\n name: 'ControlMenu',\n props: makeControlMenuProps(),\n slots: Object as SlotsType<ControMenuButtonSlots>,\n setup(props, { slots }) {\n const {\n icon,\n cta,\n count,\n countFormat,\n activator,\n color,\n badgeColor,\n inOverflowMenu,\n disabled,\n noPadding,\n } = toRefs(props)\n const prependSlot = useSlot<ControMenuButtonSlots>('prepend', slots)\n const ctaSlot = useSlot<ControMenuButtonSlots>('cta', slots)\n const appendSlot = useSlot<ControMenuButtonSlots>('append', slots)\n const defaultSlot = useSlot<ControMenuButtonSlots>('default', slots)\n const { height } = useDisplay()\n const open = ref(false)\n const anchor = ref<ControlButton | null>(null)\n const vMenuBindings = computed(() => ({\n 'modelValue': open.value,\n 'onUpdate:modelValue': (value: boolean) => (open.value = value),\n 'closeOnBack': false,\n 'closeOnContentClick': false,\n 'contentClass': 'resourceful-option-menu-content',\n 'minWidth': 300,\n 'location': 'bottom start' as const,\n 'target': anchor.value ? anchor.value.$el : undefined,\n 'submenu': inOverflowMenu.value,\n }))\n const formattedCount = computed(() => numeral(count.value).format(countFormat.value))\n const showCount = computed(() => {\n const num = Number(count.value)\n return !Number.isNaN(num) && Math.abs(num) > 0\n })\n const menuPanelCardBindings = computed(() => ({\n color: color.value,\n minWidth: 300,\n minHeight: 20,\n maxHeight: Math.min(height.value - 200, 400),\n }))\n const doOpenMenu = () => (open.value = true)\n const close = () => (open.value = false)\n const controlButtonBindings = computed<ControlButtonProps>(() =>\n deepmerge(defaultActivatorValues, activator.value, {\n ref: anchor,\n prependIcon: icon.value,\n cta: cta.value,\n appendIcon: () => h(SvgIcon, { d: open.value ? mdiMenuUp : mdiMenuDown }),\n divideAppendIcon: true,\n badge: {\n color: badgeColor.value,\n content: showCount.value ? formattedCount.value : undefined,\n },\n class: inOverflowMenu.value ? [] : noPadding.value ? ['my-2', 'me-2'] : ['ma-2'],\n inOverflowMenu: inOverflowMenu.value,\n state: {\n disabled: disabled.value,\n },\n })\n )\n useRender(() =>\n h(\n 'div',\n {\n class: [{ 'w-100': inOverflowMenu.value }],\n },\n h(VMenu, vMenuBindings.value, {\n activator: ({ props: activatorProps }: { props: Record<string, any> }) =>\n h(\n ControlButton,\n {\n ...controlButtonBindings.value,\n ...activatorProps,\n inOverflowMenu: inOverflowMenu.value,\n },\n // eslint-disable-next-line @nht/require-function-slots-for-programmatic-components\n {\n cta: ctaSlot\n ? (state: ControlButtonState) =>\n ctaSlot({\n ...state,\n close,\n })\n : null,\n prepend: prependSlot\n ? (state: ControlButtonState) =>\n prependSlot({\n ...state,\n close,\n })\n : null,\n append: appendSlot\n ? (state: ControlButtonState) =>\n appendSlot({\n ...state,\n close,\n })\n : null,\n }\n ),\n default: () =>\n h(VCard, menuPanelCardBindings.value, () =>\n defaultSlot ? defaultSlot({ close }) : null\n ),\n })\n )\n )\n return {\n isOpen: open,\n open: doOpenMenu,\n close,\n }\n },\n})\n\nexport type ControlMenu = InstanceType<typeof ControlMenu>\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { a as useI18n, e as useCron } from "./ioc-Q-KAX6x1.mjs";
2
- import { S as SvgIcon } from "./index-CduefDwU.mjs";
3
- import { l as mdiRefreshAuto } from "./mdi-jw9Ee7p6.mjs";
4
- import { C as ControlMenu } from "./index-CHELe70a.mjs";
5
- import { p as printfExports } from "./http-C15bx-Gn.mjs";
6
- import { a as makeControlMenuControlButtonProps } from "./props-fFnbtBgH.mjs";
1
+ import { a as useI18n, e as useCron } from "./ioc-DOAKMPdw.mjs";
2
+ import { S as SvgIcon } from "./index-BJmmZly3.mjs";
3
+ import { l as mdiRefreshAuto } from "./mdi-VGx06N8O.mjs";
4
+ import { C as ControlMenu } from "./index-DWI2DYc2.mjs";
5
+ import { p as printfExports } from "./http-C2_4xIMQ.mjs";
6
+ import { a as makeControlMenuControlButtonProps } from "./props-Dcuv5Iv7.mjs";
7
7
  import { defineComponent, toRefs, ref, computed, watch, onBeforeUnmount, h } from "vue";
8
- import { V as VListItem } from "./VListItem-DojRgtpe.mjs";
8
+ import { V as VListItem } from "./VListItem-CHkJtaF9.mjs";
9
9
  const AutoRefeshController = defineComponent({
10
10
  name: "AutoRefeshController",
11
11
  props: makeControlMenuControlButtonProps(),
@@ -87,4 +87,4 @@ const AutoRefeshController = defineComponent({
87
87
  export {
88
88
  AutoRefeshController as A
89
89
  };
90
- //# sourceMappingURL=index-De0W4KPF.mjs.map
90
+ //# sourceMappingURL=index-Dh9Wblnw.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-De0W4KPF.mjs","sources":["../src/private/autorefresh-controller/index.ts"],"sourcesContent":["import { useI18n } from '../ioc'\nimport { useCron } from '../ioc'\nimport { SvgIcon } from '../svg-icon'\nimport { mdiRefreshAuto } from '@mdi/js'\nimport { ControlMenu } from '../control-menu'\nimport { printf as format } from 'fast-printf'\nimport { VListItem } from 'vuetify/components/VList'\nimport { makeControlMenuControlButtonProps } from '../control-menu/props'\nimport { defineComponent, h, toRefs, ref, watch, computed, onBeforeUnmount } from 'vue'\nimport type { ControlMenuProps } from '../control-menu/props'\n\nexport const AutoRefeshController = defineComponent({\n name: 'AutoRefeshController',\n props: makeControlMenuControlButtonProps(),\n emits: ['triggered'],\n setup(props, { emit }) {\n const { color, density, size } = toRefs(props)\n const t = useI18n()\n const cron = useCron()\n const crontab = ref<string | null>(null)\n const options = [\n { crontab: null, label: t('general.off') },\n { crontab: '*/5 * * * * *', label: format('5%s', t('abbreviations.seconds')) },\n { crontab: '*/10 * * * * *', label: format('10%s', t('abbreviations.seconds')) },\n { crontab: '*/30 * * * * *', label: format('30%s', t('abbreviations.seconds')) },\n { crontab: '* * * * *', label: format('1%s', t('abbreviations.minutes')) },\n { crontab: '*/5 * * * *', label: format('5%s', t('abbreviations.minutes')) },\n { crontab: '*/15 * * * *', label: format('15%s', t('abbreviations.minutes')) },\n { crontab: '*/30 * * * *', label: format('30%s', t('abbreviations.minutes')) },\n { crontab: '0 * * * *', label: format('1%s', t('abbreviations.hours')) },\n { crontab: '0 */2 * * *', label: format('2%s', t('abbreviations.hours')) },\n { crontab: '0 */3 * * *', label: format('3%s', t('abbreviations.hours')) },\n { crontab: '0 */4 * * *', label: format('4%s', t('abbreviations.hours')) },\n { crontab: '0 */6 * * *', label: format('6%s', t('abbreviations.hours')) },\n { crontab: '0 */8 * * *', label: format('8%s', t('abbreviations.hours')) },\n { crontab: '0 */12 * * *', label: format('12%s', t('abbreviations.hours')) },\n ]\n const currentOption = computed(() => {\n return options.find((opt) => opt.crontab === crontab.value) || options[0]\n })\n const doTrigger = () => {\n emit('triggered')\n }\n watch(\n crontab,\n (is, was) => {\n if (cron) {\n if (was) {\n cron.$off(was, doTrigger)\n }\n if (is) {\n cron.$on(is, doTrigger)\n }\n }\n },\n { immediate: true }\n )\n onBeforeUnmount(() => {\n if (cron && crontab.value) {\n cron.$off(crontab.value, doTrigger)\n }\n })\n const controlMenuBindings = computed<ControlMenuProps>(\n () =>\n ({\n icon: h(SvgIcon, { d: mdiRefreshAuto }) as any,\n cta: currentOption.value.label,\n activator: {\n color: color.value,\n density: density.value,\n size: size.value,\n // dividePrependIcon: true,\n },\n }) satisfies ControlMenuProps\n )\n return () =>\n h(ControlMenu, controlMenuBindings.value, () =>\n options.map((o) =>\n h(VListItem, {\n title: o.label,\n onClick: () => {\n crontab.value = o.crontab\n },\n active: o.crontab === crontab.value,\n })\n )\n )\n },\n})\n"],"names":["format"],"mappings":"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"}
1
+ {"version":3,"file":"index-Dh9Wblnw.mjs","sources":["../src/private/autorefresh-controller/index.ts"],"sourcesContent":["import { useI18n } from '../ioc'\nimport { useCron } from '../ioc'\nimport { SvgIcon } from '../svg-icon'\nimport { mdiRefreshAuto } from '@mdi/js'\nimport { ControlMenu } from '../control-menu'\nimport { printf as format } from 'fast-printf'\nimport { VListItem } from 'vuetify/components/VList'\nimport { makeControlMenuControlButtonProps } from '../control-menu/props'\nimport { defineComponent, h, toRefs, ref, watch, computed, onBeforeUnmount } from 'vue'\nimport type { ControlMenuProps } from '../control-menu/props'\n\nexport const AutoRefeshController = defineComponent({\n name: 'AutoRefeshController',\n props: makeControlMenuControlButtonProps(),\n emits: ['triggered'],\n setup(props, { emit }) {\n const { color, density, size } = toRefs(props)\n const t = useI18n()\n const cron = useCron()\n const crontab = ref<string | null>(null)\n const options = [\n { crontab: null, label: t('general.off') },\n { crontab: '*/5 * * * * *', label: format('5%s', t('abbreviations.seconds')) },\n { crontab: '*/10 * * * * *', label: format('10%s', t('abbreviations.seconds')) },\n { crontab: '*/30 * * * * *', label: format('30%s', t('abbreviations.seconds')) },\n { crontab: '* * * * *', label: format('1%s', t('abbreviations.minutes')) },\n { crontab: '*/5 * * * *', label: format('5%s', t('abbreviations.minutes')) },\n { crontab: '*/15 * * * *', label: format('15%s', t('abbreviations.minutes')) },\n { crontab: '*/30 * * * *', label: format('30%s', t('abbreviations.minutes')) },\n { crontab: '0 * * * *', label: format('1%s', t('abbreviations.hours')) },\n { crontab: '0 */2 * * *', label: format('2%s', t('abbreviations.hours')) },\n { crontab: '0 */3 * * *', label: format('3%s', t('abbreviations.hours')) },\n { crontab: '0 */4 * * *', label: format('4%s', t('abbreviations.hours')) },\n { crontab: '0 */6 * * *', label: format('6%s', t('abbreviations.hours')) },\n { crontab: '0 */8 * * *', label: format('8%s', t('abbreviations.hours')) },\n { crontab: '0 */12 * * *', label: format('12%s', t('abbreviations.hours')) },\n ]\n const currentOption = computed(() => {\n return options.find((opt) => opt.crontab === crontab.value) || options[0]\n })\n const doTrigger = () => {\n emit('triggered')\n }\n watch(\n crontab,\n (is, was) => {\n if (cron) {\n if (was) {\n cron.$off(was, doTrigger)\n }\n if (is) {\n cron.$on(is, doTrigger)\n }\n }\n },\n { immediate: true }\n )\n onBeforeUnmount(() => {\n if (cron && crontab.value) {\n cron.$off(crontab.value, doTrigger)\n }\n })\n const controlMenuBindings = computed<ControlMenuProps>(\n () =>\n ({\n icon: h(SvgIcon, { d: mdiRefreshAuto }) as any,\n cta: currentOption.value.label,\n activator: {\n color: color.value,\n density: density.value,\n size: size.value,\n // dividePrependIcon: true,\n },\n }) satisfies ControlMenuProps\n )\n return () =>\n h(ControlMenu, controlMenuBindings.value, () =>\n options.map((o) =>\n h(VListItem, {\n title: o.label,\n onClick: () => {\n crontab.value = o.crontab\n },\n active: o.crontab === crontab.value,\n })\n )\n )\n },\n})\n"],"names":["format"],"mappings":";;;;;;;;AAWO,MAAM,uBAAuB,gBAAgB;AAAA,EAClD,MAAM;AAAA,EACN,OAAO,kCAAA;AAAA,EACP,OAAO,CAAC,WAAW;AAAA,EACnB,MAAM,OAAO,EAAE,QAAQ;AACrB,UAAM,EAAE,OAAO,SAAS,KAAA,IAAS,OAAO,KAAK;AAC7C,UAAM,IAAI,QAAA;AACV,UAAM,OAAO,QAAA;AACb,UAAM,UAAU,IAAmB,IAAI;AACvC,UAAM,UAAU;AAAA,MACd,EAAE,SAAS,MAAM,OAAO,EAAE,aAAa,EAAA;AAAA,MACvC,EAAE,SAAS,iBAAiB,OAAOA,cAAAA,OAAO,OAAO,EAAE,uBAAuB,CAAC,EAAA;AAAA,MAC3E,EAAE,SAAS,kBAAkB,OAAOA,cAAAA,OAAO,QAAQ,EAAE,uBAAuB,CAAC,EAAA;AAAA,MAC7E,EAAE,SAAS,kBAAkB,OAAOA,cAAAA,OAAO,QAAQ,EAAE,uBAAuB,CAAC,EAAA;AAAA,MAC7E,EAAE,SAAS,aAAa,OAAOA,cAAAA,OAAO,OAAO,EAAE,uBAAuB,CAAC,EAAA;AAAA,MACvE,EAAE,SAAS,eAAe,OAAOA,cAAAA,OAAO,OAAO,EAAE,uBAAuB,CAAC,EAAA;AAAA,MACzE,EAAE,SAAS,gBAAgB,OAAOA,cAAAA,OAAO,QAAQ,EAAE,uBAAuB,CAAC,EAAA;AAAA,MAC3E,EAAE,SAAS,gBAAgB,OAAOA,cAAAA,OAAO,QAAQ,EAAE,uBAAuB,CAAC,EAAA;AAAA,MAC3E,EAAE,SAAS,aAAa,OAAOA,cAAAA,OAAO,OAAO,EAAE,qBAAqB,CAAC,EAAA;AAAA,MACrE,EAAE,SAAS,eAAe,OAAOA,cAAAA,OAAO,OAAO,EAAE,qBAAqB,CAAC,EAAA;AAAA,MACvE,EAAE,SAAS,eAAe,OAAOA,cAAAA,OAAO,OAAO,EAAE,qBAAqB,CAAC,EAAA;AAAA,MACvE,EAAE,SAAS,eAAe,OAAOA,cAAAA,OAAO,OAAO,EAAE,qBAAqB,CAAC,EAAA;AAAA,MACvE,EAAE,SAAS,eAAe,OAAOA,cAAAA,OAAO,OAAO,EAAE,qBAAqB,CAAC,EAAA;AAAA,MACvE,EAAE,SAAS,eAAe,OAAOA,cAAAA,OAAO,OAAO,EAAE,qBAAqB,CAAC,EAAA;AAAA,MACvE,EAAE,SAAS,gBAAgB,OAAOA,cAAAA,OAAO,QAAQ,EAAE,qBAAqB,CAAC,EAAA;AAAA,IAAE;AAE7E,UAAM,gBAAgB,SAAS,MAAM;AACnC,aAAO,QAAQ,KAAK,CAAC,QAAQ,IAAI,YAAY,QAAQ,KAAK,KAAK,QAAQ,CAAC;AAAA,IAC1E,CAAC;AACD,UAAM,YAAY,MAAM;AACtB,WAAK,WAAW;AAAA,IAClB;AACA;AAAA,MACE;AAAA,MACA,CAAC,IAAI,QAAQ;AACX,YAAI,MAAM;AACR,cAAI,KAAK;AACP,iBAAK,KAAK,KAAK,SAAS;AAAA,UAC1B;AACA,cAAI,IAAI;AACN,iBAAK,IAAI,IAAI,SAAS;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;AAEpB,oBAAgB,MAAM;AACpB,UAAI,QAAQ,QAAQ,OAAO;AACzB,aAAK,KAAK,QAAQ,OAAO,SAAS;AAAA,MACpC;AAAA,IACF,CAAC;AACD,UAAM,sBAAsB;AAAA,MAC1B,OACG;AAAA,QACC,MAAM,EAAE,SAAS,EAAE,GAAG,gBAAgB;AAAA,QACtC,KAAK,cAAc,MAAM;AAAA,QACzB,WAAW;AAAA,UACT,OAAO,MAAM;AAAA,UACb,SAAS,QAAQ;AAAA,UACjB,MAAM,KAAK;AAAA;AAAA,QAAA;AAAA,MAEb;AAAA,IACF;AAEJ,WAAO,MACL;AAAA,MAAE;AAAA,MAAa,oBAAoB;AAAA,MAAO,MACxC,QAAQ;AAAA,QAAI,CAAC,MACX,EAAE,WAAW;AAAA,UACX,OAAO,EAAE;AAAA,UACT,SAAS,MAAM;AACb,oBAAQ,QAAQ,EAAE;AAAA,UACpB;AAAA,UACA,QAAQ,EAAE,YAAY,QAAQ;AAAA,QAAA,CAC/B;AAAA,MAAA;AAAA,IACH;AAAA,EAEN;AACF,CAAC;"}
package/index.mjs CHANGED
@@ -1,49 +1,49 @@
1
- import { R, u } from "./alert-B0j6GH3V.mjs";
2
- import { F, i, u as u2 } from "./validation-41gHTtyY.mjs";
3
- import { T, g, a, u as u3, b, c } from "./index-DLzoBhUb.mjs";
4
- import { S, s } from "./index-CduefDwU.mjs";
5
- import { S as S2, o, u as u4 } from "./index-CvhhGjZn.mjs";
6
- import { b as b2, c as c2, E, a as a2, R as R2 } from "./index-Cb3Fmo7E.mjs";
7
- import { R as R3 } from "./index-CdaTAyzs.mjs";
8
- import { a as a3, R as R4 } from "./form-BkQlevYR.mjs";
9
- import { R as R5, r, a as a4 } from "./renderers-DLsO8zG-.mjs";
10
- import { R as R6 } from "./bigint-DXS_rVbG.mjs";
11
- import { R as R7, b as b3, a as a5 } from "./boolean-BTu-4Ihs.mjs";
12
- import { R as R8, a as a6 } from "./date_time-BNsYnH-e.mjs";
13
- import { R as R9 } from "./date-B8edF8kU.mjs";
14
- import { R as R10, a as a7 } from "./enum-DoxJn16e.mjs";
15
- import { R as R11 } from "./integer-BWdmDp7S.mjs";
16
- import { R as R12 } from "./number-Chf-qQs7.mjs";
17
- import { b as b4, R as R13, a as a8 } from "./string-D-UsgMTx.mjs";
18
- import { R as R14 } from "./unsigned_integer-7R2vw_Qn.mjs";
19
- import { R as R15 } from "./custom-CgyU3A_B.mjs";
20
- import { C } from "./index-CHELe70a.mjs";
21
- import { C as C2 } from "./index-BcDX9w4T.mjs";
22
- import { C as C3, d } from "./props-eYGYq1uo.mjs";
23
- import { C as C4, d as d2, u as u5 } from "./index-DHoLuRuJ.mjs";
24
- import { c as c3, u as u6 } from "./clipboard-C6YTX8YB.mjs";
25
- import { S as S3, a as a9, u as u7 } from "./display-pfXaBUr6.mjs";
26
- import { e, u as u8 } from "./http-ChBUYgv8.mjs";
1
+ import { R, u } from "./alert-D4Zq_X5a.mjs";
2
+ import { F, i, u as u2 } from "./validation-NVIikb_s.mjs";
3
+ import { T, g, a, u as u3, b, c } from "./index-BawSct2l.mjs";
4
+ import { S, s } from "./index-BJmmZly3.mjs";
5
+ import { S as S2, o, u as u4 } from "./index-B-PEjqXn.mjs";
6
+ import { b as b2, c as c2, E, a as a2, R as R2 } from "./index-DDsxXe9z.mjs";
7
+ import { R as R3 } from "./index-BC-vhUQX.mjs";
8
+ import { a as a3, R as R4 } from "./form-B7uOzLn2.mjs";
9
+ import { R as R5, r, a as a4 } from "./renderers-C7XOwFHb.mjs";
10
+ import { R as R6 } from "./bigint-MqcXh7nS.mjs";
11
+ import { R as R7, b as b3, a as a5 } from "./boolean-h31TIpoH.mjs";
12
+ import { R as R8, a as a6 } from "./date_time-n4zJtaSr.mjs";
13
+ import { R as R9 } from "./date-fxb-e0m9.mjs";
14
+ import { R as R10, a as a7 } from "./enum-CjkTx4L6.mjs";
15
+ import { R as R11 } from "./integer-BYichJsH.mjs";
16
+ import { R as R12 } from "./number-B5AryNzI.mjs";
17
+ import { b as b4, R as R13, a as a8 } from "./string-CJvxnWzd.mjs";
18
+ import { R as R14 } from "./unsigned_integer-CRQsMWxW.mjs";
19
+ import { R as R15 } from "./custom-Dj2ib6qT.mjs";
20
+ import { C } from "./index-DWI2DYc2.mjs";
21
+ import { C as C2 } from "./index-DLXKobUt.mjs";
22
+ import { C as C3, d } from "./props-BZryUy0q.mjs";
23
+ import { C as C4, d as d2, u as u5 } from "./index-3roRSYqk.mjs";
24
+ import { c as c3, u as u6 } from "./clipboard-jPiC4eq0.mjs";
25
+ import { S as S3, a as a9, u as u7 } from "./display-DxJktZAm.mjs";
26
+ import { e, u as u8 } from "./http-B7MNWS03.mjs";
27
27
  import { f, u as u9 } from "./big_number_formatter-Y4TivQxi.mjs";
28
- import { R as R16, j, e as e2, g as g2, h, k, n, f as f2, l, i as i2, m, o as o2, d as d3, p, s as s2, t, q, u as u10, c as c4, b as b5, a as a10 } from "./utils-DehfJ8pT.mjs";
29
- import { u as u11 } from "./field_composer-CPqM1aSV.mjs";
30
- import { u as u12 } from "./common-a_cd4SQg.mjs";
31
- import { I, s as s3, k as k2, d as d4, e as e3, f as f3, i as i3, c as c5, a as a11, u as u13, j as j2, h as h2, g as g3, b as b6 } from "./ioc-Q-KAX6x1.mjs";
32
- import { p as printfExports } from "./http-C15bx-Gn.mjs";
33
- import { B, E as E2, R as R17, a as a12, b as b7, c as c6, d as d5 } from "./http-C15bx-Gn.mjs";
34
- import { a as a13, c as c7, b as b8, E as E3 } from "./exceptions-BeFuVcrH.mjs";
35
- import { a as a14, c as c8, b as b9, h as h3, d as d6, f as f4, e as e4, g as g4, i as i4 } from "./guards-D0G8CU2m.mjs";
36
- import { a as a15, i as i5 } from "./actions-CXhEUJp6.mjs";
28
+ import { R as R16, j, e as e2, g as g2, h, k, n, f as f2, l, i as i2, m, o as o2, d as d3, p, s as s2, t, q, u as u10, c as c4, b as b5, a as a10 } from "./utils-BBXjywEs.mjs";
29
+ import { u as u11 } from "./field_composer-B_4w9YL9.mjs";
30
+ import { u as u12 } from "./common-CRFL2oQX.mjs";
31
+ import { I, s as s3, k as k2, d as d4, e as e3, f as f3, i as i3, c as c5, a as a11, u as u13, j as j2, h as h2, g as g3, b as b6 } from "./ioc-DOAKMPdw.mjs";
32
+ import { p as printfExports } from "./http-C2_4xIMQ.mjs";
33
+ import { B, E as E2, R as R17, a as a12, b as b7, c as c6, d as d5 } from "./http-C2_4xIMQ.mjs";
34
+ import { a as a13, c as c7, b as b8, E as E3 } from "./exceptions-lwCt3BKI.mjs";
35
+ import { a as a14, c as c8, b as b9, h as h3, d as d6, f as f4, e as e4, g as g4, i as i4 } from "./guards-BI3Zu4tN.mjs";
36
+ import { a as a15, i as i5 } from "./actions-CAGyXfrI.mjs";
37
37
  import { dot, qs } from "./helpers.mjs";
38
38
  import { IoCSymbol, ResourcefulIndexScopedDisplaySymbol, ResourcefulRecordFormScopedBusConsumerSymbol, ResourcefulRecordFormScopedDisplaySymbol, ResourcefulRecordScopedBusConsumerSymbol, ResourcefulRecordScopedDisplaySymbol } from "./symbols.mjs";
39
39
  import { e as e5, i as i6, q as q2, s as s4 } from "./question-CpfZrjl2.mjs";
40
40
  import { errorIconRaw, infoIconRaw, questionIconRaw, successIconRaw, warningIconRaw } from "./icons.mjs";
41
41
  import { w } from "./warning-CwVFcGgs.mjs";
42
- import { I as I2, S as S4, d as d7, o as o3, a as a16, p as p2, t as t2 } from "./vendor-nhtio-vuetifiable-CS-KbH1h.mjs";
42
+ import { I as I2, S as S4, d as d7, o as o3, a as a16, p as p2, t as t2 } from "./vendor-nhtio-vuetifiable-CTlDfYMJ.mjs";
43
43
  import { d as d8, e as e6 } from "./vendor-nhtio-validation-IJWW0vrt.mjs";
44
44
  import { n as n2 } from "./numeral-DmC5bR5g.mjs";
45
45
  import { d as d9, e as e7 } from "./index-BEXQjukb.mjs";
46
- const version = "1.20260107.0";
46
+ const version = "1.20260108.0";
47
47
  const printf = printfExports.printf;
48
48
  export {
49
49
  B as BaseException,
@@ -1,6 +1,6 @@
1
- import { p as propsFactory, o as omit } from "./vendor-nhtio-vuetifiable-CS-KbH1h.mjs";
1
+ import { p as propsFactory, o as omit } from "./vendor-nhtio-vuetifiable-CTlDfYMJ.mjs";
2
2
  import { defineComponent, toRefs, computed, camelize, h } from "vue";
3
- import { a as makeRNumberFieldProps, r as rNumberFieldEmits, R as RNumberField } from "./number-Chf-qQs7.mjs";
3
+ import { a as makeRNumberFieldProps, r as rNumberFieldEmits, R as RNumberField } from "./number-B5AryNzI.mjs";
4
4
  const makeRIntegerFieldProps = propsFactory(
5
5
  {
6
6
  ...omit(makeRNumberFieldProps(), ["precision"])
@@ -40,4 +40,4 @@ export {
40
40
  RIntegerField as R,
41
41
  makeRIntegerFieldProps as m
42
42
  };
43
- //# sourceMappingURL=integer-BWdmDp7S.mjs.map
43
+ //# sourceMappingURL=integer-BYichJsH.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"integer-BWdmDp7S.mjs","sources":["../src/private/fields/integer.ts"],"sourcesContent":["/*\n|--------------------------------------------------------------------------\n| Resourceful Integer Field\n|--------------------------------------------------------------------------\n|\n| A specialized integer input field component that wraps RNumberField with\n| integer-specific constraints and optimizations for whole number values.\n|\n| **Key Features:**\n| - **Integer-Only Input**: Forces precision: 0 and step: 1 for whole numbers\n| - **RNumberField Foundation**: Inherits all advanced features (controls, formatting, validation)\n| - **Clean API**: Removes inappropriate props (precision, step) from public interface\n| - **Perfect Wrapper**: Zero code duplication while providing integer-specific behavior\n| - **Multiple Mode**: Chip-based interface for integer arrays with formatted display\n| - **Read Mode**: Formatted display with Oxford comma lists for multiple values\n| - **Advanced Controls**: Custom increment/decrement buttons with smart icon adaptation\n| - **Numeral.js Integration**: Professional formatting (thousands separators, custom patterns)\n|\n| **Inherited Features from RNumberField:**\n| - Custom control variants (default, stacked, split, hidden)\n| - Icon customization (increment, decrement, collapse, expand)\n| - Min/max validation with visual feedback\n| - Advanced accessibility (keyboard navigation, ARIA support)\n| - Mobile-optimized touch controls\n| - Theme integration and zero custom CSS\n|\n| **Usage Examples:**\n| ```vue\n| <!-- Single integer input -->\n| <RIntegerField\n| v-model=\"quantity\"\n| label=\"Quantity\"\n| format=\"0,0\"\n| :min=\"1\"\n| :max=\"999999\"\n| control-variant=\"split\"\n| />\n|\n| <!-- Multiple integers with formatting -->\n| <RIntegerField\n| v-model=\"scores\"\n| multiple\n| label=\"Test Scores\"\n| format=\"0,0\"\n| :min=\"0\"\n| :max=\"100\"\n| />\n|\n| <!-- Read-only display -->\n| <RIntegerField\n| v-model=\"results\"\n| multiple\n| label=\"Results\"\n| format=\"0,0\"\n| render-mode=\"read\"\n| />\n| ```\n|\n| The component automatically enforces integer constraints while providing\n| the full power and flexibility of the underlying RNumberField implementation.\n*/\n\nimport { omit } from '@nhtio/vuetifiable/util/helpers'\nimport { propsFactory } from '@nhtio/vuetifiable/util/propsFactory'\nimport { defineComponent, toRefs, computed, camelize, h } from 'vue'\nimport {\n RNumberField,\n makeRNumberFieldProps,\n rNumberFieldEmits as rIntegerFieldEmits,\n} from './number'\nimport type { VNumberInputSlots, RNumberFieldProps } from './number'\nimport type { ExtractPublicPropTypes, SlotsType, ComponentPublicInstance } from 'vue'\n\n/**\n * Factory function to create props for RIntegerField components.\n *\n * Creates a specialized prop set based on RNumberField props with integer-specific\n * constraints. Removes inappropriate props (precision, step) while preserving all\n * other RNumberField capabilities including formatting, validation, and controls.\n *\n * **Omitted Props:**\n * - `precision`: Forced to 0 for integer-only input\n * - `step`: Forced to 1 for whole number increments\n *\n * **Included Props:**\n * - **Core props**: min, max, format, controlVariant\n * - **Icon props**: incrementIcon, decrementIcon, collapseIcon, expandIcon\n * - **Common field props**: multiple, renderMode, choices, validation\n * - **Vuetify props**: variant, density, color, theme, etc.\n *\n * @example\n * ```typescript\n * const MyIntegerField = defineComponent({\n * props: makeRIntegerFieldProps(),\n * // ... component implementation\n * })\n * ```\n *\n * @returns Props factory for RIntegerField components\n * @public\n */\nexport const makeRIntegerFieldProps = propsFactory(\n {\n ...omit(makeRNumberFieldProps(), ['precision']),\n },\n 'RIntegerField'\n)\n\n/**\n * Event emitters for RIntegerField components.\n *\n * Inherits all event signatures from RNumberField to ensure perfect compatibility\n * and consistent behavior across numeric field variants. All events maintain\n * the same parameter types and validation patterns.\n *\n * **Available Events:**\n * - `update:modelValue`: Emitted when integer value(s) change\n * - `update:model-value`: Kebab-case variant of modelValue update\n * - `update:focused`: Emitted when focus state changes\n * - `click:append`: Emitted when append slot is clicked\n * - `click:appendInner`: Emitted when append-inner slot is clicked\n * - `click:clear`: Emitted when clear action is triggered\n * - `click:prependInner`: Emitted when prepend-inner slot is clicked\n * - `click:prepend`: Emitted when prepend slot is clicked\n * - `mousedown:control`: Emitted when control area receives mousedown\n * - `click:control`: Emitted when control area is clicked\n *\n * @example\n * ```vue\n * <RIntegerField\n * v-model=\"count\"\n * @update:modelValue=\"handleValueChange\"\n * @click:clear=\"handleClear\"\n * />\n * ```\n *\n * @public\n */\nexport { rIntegerFieldEmits }\n\n/**\n * Public props interface for RIntegerField components.\n *\n * Provides type-safe access to all available props with integer-specific constraints.\n * Based on RNumberField props but excludes precision and step for cleaner integer API.\n *\n * **Key Props:**\n * - `modelValue`: The current integer value(s) - number | number[] | null | undefined\n * - `multiple`: Enable array input mode with chips\n * - `format`: Numeral.js format string (e.g., \"0,0\", \"#,##0\")\n * - `min`/`max`: Integer range validation\n * - `controlVariant`: Control button layout style\n * - `renderMode`: Display mode (\"edit\" | \"read\")\n *\n * **Automatic Constraints:**\n * - `precision`: Always 0 (no decimals)\n * - `step`: Always 1 (whole number increments)\n *\n * @example\n * ```typescript\n * const props: RIntegerFieldProps = {\n * modelValue: 42,\n * format: \"0,0\",\n * min: 1,\n * max: 999999,\n * controlVariant: \"split\"\n * }\n * ```\n *\n * @public\n */\nexport type RIntegerFieldProps = ExtractPublicPropTypes<ReturnType<typeof makeRIntegerFieldProps>>\n\n/**\n * Specialized integer input field component with advanced formatting and validation.\n *\n * A professional integer field that wraps RNumberField with integer-specific constraints,\n * providing a clean API for whole number input while inheriting all advanced features\n * like custom controls, numeral.js formatting, and unified field composer architecture.\n *\n * **Core Features:**\n * - **Integer-Only Input**: Automatically enforces precision: 0 and step: 1\n * - **RNumberField Foundation**: Inherits all advanced capabilities without code duplication\n * - **Clean API Design**: Removes inappropriate props (precision, step) from public interface\n * - **Advanced Formatting**: Numeral.js integration for thousands separators and custom patterns\n * - **Custom Controls**: Fully customizable increment/decrement buttons with smart icons\n * - **Multiple Mode**: Chip-based interface for integer arrays with formatted display\n * - **Read Mode**: Professional display with Oxford comma lists for multiple values\n * - **Smart Validation**: Min/max boundary checking with visual feedback\n * - **Perfect Accessibility**: Full keyboard navigation and screen reader support\n *\n * **Inherited from RNumberField:**\n * - **Control Variants**: default, stacked, split, hidden with adaptive icons\n * - **Icon Customization**: increment, decrement, collapse, expand icons\n * - **Advanced Validation**: Boundary checking with disabled state management\n * - **Mobile Optimization**: Touch-friendly controls with proper sizing\n * - **Theme Integration**: Pure Vuetify styling with zero custom CSS\n * - **Event System**: Complete event forwarding with type safety\n * - **Slot System**: Full slot inheritance for maximum customization\n *\n * **Integer-Specific Behavior:**\n * - Forces `precision: 0` to prevent decimal input\n * - Forces `step: 1` for whole number increments\n * - Optimized default format `\"0,0\"` for integer display\n * - Removes confusing decimal-related props from API\n *\n * **Formatting Examples:**\n * - Basic: `format=\"0,0\"` → `1,234,567`\n * - No separators: `format=\"0\"` → `1234567`\n * - Ordinals: `format=\"0o\"` → `1st, 2nd, 3rd`\n * - Bytes: `format=\"0b\"` → `1KB, 2MB, 3GB`\n *\n * @example\n * ```vue\n * <!-- Single integer input -->\n * <RIntegerField\n * v-model=\"quantity\"\n * label=\"Quantity\"\n * format=\"0,0\"\n * :min=\"1\"\n * :max=\"999999\"\n * control-variant=\"split\"\n * />\n *\n * <!-- Multiple integers -->\n * <RIntegerField\n * v-model=\"scores\"\n * multiple\n * label=\"Test Scores\"\n * format=\"0,0\"\n * :min=\"0\"\n * :max=\"100\"\n * />\n *\n * <!-- Read-only display -->\n * <RIntegerField\n * v-model=\"results\"\n * multiple\n * label=\"Results\"\n * format=\"0,0\"\n * render-mode=\"read\"\n * />\n *\n * <!-- Custom icons and controls -->\n * <RIntegerField\n * v-model=\"count\"\n * label=\"Item Count\"\n * control-variant=\"stacked\"\n * :increment-icon=\"customPlusIcon\"\n * :decrement-icon=\"customMinusIcon\"\n * />\n * ```\n *\n * **Architecture Benefits:**\n * - **Zero Code Duplication**: Leverages RNumberField's complex implementation\n * - **Perfect Type Safety**: Full TypeScript support with proper prop extraction\n * - **Consistent UX**: Identical behavior across all numeric field variants\n * - **Easy Maintenance**: Bug fixes in RNumberField automatically benefit integer field\n * - **Clean Separation**: Integer-specific logic isolated in wrapper component\n *\n * **Performance:**\n * - Minimal overhead through efficient prop binding and event forwarding\n * - Optimal re-rendering through computed prop aggregation\n * - Lazy evaluation of event handlers for better memory usage\n *\n * @public\n */\nexport const RIntegerField = defineComponent({\n name: 'RIntegerField',\n props: makeRIntegerFieldProps(),\n emits: rIntegerFieldEmits,\n slots: Object as SlotsType<VNumberInputSlots>,\n setup(props, { emit, slots }) {\n const all = toRefs(props)\n const computedProps = computed(() =>\n Object.assign({}, ...Object.entries(all).map(([k, v]) => ({ [k]: v.value })))\n )\n const computedEventForwarders = computed(() =>\n Object.assign(\n {},\n ...Object.keys(rIntegerFieldEmits).map((k) => {\n const onKey = camelize(`on-${k}`)\n const boundEmit = emit.bind(null, k as any)\n return { [onKey]: boundEmit }\n })\n )\n )\n const rNumberFieldBindings = computed<RNumberFieldProps>(() => ({\n ...computedProps.value,\n precision: 0,\n step: Math.abs(Math.round(all.step?.value ?? 1)) || 1,\n ...computedEventForwarders.value,\n }))\n // eslint-disable-next-line @nht/require-function-slots-for-programmatic-components\n return () => h(RNumberField, rNumberFieldBindings.value, slots)\n },\n})\n\n/**\n * Type definition for the RIntegerField component instance.\n *\n * Provides type-safe access to the component's public interface, including\n * all props, slots, emits, and exposed methods. Useful for programmatic\n * component creation and advanced TypeScript integration.\n *\n * @example\n * ```typescript\n * import type { RIntegerField } from './integer'\n *\n * // Component reference typing\n * const integerFieldRef = ref<InstanceType<RIntegerField>>()\n *\n * // Programmatic component creation\n * const IntegerFieldComponent: RIntegerField = defineComponent({\n * // ... implementation\n * })\n * ```\n *\n * @public\n */\nexport type RIntegerField = typeof RIntegerField & ComponentPublicInstance\n"],"names":["rIntegerFieldEmits"],"mappings":";;;AAqGO,MAAM,yBAAyB;AAAA,EACpC;AAAA,IACE,GAAG,KAAK,yBAAyB,CAAC,WAAW,CAAC;AAAA,EAAA;AAAA,EAEhD;AACF;AAiKO,MAAM,gBAAgB,gBAAgB;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO,uBAAA;AAAA,EACP,OAAOA;AAAAA,EACP,OAAO;AAAA,EACP,MAAM,OAAO,EAAE,MAAM,SAAS;AAC5B,UAAM,MAAM,OAAO,KAAK;AACxB,UAAM,gBAAgB;AAAA,MAAS,MAC7B,OAAO,OAAO,CAAA,GAAI,GAAG,OAAO,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,MAAA,EAAQ,CAAC;AAAA,IAAA;AAE9E,UAAM,0BAA0B;AAAA,MAAS,MACvC,OAAO;AAAA,QACL,CAAA;AAAA,QACA,GAAG,OAAO,KAAKA,iBAAkB,EAAE,IAAI,CAAC,MAAM;AAC5C,gBAAM,QAAQ,SAAS,MAAM,CAAC,EAAE;AAChC,gBAAM,YAAY,KAAK,KAAK,MAAM,CAAQ;AAC1C,iBAAO,EAAE,CAAC,KAAK,GAAG,UAAA;AAAA,QACpB,CAAC;AAAA,MAAA;AAAA,IACH;AAEF,UAAM,uBAAuB,SAA4B,OAAO;AAAA,MAC9D,GAAG,cAAc;AAAA,MACjB,WAAW;AAAA,MACX,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,MAAM,SAAS,CAAC,CAAC,KAAK;AAAA,MACpD,GAAG,wBAAwB;AAAA,IAAA,EAC3B;AAEF,WAAO,MAAM,EAAE,cAAc,qBAAqB,OAAO,KAAK;AAAA,EAChE;AACF,CAAC;"}
1
+ {"version":3,"file":"integer-BYichJsH.mjs","sources":["../src/private/fields/integer.ts"],"sourcesContent":["/*\n|--------------------------------------------------------------------------\n| Resourceful Integer Field\n|--------------------------------------------------------------------------\n|\n| A specialized integer input field component that wraps RNumberField with\n| integer-specific constraints and optimizations for whole number values.\n|\n| **Key Features:**\n| - **Integer-Only Input**: Forces precision: 0 and step: 1 for whole numbers\n| - **RNumberField Foundation**: Inherits all advanced features (controls, formatting, validation)\n| - **Clean API**: Removes inappropriate props (precision, step) from public interface\n| - **Perfect Wrapper**: Zero code duplication while providing integer-specific behavior\n| - **Multiple Mode**: Chip-based interface for integer arrays with formatted display\n| - **Read Mode**: Formatted display with Oxford comma lists for multiple values\n| - **Advanced Controls**: Custom increment/decrement buttons with smart icon adaptation\n| - **Numeral.js Integration**: Professional formatting (thousands separators, custom patterns)\n|\n| **Inherited Features from RNumberField:**\n| - Custom control variants (default, stacked, split, hidden)\n| - Icon customization (increment, decrement, collapse, expand)\n| - Min/max validation with visual feedback\n| - Advanced accessibility (keyboard navigation, ARIA support)\n| - Mobile-optimized touch controls\n| - Theme integration and zero custom CSS\n|\n| **Usage Examples:**\n| ```vue\n| <!-- Single integer input -->\n| <RIntegerField\n| v-model=\"quantity\"\n| label=\"Quantity\"\n| format=\"0,0\"\n| :min=\"1\"\n| :max=\"999999\"\n| control-variant=\"split\"\n| />\n|\n| <!-- Multiple integers with formatting -->\n| <RIntegerField\n| v-model=\"scores\"\n| multiple\n| label=\"Test Scores\"\n| format=\"0,0\"\n| :min=\"0\"\n| :max=\"100\"\n| />\n|\n| <!-- Read-only display -->\n| <RIntegerField\n| v-model=\"results\"\n| multiple\n| label=\"Results\"\n| format=\"0,0\"\n| render-mode=\"read\"\n| />\n| ```\n|\n| The component automatically enforces integer constraints while providing\n| the full power and flexibility of the underlying RNumberField implementation.\n*/\n\nimport { omit } from '@nhtio/vuetifiable/util/helpers'\nimport { propsFactory } from '@nhtio/vuetifiable/util/propsFactory'\nimport { defineComponent, toRefs, computed, camelize, h } from 'vue'\nimport {\n RNumberField,\n makeRNumberFieldProps,\n rNumberFieldEmits as rIntegerFieldEmits,\n} from './number'\nimport type { VNumberInputSlots, RNumberFieldProps } from './number'\nimport type { ExtractPublicPropTypes, SlotsType, ComponentPublicInstance } from 'vue'\n\n/**\n * Factory function to create props for RIntegerField components.\n *\n * Creates a specialized prop set based on RNumberField props with integer-specific\n * constraints. Removes inappropriate props (precision, step) while preserving all\n * other RNumberField capabilities including formatting, validation, and controls.\n *\n * **Omitted Props:**\n * - `precision`: Forced to 0 for integer-only input\n * - `step`: Forced to 1 for whole number increments\n *\n * **Included Props:**\n * - **Core props**: min, max, format, controlVariant\n * - **Icon props**: incrementIcon, decrementIcon, collapseIcon, expandIcon\n * - **Common field props**: multiple, renderMode, choices, validation\n * - **Vuetify props**: variant, density, color, theme, etc.\n *\n * @example\n * ```typescript\n * const MyIntegerField = defineComponent({\n * props: makeRIntegerFieldProps(),\n * // ... component implementation\n * })\n * ```\n *\n * @returns Props factory for RIntegerField components\n * @public\n */\nexport const makeRIntegerFieldProps = propsFactory(\n {\n ...omit(makeRNumberFieldProps(), ['precision']),\n },\n 'RIntegerField'\n)\n\n/**\n * Event emitters for RIntegerField components.\n *\n * Inherits all event signatures from RNumberField to ensure perfect compatibility\n * and consistent behavior across numeric field variants. All events maintain\n * the same parameter types and validation patterns.\n *\n * **Available Events:**\n * - `update:modelValue`: Emitted when integer value(s) change\n * - `update:model-value`: Kebab-case variant of modelValue update\n * - `update:focused`: Emitted when focus state changes\n * - `click:append`: Emitted when append slot is clicked\n * - `click:appendInner`: Emitted when append-inner slot is clicked\n * - `click:clear`: Emitted when clear action is triggered\n * - `click:prependInner`: Emitted when prepend-inner slot is clicked\n * - `click:prepend`: Emitted when prepend slot is clicked\n * - `mousedown:control`: Emitted when control area receives mousedown\n * - `click:control`: Emitted when control area is clicked\n *\n * @example\n * ```vue\n * <RIntegerField\n * v-model=\"count\"\n * @update:modelValue=\"handleValueChange\"\n * @click:clear=\"handleClear\"\n * />\n * ```\n *\n * @public\n */\nexport { rIntegerFieldEmits }\n\n/**\n * Public props interface for RIntegerField components.\n *\n * Provides type-safe access to all available props with integer-specific constraints.\n * Based on RNumberField props but excludes precision and step for cleaner integer API.\n *\n * **Key Props:**\n * - `modelValue`: The current integer value(s) - number | number[] | null | undefined\n * - `multiple`: Enable array input mode with chips\n * - `format`: Numeral.js format string (e.g., \"0,0\", \"#,##0\")\n * - `min`/`max`: Integer range validation\n * - `controlVariant`: Control button layout style\n * - `renderMode`: Display mode (\"edit\" | \"read\")\n *\n * **Automatic Constraints:**\n * - `precision`: Always 0 (no decimals)\n * - `step`: Always 1 (whole number increments)\n *\n * @example\n * ```typescript\n * const props: RIntegerFieldProps = {\n * modelValue: 42,\n * format: \"0,0\",\n * min: 1,\n * max: 999999,\n * controlVariant: \"split\"\n * }\n * ```\n *\n * @public\n */\nexport type RIntegerFieldProps = ExtractPublicPropTypes<ReturnType<typeof makeRIntegerFieldProps>>\n\n/**\n * Specialized integer input field component with advanced formatting and validation.\n *\n * A professional integer field that wraps RNumberField with integer-specific constraints,\n * providing a clean API for whole number input while inheriting all advanced features\n * like custom controls, numeral.js formatting, and unified field composer architecture.\n *\n * **Core Features:**\n * - **Integer-Only Input**: Automatically enforces precision: 0 and step: 1\n * - **RNumberField Foundation**: Inherits all advanced capabilities without code duplication\n * - **Clean API Design**: Removes inappropriate props (precision, step) from public interface\n * - **Advanced Formatting**: Numeral.js integration for thousands separators and custom patterns\n * - **Custom Controls**: Fully customizable increment/decrement buttons with smart icons\n * - **Multiple Mode**: Chip-based interface for integer arrays with formatted display\n * - **Read Mode**: Professional display with Oxford comma lists for multiple values\n * - **Smart Validation**: Min/max boundary checking with visual feedback\n * - **Perfect Accessibility**: Full keyboard navigation and screen reader support\n *\n * **Inherited from RNumberField:**\n * - **Control Variants**: default, stacked, split, hidden with adaptive icons\n * - **Icon Customization**: increment, decrement, collapse, expand icons\n * - **Advanced Validation**: Boundary checking with disabled state management\n * - **Mobile Optimization**: Touch-friendly controls with proper sizing\n * - **Theme Integration**: Pure Vuetify styling with zero custom CSS\n * - **Event System**: Complete event forwarding with type safety\n * - **Slot System**: Full slot inheritance for maximum customization\n *\n * **Integer-Specific Behavior:**\n * - Forces `precision: 0` to prevent decimal input\n * - Forces `step: 1` for whole number increments\n * - Optimized default format `\"0,0\"` for integer display\n * - Removes confusing decimal-related props from API\n *\n * **Formatting Examples:**\n * - Basic: `format=\"0,0\"` → `1,234,567`\n * - No separators: `format=\"0\"` → `1234567`\n * - Ordinals: `format=\"0o\"` → `1st, 2nd, 3rd`\n * - Bytes: `format=\"0b\"` → `1KB, 2MB, 3GB`\n *\n * @example\n * ```vue\n * <!-- Single integer input -->\n * <RIntegerField\n * v-model=\"quantity\"\n * label=\"Quantity\"\n * format=\"0,0\"\n * :min=\"1\"\n * :max=\"999999\"\n * control-variant=\"split\"\n * />\n *\n * <!-- Multiple integers -->\n * <RIntegerField\n * v-model=\"scores\"\n * multiple\n * label=\"Test Scores\"\n * format=\"0,0\"\n * :min=\"0\"\n * :max=\"100\"\n * />\n *\n * <!-- Read-only display -->\n * <RIntegerField\n * v-model=\"results\"\n * multiple\n * label=\"Results\"\n * format=\"0,0\"\n * render-mode=\"read\"\n * />\n *\n * <!-- Custom icons and controls -->\n * <RIntegerField\n * v-model=\"count\"\n * label=\"Item Count\"\n * control-variant=\"stacked\"\n * :increment-icon=\"customPlusIcon\"\n * :decrement-icon=\"customMinusIcon\"\n * />\n * ```\n *\n * **Architecture Benefits:**\n * - **Zero Code Duplication**: Leverages RNumberField's complex implementation\n * - **Perfect Type Safety**: Full TypeScript support with proper prop extraction\n * - **Consistent UX**: Identical behavior across all numeric field variants\n * - **Easy Maintenance**: Bug fixes in RNumberField automatically benefit integer field\n * - **Clean Separation**: Integer-specific logic isolated in wrapper component\n *\n * **Performance:**\n * - Minimal overhead through efficient prop binding and event forwarding\n * - Optimal re-rendering through computed prop aggregation\n * - Lazy evaluation of event handlers for better memory usage\n *\n * @public\n */\nexport const RIntegerField = defineComponent({\n name: 'RIntegerField',\n props: makeRIntegerFieldProps(),\n emits: rIntegerFieldEmits,\n slots: Object as SlotsType<VNumberInputSlots>,\n setup(props, { emit, slots }) {\n const all = toRefs(props)\n const computedProps = computed(() =>\n Object.assign({}, ...Object.entries(all).map(([k, v]) => ({ [k]: v.value })))\n )\n const computedEventForwarders = computed(() =>\n Object.assign(\n {},\n ...Object.keys(rIntegerFieldEmits).map((k) => {\n const onKey = camelize(`on-${k}`)\n const boundEmit = emit.bind(null, k as any)\n return { [onKey]: boundEmit }\n })\n )\n )\n const rNumberFieldBindings = computed<RNumberFieldProps>(() => ({\n ...computedProps.value,\n precision: 0,\n step: Math.abs(Math.round(all.step?.value ?? 1)) || 1,\n ...computedEventForwarders.value,\n }))\n // eslint-disable-next-line @nht/require-function-slots-for-programmatic-components\n return () => h(RNumberField, rNumberFieldBindings.value, slots)\n },\n})\n\n/**\n * Type definition for the RIntegerField component instance.\n *\n * Provides type-safe access to the component's public interface, including\n * all props, slots, emits, and exposed methods. Useful for programmatic\n * component creation and advanced TypeScript integration.\n *\n * @example\n * ```typescript\n * import type { RIntegerField } from './integer'\n *\n * // Component reference typing\n * const integerFieldRef = ref<InstanceType<RIntegerField>>()\n *\n * // Programmatic component creation\n * const IntegerFieldComponent: RIntegerField = defineComponent({\n * // ... implementation\n * })\n * ```\n *\n * @public\n */\nexport type RIntegerField = typeof RIntegerField & ComponentPublicInstance\n"],"names":["rIntegerFieldEmits"],"mappings":";;;AAqGO,MAAM,yBAAyB;AAAA,EACpC;AAAA,IACE,GAAG,KAAK,yBAAyB,CAAC,WAAW,CAAC;AAAA,EAAA;AAAA,EAEhD;AACF;AAiKO,MAAM,gBAAgB,gBAAgB;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO,uBAAA;AAAA,EACP,OAAOA;AAAAA,EACP,OAAO;AAAA,EACP,MAAM,OAAO,EAAE,MAAM,SAAS;AAC5B,UAAM,MAAM,OAAO,KAAK;AACxB,UAAM,gBAAgB;AAAA,MAAS,MAC7B,OAAO,OAAO,CAAA,GAAI,GAAG,OAAO,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,MAAA,EAAQ,CAAC;AAAA,IAAA;AAE9E,UAAM,0BAA0B;AAAA,MAAS,MACvC,OAAO;AAAA,QACL,CAAA;AAAA,QACA,GAAG,OAAO,KAAKA,iBAAkB,EAAE,IAAI,CAAC,MAAM;AAC5C,gBAAM,QAAQ,SAAS,MAAM,CAAC,EAAE;AAChC,gBAAM,YAAY,KAAK,KAAK,MAAM,CAAQ;AAC1C,iBAAO,EAAE,CAAC,KAAK,GAAG,UAAA;AAAA,QACpB,CAAC;AAAA,MAAA;AAAA,IACH;AAEF,UAAM,uBAAuB,SAA4B,OAAO;AAAA,MAC9D,GAAG,cAAc;AAAA,MACjB,WAAW;AAAA,MACX,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,MAAM,SAAS,CAAC,CAAC,KAAK;AAAA,MACpD,GAAG,wBAAwB;AAAA,IAAA,EAC3B;AAEF,WAAO,MAAM,EAAE,cAAc,qBAAqB,OAAO,KAAK;AAAA,EAChE;AACF,CAAC;"}
@@ -1,7 +1,7 @@
1
1
  import { IoCSymbol } from "./symbols.mjs";
2
2
  import { getCurrentInstance, inject, onMounted, onBeforeUnmount } from "vue";
3
3
  import { b, D as DateTime, I as IANAZone, F as FixedOffsetZone, S as SystemZone } from "./vendor-nhtio-millicron-mvANrUKZ.mjs";
4
- import { e as browserService, f as defaultResourcefulHttpService } from "./http-C15bx-Gn.mjs";
4
+ import { e as browserService, f as defaultResourcefulHttpService } from "./http-C2_4xIMQ.mjs";
5
5
  import { g as getDefaultExportFromCjs } from "./_commonjsHelpers-CUmg6egw.mjs";
6
6
  import { o } from "./vendor-nhtio-tiny-typed-emitter-gOxdt9O8.mjs";
7
7
  import { v as validator } from "./vendor-nhtio-validation-IJWW0vrt.mjs";
@@ -1459,4 +1459,4 @@ export {
1459
1459
  setIocService as s,
1460
1460
  useIoC as u
1461
1461
  };
1462
- //# sourceMappingURL=ioc-Q-KAX6x1.mjs.map
1462
+ //# sourceMappingURL=ioc-DOAKMPdw.mjs.map