ropav 0.13.0 → 0.15.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 (118) hide show
  1. package/dist/components/accordion/index.d.ts +1 -0
  2. package/dist/components/alert-dialog/alert-dialog-backdrop.js +3 -1
  3. package/dist/components/autocomplete/index.d.ts +1 -0
  4. package/dist/components/calendar/index.d.ts +1 -0
  5. package/dist/components/checkbox-group/index.d.ts +1 -0
  6. package/dist/components/color-slider/index.d.ts +1 -0
  7. package/dist/components/combo-box/index.d.ts +2 -0
  8. package/dist/components/date-field/index.d.ts +1 -0
  9. package/dist/components/date-picker/index.d.ts +2 -0
  10. package/dist/components/date-range-picker/index.d.ts +2 -0
  11. package/dist/components/date-range-picker/use-date-range-picker.js +1 -1
  12. package/dist/components/disclosure-group/index.d.ts +1 -0
  13. package/dist/components/drawer/drawer-backdrop.js +3 -1
  14. package/dist/components/dropdown/dropdown-menu.js +7 -3
  15. package/dist/components/dropdown/dropdown-root.js +1 -1
  16. package/dist/components/dropdown/dropdown-submenu-trigger.js +1 -1
  17. package/dist/components/dropdown/dropdown.context.d.ts +1 -1
  18. package/dist/components/dropdown/index.d.ts +1 -0
  19. package/dist/components/field-error/field-error-root.js +1 -1
  20. package/dist/components/form/form-root.js +1 -1
  21. package/dist/components/index.d.ts +1 -0
  22. package/dist/components/meter/meter-root.js +1 -1
  23. package/dist/components/modal/modal-backdrop.js +3 -1
  24. package/dist/components/number-field/index.d.ts +1 -0
  25. package/dist/components/overlay/overlay-popover.js +15 -6
  26. package/dist/components/portal-provider/index.d.ts +3 -0
  27. package/dist/components/portal-provider/index.js +2 -0
  28. package/dist/components/portal-provider/portal-provider.d.ts +21 -0
  29. package/dist/components/portal-provider/portal-provider.js +20 -0
  30. package/dist/components/portal-provider/portal-provider.types.d.ts +22 -0
  31. package/dist/components/radio-group/index.d.ts +1 -0
  32. package/dist/components/range-calendar/index.d.ts +1 -0
  33. package/dist/components/segmented-control/index.d.ts +1 -0
  34. package/dist/components/select/index.d.ts +1 -0
  35. package/dist/components/slider/index.d.ts +1 -0
  36. package/dist/components/table/table-drag-handle.js +1 -1
  37. package/dist/components/tabs/index.d.ts +1 -0
  38. package/dist/components/tabs/tabs-root.js +5 -0
  39. package/dist/components/tabs/tabs.types.d.ts +8 -0
  40. package/dist/components/time-field/index.d.ts +2 -0
  41. package/dist/components/toast/toast-provider.js +3 -1
  42. package/dist/components/toggle-button/index.d.ts +1 -0
  43. package/dist/components/toggle-button-group/index.d.ts +1 -0
  44. package/dist/components/tooltip/index.d.ts +1 -0
  45. package/dist/components/tooltip/tooltip-content.js +4 -1
  46. package/dist/composables/drag-manager.js +1 -1
  47. package/dist/composables/drag-modality.js +2 -1
  48. package/dist/composables/focus-scope-registry.d.ts +27 -0
  49. package/dist/composables/focus-scope-registry.js +45 -0
  50. package/dist/composables/form-context.d.ts +25 -0
  51. package/dist/composables/form-context.js +17 -0
  52. package/dist/composables/index.d.ts +1 -24
  53. package/dist/composables/interaction-modality.d.ts +42 -0
  54. package/dist/composables/interaction-modality.js +91 -0
  55. package/dist/composables/use-calendar-cell.js +1 -1
  56. package/dist/composables/use-checkbox-group-state.js +2 -1
  57. package/dist/composables/use-combo-box-state.d.ts +2 -1
  58. package/dist/composables/use-combo-box-state.js +3 -2
  59. package/dist/composables/use-combo-box.js +6 -3
  60. package/dist/composables/use-css-variable.js +1 -5
  61. package/dist/composables/use-default-locale.d.ts +9 -0
  62. package/dist/composables/use-default-locale.js +39 -0
  63. package/dist/composables/use-dismissable.d.ts +6 -0
  64. package/dist/composables/use-dismissable.js +9 -11
  65. package/dist/composables/use-display-names.js +1 -1
  66. package/dist/composables/use-drag.js +1 -1
  67. package/dist/composables/use-droppable-collection.js +1 -1
  68. package/dist/composables/use-focus-scope.d.ts +6 -12
  69. package/dist/composables/use-focus-scope.js +14 -33
  70. package/dist/composables/use-form-validation-state.d.ts +1 -60
  71. package/dist/composables/use-form-validation-state.js +3 -134
  72. package/dist/composables/use-form-validation.d.ts +2 -1
  73. package/dist/composables/use-form-validation.js +2 -2
  74. package/dist/composables/use-interaction-states.d.ts +0 -36
  75. package/dist/composables/use-interaction-states.js +8 -91
  76. package/dist/composables/use-locale.d.ts +0 -14
  77. package/dist/composables/use-locale.js +4 -37
  78. package/dist/composables/use-localized-string-dictionary.d.ts +10 -0
  79. package/dist/composables/use-localized-string-dictionary.js +26 -0
  80. package/dist/composables/use-localized-string-formatter.d.ts +0 -9
  81. package/dist/composables/use-localized-string-formatter.js +3 -24
  82. package/dist/composables/use-long-press.d.ts +0 -2
  83. package/dist/composables/use-long-press.js +2 -2
  84. package/dist/composables/use-menu-trigger-state.d.ts +64 -0
  85. package/dist/composables/use-menu-trigger-state.js +90 -0
  86. package/dist/composables/use-menu-trigger.d.ts +2 -1
  87. package/dist/composables/use-modal-overlay.d.ts +2 -1
  88. package/dist/composables/use-modal-overlay.js +17 -4
  89. package/dist/composables/use-overlay-trigger-state.d.ts +0 -62
  90. package/dist/composables/use-overlay-trigger-state.js +2 -87
  91. package/dist/composables/use-page-size.d.ts +14 -0
  92. package/dist/composables/use-page-size.js +42 -0
  93. package/dist/composables/use-portal.d.ts +35 -0
  94. package/dist/composables/use-portal.js +47 -0
  95. package/dist/composables/use-press.d.ts +0 -20
  96. package/dist/composables/use-press.js +3 -26
  97. package/dist/composables/use-range-calendar.js +1 -1
  98. package/dist/composables/use-select-state.d.ts +1 -1
  99. package/dist/composables/use-select-state.js +1 -1
  100. package/dist/composables/use-slider.js +1 -1
  101. package/dist/composables/use-toast-region.js +2 -1
  102. package/dist/composables/use-tooltip-trigger-state.js +1 -15
  103. package/dist/composables/use-tooltip-trigger.js +1 -1
  104. package/dist/composables/use-viewport-size.d.ts +0 -13
  105. package/dist/composables/use-viewport-size.js +1 -38
  106. package/dist/composables/validation-result.d.ts +37 -0
  107. package/dist/composables/validation-result.js +122 -0
  108. package/dist/composables/virtual-event.d.ts +20 -0
  109. package/dist/composables/virtual-event.js +28 -0
  110. package/dist/index.js +13 -35
  111. package/dist/ropav.min.css +1 -1
  112. package/dist/utils/aria-hide-outside.d.ts +4 -1
  113. package/dist/utils/aria-hide-outside.js +17 -5
  114. package/dist/utils/date-validation.js +1 -1
  115. package/dist/utils/region.d.ts +10 -0
  116. package/dist/utils/region.js +13 -0
  117. package/dist/version.js +1 -1
  118. package/package.json +6 -2
