ember-primitives 0.48.1 → 0.49.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 (123) hide show
  1. package/README.md +9 -2
  2. package/declarations/components/menu.d.ts +26 -10
  3. package/declarations/components/menu.d.ts.map +1 -1
  4. package/declarations/components/portal.d.ts.map +1 -1
  5. package/declarations/tabster.d.ts.map +1 -1
  6. package/declarations/utils.d.ts.map +1 -1
  7. package/declarations/viewport/in-viewport.d.ts +70 -0
  8. package/declarations/viewport/in-viewport.d.ts.map +1 -0
  9. package/declarations/viewport/viewport.d.ts +59 -0
  10. package/declarations/viewport/viewport.d.ts.map +1 -0
  11. package/declarations/viewport.d.ts +3 -0
  12. package/declarations/viewport.d.ts.map +1 -0
  13. package/dist/-private.js +0 -1
  14. package/dist/-private.js.map +1 -1
  15. package/dist/color-scheme.js +0 -1
  16. package/dist/color-scheme.js.map +1 -1
  17. package/dist/{component-Bs3N-G9z.js → component-BXy_iafw.js} +2 -3
  18. package/dist/component-BXy_iafw.js.map +1 -0
  19. package/dist/components/accordion.js +5 -6
  20. package/dist/components/accordion.js.map +1 -1
  21. package/dist/components/avatar.js +3 -4
  22. package/dist/components/avatar.js.map +1 -1
  23. package/dist/components/dialog.js +2 -3
  24. package/dist/components/dialog.js.map +1 -1
  25. package/dist/components/external-link.js +1 -2
  26. package/dist/components/external-link.js.map +1 -1
  27. package/dist/components/form.js +1 -2
  28. package/dist/components/form.js.map +1 -1
  29. package/dist/components/heading.js +1 -2
  30. package/dist/components/heading.js.map +1 -1
  31. package/dist/components/keys.js +2 -3
  32. package/dist/components/keys.js.map +1 -1
  33. package/dist/components/layout/hero.js +1 -1
  34. package/dist/components/layout/sticky-footer.js +1 -1
  35. package/dist/components/link.js +1 -2
  36. package/dist/components/link.js.map +1 -1
  37. package/dist/components/menu.js +6 -9
  38. package/dist/components/menu.js.map +1 -1
  39. package/dist/components/one-time-password.js +1 -2
  40. package/dist/components/popover.js +3 -4
  41. package/dist/components/popover.js.map +1 -1
  42. package/dist/components/portal-targets.js +2 -3
  43. package/dist/components/portal-targets.js.map +1 -1
  44. package/dist/components/portal.js +3 -7
  45. package/dist/components/portal.js.map +1 -1
  46. package/dist/components/progress.js +2 -3
  47. package/dist/components/progress.js.map +1 -1
  48. package/dist/components/rating.js +1 -2
  49. package/dist/components/scroller.js +1 -2
  50. package/dist/components/scroller.js.map +1 -1
  51. package/dist/components/shadowed.js +2 -3
  52. package/dist/components/shadowed.js.map +1 -1
  53. package/dist/components/switch.js +5 -6
  54. package/dist/components/switch.js.map +1 -1
  55. package/dist/components/tabs.js +6 -7
  56. package/dist/components/tabs.js.map +1 -1
  57. package/dist/components/toggle-group.js +3 -4
  58. package/dist/components/toggle-group.js.map +1 -1
  59. package/dist/components/toggle.js +2 -3
  60. package/dist/components/toggle.js.map +1 -1
  61. package/dist/components/visually-hidden.js +1 -2
  62. package/dist/components/visually-hidden.js.map +1 -1
  63. package/dist/components/zoetrope.js +1 -2
  64. package/dist/dom-context.js +2 -3
  65. package/dist/dom-context.js.map +1 -1
  66. package/dist/floating-ui.js +1 -2
  67. package/dist/head.js +1 -2
  68. package/dist/head.js.map +1 -1
  69. package/dist/helpers/body-class.js +0 -1
  70. package/dist/helpers/body-class.js.map +1 -1
  71. package/dist/helpers/link.js +0 -1
  72. package/dist/helpers/link.js.map +1 -1
  73. package/dist/helpers/service.js +0 -1
  74. package/dist/helpers/service.js.map +1 -1
  75. package/dist/helpers.js +0 -1
  76. package/dist/helpers.js.map +1 -1
  77. package/dist/iframe.js +0 -1
  78. package/dist/iframe.js.map +1 -1
  79. package/dist/{index-DKE67I8L.js → index-gRO4Cvlf.js} +2 -2
  80. package/dist/index-gRO4Cvlf.js.map +1 -0
  81. package/dist/index.js +3 -4
  82. package/dist/index.js.map +1 -1
  83. package/dist/load.js +0 -1
  84. package/dist/load.js.map +1 -1
  85. package/dist/narrowing.js +0 -1
  86. package/dist/narrowing.js.map +1 -1
  87. package/dist/on-resize.js +0 -1
  88. package/dist/on-resize.js.map +1 -1
  89. package/dist/{otp-C6hCCXKx.js → otp-7rz1PWP0.js} +6 -7
  90. package/dist/otp-7rz1PWP0.js.map +1 -0
  91. package/dist/proper-links.js +0 -1
  92. package/dist/proper-links.js.map +1 -1
  93. package/dist/qp.js +0 -1
  94. package/dist/qp.js.map +1 -1
  95. package/dist/{rating-D052JWRa.js → rating-CjBVsX6q.js} +5 -6
  96. package/dist/rating-CjBVsX6q.js.map +1 -0
  97. package/dist/resize-observer.js +0 -1
  98. package/dist/resize-observer.js.map +1 -1
  99. package/dist/service.js +0 -1
  100. package/dist/service.js.map +1 -1
  101. package/dist/store.js +0 -1
  102. package/dist/store.js.map +1 -1
  103. package/dist/styles.css.js +0 -1
  104. package/dist/tabster.js +0 -1
  105. package/dist/tabster.js.map +1 -1
  106. package/dist/test-support.js +0 -1
  107. package/dist/test-support.js.map +1 -1
  108. package/dist/{utils-C5796IKA.js → utils-D0v9WKmV.js} +1 -2
  109. package/dist/utils-D0v9WKmV.js.map +1 -0
  110. package/dist/utils.js +4 -1
  111. package/dist/utils.js.map +1 -1
  112. package/dist/viewport/in-viewport.js +82 -0
  113. package/dist/viewport/in-viewport.js.map +1 -0
  114. package/dist/viewport/viewport.js +92 -0
  115. package/dist/viewport/viewport.js.map +1 -0
  116. package/dist/viewport.js +3 -0
  117. package/dist/viewport.js.map +1 -0
  118. package/package.json +20 -20
  119. package/dist/component-Bs3N-G9z.js.map +0 -1
  120. package/dist/index-DKE67I8L.js.map +0 -1
  121. package/dist/otp-C6hCCXKx.js.map +0 -1
  122. package/dist/rating-D052JWRa.js.map +0 -1
  123. package/dist/utils-C5796IKA.js.map +0 -1