@@ -1,5 +1,8 @@
1
1
  export interface AriaHideOutsideOptions {
2
- /** Nothing above this element is hidden. @default document.body */
2
+ /**
3
+ * Nothing outside this element is hidden, and only this element is watched for content added
4
+ * later. @default document.body
5
+ */
3
6
  root?: Element;
4
7
  /**
5
8
  * Uses `inert` instead of `aria-hidden`, which also blocks pointer interaction and focus
@@ -1,3 +1,4 @@
1
+ import { regionsOverlap } from "./region.js";
1
2
  import { TOP_LAYER_SELECTOR } from "./top-layer.js";
2
3
  //#region src/utils/aria-hide-outside.ts
3
4
  var supportsInert = typeof HTMLElement !== "undefined" && "inert" in HTMLElement.prototype;
@@ -9,8 +10,19 @@ var supportsInert = typeof HTMLElement !== "undefined" && "inert" in HTMLElement
9
10
  * itself keeps a count of zero, so it is never un-hidden by this.
10
11
  */
11
12
  var refCounts = /* @__PURE__ */ new WeakMap();
12
- /** Active layers, innermost last. Only the innermost watches the DOM for new content. */
13
+ /**
14
+ * Active layers, innermost last. Only the innermost of the layers whose roots overlap watches the
15
+ * DOM for new content: two modals open in two apps' windows side by side each keep watching their
16
+ * own, while two nested in one place hand watching to the inner one.
17
+ */
13
18
  var layers = [];
19
+ /** Whether a later layer covers this one's root, so this one leaves the watching to it. */
20
+ var isShadowed = (layer) => layers.slice(layers.indexOf(layer) + 1).some((later) => regionsOverlap(later.root, layer.root));
21
+ /** Watch with exactly the layers nothing later covers. */
22
+ var syncObservers = () => {
23
+ for (const layer of layers) if (isShadowed(layer)) layer.disconnect();
24
+ else layer.observe();
25
+ };
14
26
  /** Content that must never be hidden, however deep in the page it sits. */
15
27
  var ALWAYS_VISIBLE_SELECTOR = `[data-live-announcer], ${TOP_LAYER_SELECTOR}`;
16
28
  var isAlwaysVisible = (node) => node instanceof HTMLElement && node.matches(ALWAYS_VISIBLE_SELECTOR);
@@ -67,7 +79,6 @@ var ariaHideOutside = (targets, options = {}) => {
67
79
  node = walker.nextNode();
68
80
  }
69
81
  };