@@ -0,0 +1,92 @@
1
+ import { registerDestructor } from '@ember/destroyable';
2
+ import { createService } from '../service.js';
3
+
4
+ /**
5
+ * Creates or returns the ViewportObserverManager.
6
+ *
7
+ * Only one of these will exist per owner.
8
+ *
9
+ * Has only two methods:
10
+ * - observe(element, callback: (intersectionObserverEntry) => void, options?)
11
+ * - unobserve(element, callback: (intersectionObserverEntry) => void)
12
+ *
13
+ * Like with the underlying IntersectionObserver API (and all event listeners),
14
+ * the callback passed to unobserve must be the same reference as the one
15
+ * passed to observe.
16
+ */
17
+ function viewport(context) {
18
+ return createService(context, ViewportObserverManager);
19
+ }
20
+ class ViewportObserverManager {
21
+ #callbacks = new WeakMap();
22
+ #handleIntersection = entries => {
23
+ for (const entry of entries) {
24
+ const callbacks = this.#callbacks.get(entry.target);
25
+ if (callbacks) {
26
+ for (const callback of callbacks) {
27
+ callback(entry);
28
+ }
29
+ }
30
+ }
31
+ };
32
+ #observer = new IntersectionObserver(this.#handleIntersection, {
33
+ /**
34
+ * NOTE: clipping is unaffected by rootMargin if the intersection is with anything
35
+ * other than the specified "root".
36
+ * And since we don't specify the "root", this effectively means the window viewport.
37
+ * (hence the utility name: "viewport")
38
+ */
39
+ });
40
+ constructor() {
41
+ registerDestructor(this, () => {
42
+ this.#observer?.disconnect();
43
+ });
44
+ }
45
+
46
+ /**
47
+ * Initiate the observing of the `element` or add an additional `callback`
48
+ * if the `element` is already observed.
49
+ *
50
+ * @param {object} element
51
+ * @param {function} callback The `callback` is called whenever the `element`
52
+ * intersects with the viewport. It is called with an `IntersectionObserverEntry`
53
+ * object for the particular `element`.
54
+ */
55
+ observe(element, callback) {
56
+ const callbacks = this.#callbacks.get(element);
57
+ if (callbacks) {
58
+ callbacks.add(callback);
59
+ } else {
60
+ this.#callbacks.set(element, new Set([callback]));
61
+ this.#observer.observe(element);
62
+ }
63
+ }
64
+
65
+ /**
66
+ * End the observing of the `element` or just remove the provided `callback`.
67
+ *
68
+ * It will unobserve the `element` if the `callback` is not provided
69
+ * or there are no more callbacks left for this `element`.
70
+ *
71
+ * @param {Element | undefined | null} element
72
+ * @param {function?} callback - The `callback` to remove from the listeners
73
+ * of the `element` intersection changes.
74
+ */
75
+ unobserve(element, callback) {
76
+ if (!element) {
77
+ return;
78
+ }
79
+ const callbacks = this.#callbacks.get(element);
80
+ if (!callbacks) {
81
+ return;
82
+ }
83
+ callbacks.delete(callback);
84
+ if (!callback || !callbacks.size) {
85
+ this.#callbacks.delete(element);
86
+ this.#observer.unobserve(element);
87
+ }
88
+ }
89
+ }
90
+
91
+ export { viewport };
92
+ //# sourceMappingURL=viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport.js","sources":["../../src/viewport/viewport.ts"],"sourcesContent":["import { registerDestructor } from '@ember/destroyable';\n\nimport { createService } from '../service.ts';\n\n/**\n * Creates or returns the ViewportObserverManager.\n *\n * Only one of these will exist per owner.\n *\n * Has only two methods:\n * - observe(element, callback: (intersectionObserverEntry) => void, options?)\n * - unobserve(element, callback: (intersectionObserverEntry) => void)\n *\n * Like with the underlying IntersectionObserver API (and all event listeners),\n * the callback passed to unobserve must be the same reference as the one\n * passed to observe.\n */\nexport function viewport(context: object) {\n return createService(context, ViewportObserverManager);\n}\n\nexport interface ViewportOptions {\n /**\n * A margin around the root. Can have values similar to the CSS margin property.\n * The values can be percentages. This set of values serves to grow or shrink each\n * side of the root element's bounding box before computing intersections.\n * Defaults to all zeros.\n */\n rootMargin?: string;\n /**\n * Either a single number or an array of numbers which indicate at what percentage\n * of the target's visibility the observer's callback should be executed. If you only\n * want to detect when visibility passes the 50% mark, you can use a value of 0.5.\n * If you want the callback to run every time visibility passes another 25%, you would\n * specify the array [0, 0.25, 0.5, 0.75, 1]. The default is 0 (meaning as soon as\n * even one pixel is visible, the callback will be run).\n */\n threshold?: number | number[];\n}\n\nclass ViewportObserverManager {\n #callbacks = new WeakMap<Element, Set<(entries: IntersectionObserverEntry) => unknown>>();\n\n #handleIntersection = (entries: IntersectionObserverEntry[]) => {\n for (const entry of entries) {\n const callbacks = this.#callbacks.get(entry.target);\n\n if (callbacks) {\n for (const callback of callbacks) {\n callback(entry);\n }\n }\n }\n };\n\n #observer = new IntersectionObserver(this.#handleIntersection, {\n /**\n * NOTE: clipping is unaffected by rootMargin if the intersection is with anything\n * other than the specified \"root\".\n * And since we don't specify the \"root\", this effectively means the window viewport.\n * (hence the utility name: \"viewport\")\n */\n });\n\n constructor() {\n registerDestructor(this, () => {\n this.#observer?.disconnect();\n });\n }\n\n /**\n * Initiate the observing of the `element` or add an additional `callback`\n * if the `element` is already observed.\n *\n * @param {object} element\n * @param {function} callback The `callback` is called whenever the `element`\n * intersects with the viewport. It is called with an `IntersectionObserverEntry`\n * object for the particular `element`.\n */\n observe(element: Element, callback: (entry: IntersectionObserverEntry) => unknown) {\n const callbacks = this.#callbacks.get(element);\n\n if (callbacks) {\n callbacks.add(callback);\n } else {\n this.#callbacks.set(element, new Set([callback]));\n this.#observer.observe(element);\n }\n }\n\n /**\n * End the observing of the `element` or just remove the provided `callback`.\n *\n * It will unobserve the `element` if the `callback` is not provided\n * or there are no more callbacks left for this `element`.\n *\n * @param {Element | undefined | null} element\n * @param {function?} callback - The `callback` to remove from the listeners\n * of the `element` intersection changes.\n */\n unobserve(\n element: Element | undefined | null,\n callback: (entry: IntersectionObserverEntry) => unknown\n ) {\n if (!element) {\n return;\n }\n\n const callbacks = this.#callbacks.get(element);\n\n if (!callbacks) {\n return;\n }\n\n callbacks.delete(callback);\n\n if (!callback || !callbacks.size) {\n this.#callbacks.delete(element);\n this.#observer.unobserve(element);\n }\n }\n}\n"],"names":["viewport","context","createService","ViewportObserverManager","WeakMap","entries","entry","callbacks","get","target","callback","IntersectionObserver","constructor","registerDestructor","disconnect","observe","element","add","set","Set","unobserve","delete","size"],"mappings":";;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,QAAQA,CAACC,OAAe,EAAE;AACxC,EAAA,OAAOC,aAAa,CAACD,OAAO,EAAEE,uBAAuB,CAAC;AACxD;AAqBA,MAAMA,uBAAuB,CAAC;AAC5B,EAAA,UAAU,GAAG,IAAIC,OAAO,EAAiE;EAEzF,mBAAmB,GAAIC,OAAoC,IAAK;AAC9D,IAAA,KAAK,MAAMC,KAAK,IAAID,OAAO,EAAE;AAC3B,MAAA,MAAME,SAAS,GAAG,IAAI,CAAC,UAAU,CAACC,GAAG,CAACF,KAAK,CAACG,MAAM,CAAC;AAEnD,MAAA,IAAIF,SAAS,EAAE;AACb,QAAA,KAAK,MAAMG,QAAQ,IAAIH,SAAS,EAAE;UAChCG,QAAQ,CAACJ,KAAK,CAAC;AACjB,QAAA;AACF,MAAA;AACF,IAAA;EACF,CAAC;EAED,SAAS,GAAG,IAAIK,oBAAoB,CAAC,IAAI,CAAC,mBAAmB,EAAE;AAC7D;AACJ;AACA;AACA;AACA;AACA;AALI,GAMD,CAAC;AAEFC,EAAAA,WAAWA,GAAG;IACZC,kBAAkB,CAAC,IAAI,EAAE,MAAM;AAC7B,MAAA,IAAI,CAAC,SAAS,EAAEC,UAAU,EAAE;AAC9B,IAAA,CAAC,CAAC;AACJ,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,OAAOA,CAACC,OAAgB,EAAEN,QAAuD,EAAE;IACjF,MAAMH,SAAS,GAAG,IAAI,CAAC,UAAU,CAACC,GAAG,CAACQ,OAAO,CAAC;AAE9C,IAAA,IAAIT,SAAS,EAAE;AACbA,MAAAA,SAAS,CAACU,GAAG,CAACP,QAAQ,CAAC;AACzB,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAAC,UAAU,CAACQ,GAAG,CAACF,OAAO,EAAE,IAAIG,GAAG,CAAC,CAACT,QAAQ,CAAC,CAAC,CAAC;AACjD,MAAA,IAAI,CAAC,SAAS,CAACK,OAAO,CAACC,OAAO,CAAC;AACjC,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEI,EAAAA,SAASA,CACPJ,OAAmC,EACnCN,QAAuD,EACvD;IACA,IAAI,CAACM,OAAO,EAAE;AACZ,MAAA;AACF,IAAA;IAEA,MAAMT,SAAS,GAAG,IAAI,CAAC,UAAU,CAACC,GAAG,CAACQ,OAAO,CAAC;IAE9C,IAAI,CAACT,SAAS,EAAE;AACd,MAAA;AACF,IAAA;AAEAA,IAAAA,SAAS,CAACc,MAAM,CAACX,QAAQ,CAAC;AAE1B,IAAA,IAAI,CAACA,QAAQ,IAAI,CAACH,SAAS,CAACe,IAAI,EAAE;AAChC,MAAA,IAAI,CAAC,UAAU,CAACD,MAAM,CAACL,OAAO,CAAC;AAC/B,MAAA,IAAI,CAAC,SAAS,CAACI,SAAS,CAACJ,OAAO,CAAC;AACnC,IAAA;AACF,EAAA;AACF;;;;"}
@@ -0,0 +1,3 @@
1
+ export { InViewport } from './viewport/in-viewport.js';
2
+ export { viewport } from './viewport/viewport.js';
3
+ //# sourceMappingURL=viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-primitives",
3
- "version": "0.48.1",
3
+ "version": "0.49.0",
4
4
  "description": "Making apps easier to build",
5
5
  "keywords": [
6
6
  "ember-addon"
@@ -16,17 +16,17 @@
16
16
  "dependencies": {
17
17
  "@babel/runtime": "^7.27.1",
18
18
  "@embroider/addon-shim": "^1.10.0",
19
- "@embroider/macros": "^1.19.2",
19
+ "@embroider/macros": "^1.19.6",
20
20
  "@floating-ui/dom": "^1.7.0",
21
21
  "decorator-transforms": "^2.3.0",
22
22
  "ember-element-helper": ">= 0.8.6",
23
23
  "form-data-utils": "^0.6.0",
24
24
  "reactiveweb": "^1.8.0",
25
25
  "should-handle-link": "^1.2.2",
26
- "tabster": "^8.5.5",
27
- "tracked-built-ins": "^4.0.0",
26
+ "tabster": "^8.7.0",
27
+ "tracked-built-ins": "^4.1.0",
28
28
  "tracked-toolbox": "^2.0.0",
29
- "which-heading-do-i-need": "0.2.1"
29
+ "which-heading-do-i-need": "0.2.2"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@arethetypeswrong/cli": "^0.18.0",
@@ -38,31 +38,31 @@
38
38
  "@babel/plugin-transform-class-static-block": "^7.27.1",
39
39
  "@babel/plugin-transform-private-methods": "^7.27.1",
40
40
  "@babel/preset-typescript": "^7.28.5",
41
- "@ember/library-tsconfig": "^1.1.3",
42
- "@ember/test-helpers": "^5.4.0",
41
+ "@ember/library-tsconfig": "^2.0.0",
42
+ "@ember/test-helpers": "^5.4.1",
43
43
  "@ember/test-waiters": "^4.1.0",
44
- "@embroider/addon-dev": "^8.1.0",
44
+ "@embroider/addon-dev": "^8.2.0",
45
45
  "@glimmer/component": "^2.0.0",
46
46
  "@glimmer/tracking": "^1.1.2",
47
- "@glint/ember-tsc": "^1.0.7",
48
- "@glint/template": "^1.7.2",
49
- "@glint/tsserver-plugin": "^2.0.7",
50
- "@nullvoxpopuli/eslint-configs": "^5.3.4",
47
+ "@glint/ember-tsc": "^1.0.8",
48
+ "@glint/template": "^1.7.3",
49
+ "@glint/tsserver-plugin": "^2.0.8",
50
+ "@nullvoxpopuli/eslint-configs": "^5.5.0",
51
51
  "@rollup/plugin-babel": "^6.1.0",
52
- "@tsconfig/ember": "^3.0.5",
53
- "babel-plugin-ember-template-compilation": "^2.4.0",
52
+ "@tsconfig/ember": "^3.0.12",
53
+ "babel-plugin-ember-template-compilation": "^3.0.1",
54
54
  "concurrently": "^9.2.1",
55
55
  "ember-modifier": "^4.2.2",
56
56
  "ember-resources": "^7.0.7",
57
- "ember-source": "6.8.1",
57
+ "ember-source": "6.9.0",
58
58
  "ember-template-lint": "^7.9.3",
59
- "eslint": "^9.39.0",
59
+ "eslint": "^9.39.2",
60
60
  "execa": "^9.6.0",
61
61
  "fix-bad-declaration-output": "^1.1.5",
62
- "prettier": "^3.2.5",
63
- "prettier-plugin-ember-template-tag": "^2.0.5",
64
- "publint": "^0.3.12",
65
- "rollup": "~4.52.5",
62
+ "prettier": "^3.7.4",
63
+ "prettier-plugin-ember-template-tag": "^2.1.2",
64
+ "publint": "^0.3.16",
65
+ "rollup": "~4.54.0",
66
66
  "rollup-plugin-copy": "^3.5.0",
67
67
  "typescript": "^5.9.3"
68
68
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"component-Bs3N-G9z.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DKE67I8L.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"otp-C6hCCXKx.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rating-D052JWRa.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils-C5796IKA.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}