70
- layers.at(-1)?.disconnect();
71
82
  walk(root);
72
83
  const observer = new MutationObserver((changes) => {
73
84
  for (const change of changes) {
@@ -88,10 +99,11 @@ var ariaHideOutside = (targets, options = {}) => {
88
99
  childList: true,
89
100
  subtree: true
90
101
  }),
102
+ root,
91
103
  visibleNodes
92
104
  };
93
- layer.observe();
94
105
  layers.push(layer);
106
+ syncObservers();
95
107
  return () => {
96
108
  observer.disconnect();
97
109
  for (const node of hiddenNodes) {
@@ -104,7 +116,7 @@ var ariaHideOutside = (targets, options = {}) => {
104
116
  }
105
117
  const index = layers.indexOf(layer);
106
118
  if (index >= 0) layers.splice(index, 1);
107
- layers.at(-1)?.observe();
119
+ syncObservers();
108
120
  };
109
121
  };
110
122
  /**
@@ -116,7 +128,7 @@ var ariaHideOutside = (targets, options = {}) => {
116
128
  * @returns A function withdrawing the exemption, or `undefined` if nothing is hiding anything.
117
129
  */
118
130
  var keepVisible = (element) => {
119
- const layer = layers.at(-1);
131
+ const layer = layers.findLast((candidate) => candidate.root.contains(element)) ?? layers.at(-1);
120
132
  if (!layer || layer.visibleNodes.has(element)) return void 0;
121
133
  layer.visibleNodes.add(element);
122
134
  return () => {
@@ -1,4 +1,4 @@
1
- import { VALID_VALIDITY_STATE, mergeValidation } from "../composables/use-form-validation-state.js";
1
+ import { VALID_VALIDITY_STATE, mergeValidation } from "../composables/validation-result.js";
2
2
  import { getDefaultLocale } from "./locale.js";
3
3
  import { dateValidationStrings } from "../i18n/date-validation.js";
4
4
  import { getFormatOptions } from "./date-format.js";
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Whether two parts of the page can see each other's overlays.
3
+ *
4
+ * An overlay belongs to a region: the root its `PortalProvider` names, or the whole document
5
+ * (`null`) without one. The page-wide stacks — which overlay is innermost, which one watches the
6
+ * DOM, which one holds focus — are only shared between overlays whose regions overlap. Two apps'
7
+ * windows side by side are separate regions, so a modal in one is not stacked over a modal in the
8
+ * other; the whole document overlaps everything, so without a provider nothing changes.
9
+ */
10
+ export declare const regionsOverlap: (a: Element | null, b: Element | null) => boolean;
@@ -0,0 +1,13 @@
1
+ //#region src/utils/region.ts
2
+ /**
3
+ * Whether two parts of the page can see each other's overlays.
4
+ *
5
+ * An overlay belongs to a region: the root its `PortalProvider` names, or the whole document
6
+ * (`null`) without one. The page-wide stacks — which overlay is innermost, which one watches the
7
+ * DOM, which one holds focus — are only shared between overlays whose regions overlap. Two apps'
8
+ * windows side by side are separate regions, so a modal in one is not stacked over a modal in the
9
+ * other; the whole document overlaps everything, so without a provider nothing changes.
10
+ */
11
+ var regionsOverlap = (a, b) => a == null || b == null || a.contains(b) || b.contains(a);
12
+ //#endregion
13
+ export { regionsOverlap };
package/dist/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  //#region src/version.ts
2
- var ROPAV_VERSION = "0.13.0";
2
+ var ROPAV_VERSION = "0.15.0";
3
3
  //#endregion
4
4
  export { ROPAV_VERSION };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ropav",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "description": "Vapor-native Vue 3 component library — accessible by default, styled with framework-agnostic CSS.",
5
5
  "keywords": [
6
6
  "components",
@@ -277,6 +277,10 @@
277
277
  "import": "./dist/components/popover/index.js",
278
278
  "types": "./dist/components/popover/index.d.ts"
279
279
  },
280
+ "./portal-provider": {
281
+ "import": "./dist/components/portal-provider/index.js",
282
+ "types": "./dist/components/portal-provider/index.d.ts"
283
+ },
280
284
  "./progress-bar": {
281
285
  "import": "./dist/components/progress-bar/index.js",
282
286
  "types": "./dist/components/progress-bar/index.d.ts"
@@ -417,7 +421,7 @@
417
421
  "@internationalized/date": "3.12.4",
418
422
  "@internationalized/number": "3.6.8",
419
423
  "@internationalized/string": "3.2.10",
420
- "@ropav/styles": "0.13.0"
424
+ "@ropav/styles": "0.15.0"
421
425
  },
422
426
  "peerDependencies": {
423
427
  "vue": "^3.6.0-rc.8"