ember-primitives 0.48.2 → 0.50.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 (218) hide show
  1. package/bin/index.mjs +271 -0
  2. package/declarations/components/portal.d.ts.map +1 -1
  3. package/declarations/components/rating/public-types.d.ts +0 -4
  4. package/declarations/components/rating/public-types.d.ts.map +1 -1
  5. package/declarations/components/rating/rating.d.ts +9 -1
  6. package/declarations/components/rating/rating.d.ts.map +1 -1
  7. package/declarations/components/rating/stars.d.ts.map +1 -1
  8. package/declarations/components/rating/state.d.ts +4 -0
  9. package/declarations/components/rating/state.d.ts.map +1 -1
  10. package/declarations/components/rating/utils.d.ts +0 -1
  11. package/declarations/components/rating/utils.d.ts.map +1 -1
  12. package/declarations/tabster.d.ts.map +1 -1
  13. package/declarations/utils.d.ts.map +1 -1
  14. package/declarations/viewport/in-viewport.d.ts +70 -0
  15. package/declarations/viewport/in-viewport.d.ts.map +1 -0
  16. package/declarations/viewport/viewport.d.ts +59 -0
  17. package/declarations/viewport/viewport.d.ts.map +1 -0
  18. package/declarations/viewport.d.ts +3 -0
  19. package/declarations/viewport.d.ts.map +1 -0
  20. package/dist/-private.js +0 -1
  21. package/dist/-private.js.map +1 -1
  22. package/dist/color-scheme.js +0 -1
  23. package/dist/color-scheme.js.map +1 -1
  24. package/dist/{component-Bs3N-G9z.js → component-BXy_iafw.js} +2 -3
  25. package/dist/component-BXy_iafw.js.map +1 -0
  26. package/dist/components/accordion.js +5 -6
  27. package/dist/components/accordion.js.map +1 -1
  28. package/dist/components/avatar.js +3 -4
  29. package/dist/components/avatar.js.map +1 -1
  30. package/dist/components/dialog.js +2 -3
  31. package/dist/components/dialog.js.map +1 -1
  32. package/dist/components/external-link.js +1 -2
  33. package/dist/components/external-link.js.map +1 -1
  34. package/dist/components/form.js +1 -2
  35. package/dist/components/form.js.map +1 -1
  36. package/dist/components/heading.js +1 -2
  37. package/dist/components/heading.js.map +1 -1
  38. package/dist/components/keys.js +2 -3
  39. package/dist/components/keys.js.map +1 -1
  40. package/dist/components/layout/hero.js +1 -1
  41. package/dist/components/layout/sticky-footer.js +1 -1
  42. package/dist/components/link.js +1 -2
  43. package/dist/components/link.js.map +1 -1
  44. package/dist/components/menu.js +6 -8
  45. package/dist/components/menu.js.map +1 -1
  46. package/dist/components/one-time-password.js +1 -2
  47. package/dist/components/popover.js +3 -4
  48. package/dist/components/popover.js.map +1 -1
  49. package/dist/components/portal-targets.js +2 -3
  50. package/dist/components/portal-targets.js.map +1 -1
  51. package/dist/components/portal.js +3 -7
  52. package/dist/components/portal.js.map +1 -1
  53. package/dist/components/progress.js +2 -3
  54. package/dist/components/progress.js.map +1 -1
  55. package/dist/components/rating.js +1 -2
  56. package/dist/components/scroller.js +1 -2
  57. package/dist/components/scroller.js.map +1 -1
  58. package/dist/components/shadowed.js +2 -3
  59. package/dist/components/shadowed.js.map +1 -1
  60. package/dist/components/switch.js +5 -6
  61. package/dist/components/switch.js.map +1 -1
  62. package/dist/components/tabs.js +6 -7
  63. package/dist/components/tabs.js.map +1 -1
  64. package/dist/components/toggle-group.js +3 -4
  65. package/dist/components/toggle-group.js.map +1 -1
  66. package/dist/components/toggle.js +2 -3
  67. package/dist/components/toggle.js.map +1 -1
  68. package/dist/components/visually-hidden.js +1 -2
  69. package/dist/components/visually-hidden.js.map +1 -1
  70. package/dist/components/zoetrope.js +1 -2
  71. package/dist/dom-context.js +2 -3
  72. package/dist/dom-context.js.map +1 -1
  73. package/dist/floating-ui.js +1 -2
  74. package/dist/head.js +1 -2
  75. package/dist/head.js.map +1 -1
  76. package/dist/helpers/body-class.js +0 -1
  77. package/dist/helpers/body-class.js.map +1 -1
  78. package/dist/helpers/link.js +0 -1
  79. package/dist/helpers/link.js.map +1 -1
  80. package/dist/helpers/service.js +0 -1
  81. package/dist/helpers/service.js.map +1 -1
  82. package/dist/helpers.js +0 -1
  83. package/dist/helpers.js.map +1 -1
  84. package/dist/iframe.js +0 -1
  85. package/dist/iframe.js.map +1 -1
  86. package/dist/{index-DKE67I8L.js → index-gRO4Cvlf.js} +2 -2
  87. package/dist/index-gRO4Cvlf.js.map +1 -0
  88. package/dist/index.js +3 -4
  89. package/dist/index.js.map +1 -1
  90. package/dist/load.js +0 -1
  91. package/dist/load.js.map +1 -1
  92. package/dist/narrowing.js +0 -1
  93. package/dist/narrowing.js.map +1 -1
  94. package/dist/on-resize.js +0 -1
  95. package/dist/on-resize.js.map +1 -1
  96. package/dist/{otp-C6hCCXKx.js → otp-7rz1PWP0.js} +6 -7
  97. package/dist/otp-7rz1PWP0.js.map +1 -0
  98. package/dist/proper-links.js +0 -1
  99. package/dist/proper-links.js.map +1 -1
  100. package/dist/qp.js +0 -1
  101. package/dist/qp.js.map +1 -1
  102. package/dist/rating-BrIiwDLw.js +152 -0
  103. package/dist/rating-BrIiwDLw.js.map +1 -0
  104. package/dist/resize-observer.js +0 -1
  105. package/dist/resize-observer.js.map +1 -1
  106. package/dist/service.js +0 -1
  107. package/dist/service.js.map +1 -1
  108. package/dist/store.js +0 -1
  109. package/dist/store.js.map +1 -1
  110. package/dist/styles.css.js +0 -1
  111. package/dist/tabster.js +0 -1
  112. package/dist/tabster.js.map +1 -1
  113. package/dist/test-support.js +0 -1
  114. package/dist/test-support.js.map +1 -1
  115. package/dist/{utils-C5796IKA.js → utils-D0v9WKmV.js} +1 -2
  116. package/dist/utils-D0v9WKmV.js.map +1 -0
  117. package/dist/utils.js +4 -1
  118. package/dist/utils.js.map +1 -1
  119. package/dist/viewport/in-viewport.js +82 -0
  120. package/dist/viewport/in-viewport.js.map +1 -0
  121. package/dist/viewport/viewport.js +92 -0
  122. package/dist/viewport/viewport.js.map +1 -0
  123. package/dist/viewport.js +3 -0
  124. package/dist/viewport.js.map +1 -0
  125. package/package.json +24 -20
  126. package/src/-private.ts +4 -0
  127. package/src/color-scheme.ts +165 -0
  128. package/src/components/-private/typed-elements.gts +13 -0
  129. package/src/components/-private/utils.ts +16 -0
  130. package/src/components/accordion/content.gts +34 -0
  131. package/src/components/accordion/header.gts +36 -0
  132. package/src/components/accordion/item.gts +55 -0
  133. package/src/components/accordion/public.ts +64 -0
  134. package/src/components/accordion/trigger.gts +32 -0
  135. package/src/components/accordion.gts +195 -0
  136. package/src/components/avatar.gts +108 -0
  137. package/src/components/dialog.gts +234 -0
  138. package/src/components/external-link.gts +14 -0
  139. package/src/components/form.gts +75 -0
  140. package/src/components/heading.gts +36 -0
  141. package/src/components/keys.gts +53 -0
  142. package/src/components/layout/hero.css +5 -0
  143. package/src/components/layout/hero.gts +17 -0
  144. package/src/components/layout/sticky-footer.css +9 -0
  145. package/src/components/layout/sticky-footer.gts +40 -0
  146. package/src/components/link.gts +172 -0
  147. package/src/components/menu.gts +373 -0
  148. package/src/components/one-time-password/buttons.gts +31 -0
  149. package/src/components/one-time-password/input.gts +198 -0
  150. package/src/components/one-time-password/otp.gts +130 -0
  151. package/src/components/one-time-password/utils.ts +201 -0
  152. package/src/components/one-time-password.gts +2 -0
  153. package/src/components/popover.gts +248 -0
  154. package/src/components/portal-targets.gts +136 -0
  155. package/src/components/portal.gts +194 -0
  156. package/src/components/progress.gts +154 -0
  157. package/src/components/rating/public-types.ts +44 -0
  158. package/src/components/rating/range.gts +22 -0
  159. package/src/components/rating/rating.gts +228 -0
  160. package/src/components/rating/stars.gts +60 -0
  161. package/src/components/rating/state.gts +144 -0
  162. package/src/components/rating/utils.ts +7 -0
  163. package/src/components/rating.gts +5 -0
  164. package/src/components/scroller.gts +179 -0
  165. package/src/components/shadowed.gts +110 -0
  166. package/src/components/switch.gts +103 -0
  167. package/src/components/tabs.gts +519 -0
  168. package/src/components/toggle-group.gts +265 -0
  169. package/src/components/toggle.gts +81 -0
  170. package/src/components/violations.css +105 -0
  171. package/src/components/violations.css.ts +1 -0
  172. package/src/components/visually-hidden.css +14 -0
  173. package/src/components/visually-hidden.gts +15 -0
  174. package/src/components/zoetrope/index.gts +358 -0
  175. package/src/components/zoetrope/styles.css +40 -0
  176. package/src/components/zoetrope/types.ts +65 -0
  177. package/src/components/zoetrope.ts +3 -0
  178. package/src/dom-context.gts +245 -0
  179. package/src/floating-ui/component.gts +186 -0
  180. package/src/floating-ui/middleware.ts +13 -0
  181. package/src/floating-ui/modifier.ts +183 -0
  182. package/src/floating-ui.ts +2 -0
  183. package/src/head.gts +37 -0
  184. package/src/helpers/body-class.ts +94 -0
  185. package/src/helpers/link.ts +125 -0
  186. package/src/helpers/service.ts +25 -0
  187. package/src/helpers.ts +2 -0
  188. package/src/iframe.ts +31 -0
  189. package/src/index.ts +43 -0
  190. package/src/load.gts +77 -0
  191. package/src/narrowing.ts +7 -0
  192. package/src/on-resize.ts +64 -0
  193. package/src/proper-links.ts +140 -0
  194. package/src/qp.ts +107 -0
  195. package/src/resize-observer.ts +132 -0
  196. package/src/service.ts +103 -0
  197. package/src/store.ts +72 -0
  198. package/src/styles.css.ts +5 -0
  199. package/src/tabster.ts +54 -0
  200. package/src/template-registry.ts +44 -0
  201. package/src/test-support/a11y.ts +50 -0
  202. package/src/test-support/dom.ts +112 -0
  203. package/src/test-support/otp.ts +64 -0
  204. package/src/test-support/rating.ts +144 -0
  205. package/src/test-support/routing.ts +62 -0
  206. package/src/test-support/zoetrope.ts +51 -0
  207. package/src/test-support.gts +6 -0
  208. package/src/type-utils.ts +1 -0
  209. package/src/utils.ts +75 -0
  210. package/src/viewport/in-viewport.gts +128 -0
  211. package/src/viewport/viewport.ts +122 -0
  212. package/src/viewport.ts +2 -0
  213. package/dist/component-Bs3N-G9z.js.map +0 -1
  214. package/dist/index-DKE67I8L.js.map +0 -1
  215. package/dist/otp-C6hCCXKx.js.map +0 -1
  216. package/dist/rating-D052JWRa.js +0 -149
  217. package/dist/rating-D052JWRa.js.map +0 -1
  218. package/dist/utils-C5796IKA.js.map +0 -1
@@ -1,4 +1,3 @@
1
-
2
1
  import Component from '@glimmer/component';
3
2
  import { assert } from '@ember/debug';
4
3
  import { hash } from '@ember/helper';
@@ -11,7 +10,7 @@ import { g, i } from 'decorator-transforms/runtime';
11
10
 
12
11
  class AccordionContent extends Component {
13
12
  static {
14
- setComponentTemplate(precompileTemplate("\n <div role=\"region\" id={{@value}} data-state={{getDataState @isExpanded}} hidden={{this.isHidden}} data-disabled={{@disabled}} ...attributes>\n {{yield}}\n </div>\n ", {
13
+ setComponentTemplate(precompileTemplate("<div role=\"region\" id={{@value}} data-state={{getDataState @isExpanded}} hidden={{this.isHidden}} data-disabled={{@disabled}} ...attributes>\n {{yield}}\n</div>", {
15
14
  strictMode: true,
16
15
  scope: () => ({
17
16
  getDataState
@@ -23,7 +22,7 @@ class AccordionContent extends Component {
23
22
  }
24
23
  }
25
24
 
26
- const AccordionTrigger = setComponentTemplate(precompileTemplate("\n <button type=\"button\" aria-controls={{@value}} aria-expanded={{@isExpanded}} data-state={{getDataState @isExpanded}} data-disabled={{@disabled}} aria-disabled={{if @disabled \"true\" \"false\"}} {{on \"click\" @toggleItem}} ...attributes>\n {{yield}}\n </button>\n", {
25
+ const AccordionTrigger = setComponentTemplate(precompileTemplate("<button type=\"button\" aria-controls={{@value}} aria-expanded={{@isExpanded}} data-state={{getDataState @isExpanded}} data-disabled={{@disabled}} aria-disabled={{if @disabled \"true\" \"false\"}} {{on \"click\" @toggleItem}} ...attributes>\n {{yield}}\n</button>", {
27
26
  strictMode: true,
28
27
  scope: () => ({
29
28
  getDataState,
@@ -31,7 +30,7 @@ const AccordionTrigger = setComponentTemplate(precompileTemplate("\n <button ty
31
30
  })
32
31
  }), templateOnly());
33
32
 
34
- const AccordionHeader = setComponentTemplate(precompileTemplate("\n <div role=\"heading\" aria-level=\"3\" data-state={{getDataState @isExpanded}} data-disabled={{@disabled}} ...attributes>\n {{yield (hash Trigger=(component Trigger value=@value isExpanded=@isExpanded disabled=@disabled toggleItem=@toggleItem))}}\n </div>\n", {
33
+ const AccordionHeader = setComponentTemplate(precompileTemplate("<div role=\"heading\" aria-level=\"3\" data-state={{getDataState @isExpanded}} data-disabled={{@disabled}} ...attributes>\n {{yield (hash Trigger=(component Trigger value=@value isExpanded=@isExpanded disabled=@disabled toggleItem=@toggleItem))}}\n</div>", {
35
34
  strictMode: true,
36
35
  scope: () => ({
37
36
  getDataState,
@@ -45,7 +44,7 @@ function getDataState(isExpanded) {
45
44
  }
46
45
  class AccordionItem extends Component {
47
46
  static {
48
- setComponentTemplate(precompileTemplate("\n <div data-state={{getDataState this.isExpanded}} data-disabled={{@disabled}} ...attributes>\n {{yield (hash isExpanded=this.isExpanded Header=(component Header value=@value isExpanded=this.isExpanded disabled=@disabled toggleItem=this.toggleItem) Content=(component Content value=@value isExpanded=this.isExpanded disabled=@disabled))}}\n </div>\n ", {
47
+ setComponentTemplate(precompileTemplate("<div data-state={{getDataState this.isExpanded}} data-disabled={{@disabled}} ...attributes>\n {{yield (hash isExpanded=this.isExpanded Header=(component Header value=@value isExpanded=this.isExpanded disabled=@disabled toggleItem=this.toggleItem) Content=(component Content value=@value isExpanded=this.isExpanded disabled=@disabled))}}\n</div>", {
49
48
  strictMode: true,
50
49
  scope: () => ({
51
50
  getDataState,
@@ -69,7 +68,7 @@ class AccordionItem extends Component {
69
68
 
70
69
  class Accordion extends Component {
71
70
  static {
72
- setComponentTemplate(precompileTemplate("\n <div data-disabled={{@disabled}} ...attributes>\n {{yield (hash Item=(component AccordionItem selectedValue=this.selectedValue toggleItem=this.toggleItem disabled=@disabled))}}\n </div>\n ", {
71
+ setComponentTemplate(precompileTemplate("<div data-disabled={{@disabled}} ...attributes>\n {{yield (hash Item=(component AccordionItem selectedValue=this.selectedValue toggleItem=this.toggleItem disabled=@disabled))}}\n</div>", {
73
72
  strictMode: true,
74
73
  scope: () => ({
75
74
  hash,
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"accordion.js","sources":["../../src/components/accordion/content.gts","../../src/components/accordion/trigger.gts","../../src/components/accordion/header.gts","../../src/components/accordion/item.gts","../../src/components/accordion.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\n\nimport { getDataState } from \"./item.gts\";\n\nimport type { AccordionContentExternalSignature } from \"./public.ts\";\n\ninterface Signature extends AccordionContentExternalSignature {\n Args: {\n isExpanded: boolean;\n value: string;\n disabled?: boolean;\n };\n}\n\nexport class AccordionContent extends Component<Signature> {\n <template>\n <div\n role=\"region\"\n id={{@value}}\n data-state={{getDataState @isExpanded}}\n hidden={{this.isHidden}}\n data-disabled={{@disabled}}\n ...attributes\n >\n {{yield}}\n </div>\n </template>\n\n get isHidden() {\n return !this.args.isExpanded;\n }\n}\n\nexport default AccordionContent;\n","import { on } from \"@ember/modifier\";\n\nimport { getDataState } from \"./item.gts\";\n\nimport type { AccordionTriggerExternalSignature } from \"./public.ts\";\nimport type { TOC } from \"@ember/component/template-only\";\n\ninterface Signature extends AccordionTriggerExternalSignature {\n Args: {\n isExpanded: boolean;\n value: string;\n disabled?: boolean;\n toggleItem: () => void;\n };\n}\n\nexport const AccordionTrigger: TOC<Signature> = <template>\n <button\n type=\"button\"\n aria-controls={{@value}}\n aria-expanded={{@isExpanded}}\n data-state={{getDataState @isExpanded}}\n data-disabled={{@disabled}}\n aria-disabled={{if @disabled \"true\" \"false\"}}\n {{on \"click\" @toggleItem}}\n ...attributes\n >\n {{yield}}\n </button>\n</template>;\n\nexport default AccordionTrigger;\n","import { hash } from \"@ember/helper\";\n\nimport { getDataState } from \"./item.gts\";\nimport Trigger from \"./trigger.gts\";\n\nimport type { AccordionHeaderExternalSignature } from \"./public.ts\";\nimport type { TOC } from \"@ember/component/template-only\";\n\ninterface Signature extends AccordionHeaderExternalSignature {\n Args: {\n value: string;\n isExpanded: boolean;\n disabled?: boolean;\n toggleItem: () => void;\n };\n}\n\nexport const AccordionHeader: TOC<Signature> = <template>\n <div\n role=\"heading\"\n aria-level=\"3\"\n data-state={{getDataState @isExpanded}}\n data-disabled={{@disabled}}\n ...attributes\n >\n {{yield\n (hash\n Trigger=(component\n Trigger value=@value isExpanded=@isExpanded disabled=@disabled toggleItem=@toggleItem\n )\n )\n }}\n </div>\n</template>;\n\nexport default AccordionHeader;\n","import Component from \"@glimmer/component\";\nimport { hash } from \"@ember/helper\";\n\nimport Content from \"./content.gts\";\nimport Header from \"./header.gts\";\n\nimport type { AccordionItemExternalSignature } from \"./public.ts\";\n\nexport function getDataState(isExpanded: boolean): string {\n return isExpanded ? \"open\" : \"closed\";\n}\n\ninterface Signature extends AccordionItemExternalSignature {\n Args: AccordionItemExternalSignature[\"Args\"] & {\n selectedValue?: string | string[];\n disabled?: boolean;\n toggleItem: (value: string) => void;\n };\n}\n\nexport class AccordionItem extends Component<Signature> {\n <template>\n <div data-state={{getDataState this.isExpanded}} data-disabled={{@disabled}} ...attributes>\n {{yield\n (hash\n isExpanded=this.isExpanded\n Header=(component\n Header\n value=@value\n isExpanded=this.isExpanded\n disabled=@disabled\n toggleItem=this.toggleItem\n )\n Content=(component Content value=@value isExpanded=this.isExpanded disabled=@disabled)\n )\n }}\n </div>\n </template>\n\n get isExpanded(): boolean {\n if (Array.isArray(this.args.selectedValue)) {\n return this.args.selectedValue.includes(this.args.value);\n }\n\n return this.args.selectedValue === this.args.value;\n }\n\n toggleItem = (): void => {\n if (this.args.disabled) return;\n\n this.args.toggleItem(this.args.value);\n };\n}\n\nexport default AccordionItem;\n","import Component from \"@glimmer/component\";\nimport { assert } from \"@ember/debug\";\nimport { hash } from \"@ember/helper\";\n\n// temp\n// https://github.com/tracked-tools/tracked-toolbox/issues/38\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { localCopy } from \"tracked-toolbox\";\n\nimport AccordionItem from \"./accordion/item.gts\";\n\nimport type { WithBoundArgs } from \"@glint/template\";\n\ntype AccordionSingleArgs = {\n /**\n * The type of accordion. If `single`, only one item can be selected at a time. If `multiple`, multiple items can be selected at a time.\n */\n type: \"single\";\n /**\n * Whether the accordion is disabled. When `true`, all items cannot be expanded or collapsed.\n */\n disabled?: boolean;\n /**\n * When type is `single`, whether the accordion is collapsible. When `true`, the selected item can be collapsed by clicking its trigger.\n */\n collapsible?: boolean;\n} & (\n | {\n /**\n * The currently selected value. To be used in a controlled fashion in conjunction with `onValueChange`.\n */\n value: string;\n /**\n * A callback that is called when the selected value changes. To be used in a controlled fashion in conjunction with `value`.\n */\n onValueChange: (value: string | undefined) => void;\n /**\n * Not available in a controlled fashion.\n */\n defaultValue?: never;\n }\n | {\n /**\n * Not available in an uncontrolled fashion.\n */\n value?: never;\n /**\n * Not available in an uncontrolled fashion.\n */\n onValueChange?: never;\n /**\n * The default value of the accordion. To be used in an uncontrolled fashion.\n */\n defaultValue?: string;\n }\n);\n\ntype AccordionMultipleArgs = {\n /**\n * The type of accordion. If `single`, only one item can be selected at a time. If `multiple`, multiple items can be selected at a time.\n */\n type: \"multiple\";\n /**\n * Whether the accordion is disabled. When `true`, all items cannot be expanded or collapsed.\n */\n disabled?: boolean;\n} & (\n | {\n /**\n * The currently selected values. To be used in a controlled fashion in conjunction with `onValueChange`.\n */\n value: string[];\n /**\n * A callback that is called when the selected values change. To be used in a controlled fashion in conjunction with `value`.\n */\n onValueChange: (value?: string[]) => void;\n /**\n * Not available in a controlled fashion.\n */\n defaultValue?: never;\n }\n | {\n /**\n * Not available in an uncontrolled fashion.\n */\n value?: never;\n /**\n * Not available in an uncontrolled fashion.\n */\n onValueChange?: never;\n /**\n * The default values of the accordion. To be used in an uncontrolled fashion.\n */\n defaultValue?: string[];\n }\n);\n\nexport class Accordion extends Component<{\n Element: HTMLDivElement;\n Args: AccordionSingleArgs | AccordionMultipleArgs;\n Blocks: {\n default: [\n {\n /**\n * The AccordionItem component.\n */\n Item: WithBoundArgs<typeof AccordionItem, \"selectedValue\" | \"toggleItem\" | \"disabled\">;\n },\n ];\n };\n}> {\n <template>\n <div data-disabled={{@disabled}} ...attributes>\n {{yield\n (hash\n Item=(component\n AccordionItem\n selectedValue=this.selectedValue\n toggleItem=this.toggleItem\n disabled=@disabled\n )\n )\n }}\n </div>\n </template>\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n @localCopy(\"args.defaultValue\") declare _internallyManagedValue?: string | string[];\n\n get selectedValue() {\n return this.args.value ?? this._internallyManagedValue;\n }\n\n toggleItem = (value: string) => {\n if (this.args.disabled) {\n return;\n }\n\n if (this.args.type === \"single\") {\n this.toggleItemSingle(value);\n } else if (this.args.type === \"multiple\") {\n this.toggleItemMultiple(value);\n }\n };\n\n toggleItemSingle = (value: string) => {\n assert(\"Cannot call `toggleItemSingle` when `disabled` is true.\", !this.args.disabled);\n assert(\n \"Cannot call `toggleItemSingle` when `type` is not `single`.\",\n this.args.type === \"single\",\n );\n\n if (value === this.selectedValue && !this.args.collapsible) {\n return;\n }\n\n const newValue = value === this.selectedValue ? undefined : value;\n\n if (this.args.onValueChange) {\n this.args.onValueChange(newValue);\n } else {\n this._internallyManagedValue = newValue;\n }\n };\n\n toggleItemMultiple = (value: string) => {\n assert(\"Cannot call `toggleItemMultiple` when `disabled` is true.\", !this.args.disabled);\n assert(\n \"Cannot call `toggleItemMultiple` when `type` is not `multiple`.\",\n this.args.type === \"multiple\",\n );\n\n const currentValues = (this.selectedValue as string[] | undefined) ?? [];\n const indexOfValue = currentValues.indexOf(value);\n let newValue: string[];\n\n if (indexOfValue === -1) {\n newValue = [...currentValues, value];\n } else {\n newValue = [\n ...currentValues.slice(0, indexOfValue),\n ...currentValues.slice(indexOfValue + 1),\n ];\n }\n\n if (this.args.onValueChange) {\n this.args.onValueChange(newValue);\n } else {\n this._internallyManagedValue = newValue;\n }\n };\n}\n\nexport default Accordion;\n"],"names":["AccordionContent","Component","setComponentTemplate","precompileTemplate","strictMode","scope","getDataState","isHidden","args","isExpanded","AccordionTrigger","on","templateOnly","AccordionHeader","hash","Trigger","AccordionItem","Header","Content","Array","isArray","selectedValue","includes","value","toggleItem","disabled","Accordion","g","prototype","localCopy","i","_internallyManagedValue","type","toggleItemSingle","toggleItemMultiple","assert","collapsible","newValue","undefined","onValueChange","currentValues","indexOfValue","indexOf","slice"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
-
2
1
  import { hash } from '@ember/helper';
3
2
  import { ReactiveImage } from 'reactiveweb/image';
4
3
  import { WaitUntil } from 'reactiveweb/wait-until';
@@ -6,16 +5,16 @@ import { precompileTemplate } from '@ember/template-compilation';
6
5
  import { setComponentTemplate } from '@ember/component';
7
6
  import templateOnly from '@ember/component/template-only';
8
7
 
9
- const Fallback = setComponentTemplate(precompileTemplate("\n {{#unless @isLoaded}}\n {{#let (WaitUntil @delayMs) as |delayFinished|}}\n {{#if delayFinished}}\n {{yield}}\n {{/if}}\n {{/let}}\n {{/unless}}\n", {
8
+ const Fallback = setComponentTemplate(precompileTemplate("{{#unless @isLoaded}}\n {{#let (WaitUntil @delayMs) as |delayFinished|}}\n {{#if delayFinished}}\n {{yield}}\n {{/if}}\n {{/let}}\n{{/unless}}", {
10
9
  strictMode: true,
11
10
  scope: () => ({
12
11
  WaitUntil
13
12
  })
14
13
  }), templateOnly());
15
- const Image = setComponentTemplate(precompileTemplate("\n {{#if @isLoaded}}\n <img alt=\"__missing__\" ...attributes src={{@src}} />\n {{/if}}\n", {
14
+ const Image = setComponentTemplate(precompileTemplate("{{#if @isLoaded}}\n <img alt=\"__missing__\" ...attributes src={{@src}} />\n{{/if}}", {
16
15
  strictMode: true
17
16
  }), templateOnly());
18
- const Avatar = setComponentTemplate(precompileTemplate("\n {{#let (ReactiveImage @src) as |imgState|}}\n <span data-prim-avatar ...attributes data-loading={{imgState.isLoading}} data-error={{imgState.isError}}>\n {{yield (hash Image=(component Image src=@src isLoaded=imgState.isResolved) Fallback=(component Fallback isLoaded=imgState.isResolved) isLoading=imgState.isLoading isError=imgState.isError)}}\n </span>\n {{/let}}\n", {
17
+ const Avatar = setComponentTemplate(precompileTemplate("{{#let (ReactiveImage @src) as |imgState|}}\n <span data-prim-avatar ...attributes data-loading={{imgState.isLoading}} data-error={{imgState.isError}}>\n {{yield (hash Image=(component Image src=@src isLoaded=imgState.isResolved) Fallback=(component Fallback isLoaded=imgState.isResolved) isLoading=imgState.isLoading isError=imgState.isError)}}\n </span>\n{{/let}}", {
19
18
  strictMode: true,
20
19
  scope: () => ({
21
20
  ReactiveImage,
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"avatar.js","sources":["../../src/components/avatar.gts"],"sourcesContent":["import { hash } from \"@ember/helper\";\n\nimport { ReactiveImage } from \"reactiveweb/image\";\nimport { WaitUntil } from \"reactiveweb/wait-until\";\n\nimport type { TOC } from \"@ember/component/template-only\";\nimport type { WithBoundArgs } from \"@glint/template\";\n\nconst Fallback: TOC<{\n Blocks: { default: [] };\n Args: {\n /**\n * The number of milliseconds to wait for the image to load\n * before displaying the fallback\n */\n delayMs?: number;\n /**\n * @private\n * Bound internally by ember-primitives\n */\n isLoaded: boolean;\n };\n}> = <template>\n {{#unless @isLoaded}}\n {{#let (WaitUntil @delayMs) as |delayFinished|}}\n {{#if delayFinished}}\n {{yield}}\n {{/if}}\n {{/let}}\n {{/unless}}\n</template>;\n\nconst Image: TOC<{\n Element: HTMLImageElement;\n Args: {\n /**\n * @private\n * The `src` value for the image.\n *\n * Bound internally by ember-primitives\n */\n src: string;\n /**\n * @private\n * Bound internally by ember-primitives\n */\n isLoaded: boolean;\n };\n}> = <template>\n {{#if @isLoaded}}\n <img alt=\"__missing__\" ...attributes src={{@src}} />\n {{/if}}\n</template>;\n\nexport const Avatar: TOC<{\n Element: HTMLSpanElement;\n Args: {\n /**\n * The `src` value for the image.\n */\n src: string;\n };\n Blocks: {\n default: [\n avatar: {\n /**\n * The image to render. It will only render when it has loaded.\n */\n Image: WithBoundArgs<typeof Image, \"src\" | \"isLoaded\">;\n /**\n * An element that renders when the image hasn't loaded.\n * This means whilst it's loading, or if there was an error.\n * If you notice a flash during loading,\n * you can provide a delayMs prop to delay its rendering so it only renders for those with slower connections.\n */\n Fallback: WithBoundArgs<typeof Fallback, \"isLoaded\">;\n /**\n * true while the image is loading\n */\n isLoading: boolean;\n /**\n * If the image fails to load, this will be `true`\n */\n isError: boolean;\n },\n ];\n };\n}> = <template>\n {{#let (ReactiveImage @src) as |imgState|}}\n <span\n data-prim-avatar\n ...attributes\n data-loading={{imgState.isLoading}}\n data-error={{imgState.isError}}\n >\n {{yield\n (hash\n Image=(component Image src=@src isLoaded=imgState.isResolved)\n Fallback=(component Fallback isLoaded=imgState.isResolved)\n isLoading=imgState.isLoading\n isError=imgState.isError\n )\n }}\n </span>\n {{/let}}\n</template>;\n\nexport default Avatar;\n"],"names":["Fallback","setComponentTemplate","precompileTemplate","strictMode","scope","WaitUntil","templateOnly","Image","Avatar","ReactiveImage","hash"],"mappings":";;;;;;;AAQA,MAAMA,QAcD,GAAAC,oBAAA,CAAAC,kBAAA,CAAA,6JAAA,EAQL;EAAAC,UAAA,EAAA,IAAA;AAAAC,EAAAA,KAAA,EAAAA,OAAA;AAAAC,IAAAA;AAAA,GAAA;AAAU,CAAA,CAAA,EAAAC,YAAA,EAAA,CAAA;AAEV,MAAMC,KAgBD,GAAAN,oBAAA,CAAAC,kBAAA,CAAA,sFAAA,EAIL;EAAAC,UAAA,EAAA;AAAU,CAAA,CAAA,EAAAG,YAAA,EAAA,CAAA;MAEGE,MAiCR,GAAAP,oBAAA,CAAAC,kBAAA,CAAA,oXAAA,EAkBL;EAAAC,UAAA,EAAA,IAAA;AAAAC,EAAAA,KAAA,EAAAA,OAAA;IAAAK,aAAA;IAAAC,IAAA;IAAAH,KAAA;AAAAP,IAAAA;AAAA,GAAA;AAAU,CAAA,CAAA,EAAAM,YAAA,EAAA;;;;"}
@@ -1,4 +1,3 @@
1
-
2
1
  import Component from '@glimmer/component';
3
2
  import { tracked } from '@glimmer/tracking';
4
3
  import { assert } from '@ember/debug';
@@ -11,7 +10,7 @@ import { setComponentTemplate } from '@ember/component';
11
10
  import templateOnly from '@ember/component/template-only';
12
11
  import { g, i } from 'decorator-transforms/runtime';
13
12
 
14
- const DialogElement = setComponentTemplate(precompileTemplate("\n <dialog ...attributes open={{@open}} {{on \"close\" @onClose}} {{@register}}>\n {{yield}}\n </dialog>\n", {
13
+ const DialogElement = setComponentTemplate(precompileTemplate("<dialog ...attributes open={{@open}} {{on \"close\" @onClose}} {{@register}}>\n {{yield}}\n</dialog>", {
15
14
  strictMode: true,
16
15
  scope: () => ({
17
16
  on
@@ -19,7 +18,7 @@ const DialogElement = setComponentTemplate(precompileTemplate("\n <dialog ...at
19
18
  }), templateOnly());
20
19
  class ModalDialog extends Component {
21
20
  static {
22
- setComponentTemplate(precompileTemplate("\n {{yield (hash isOpen=this.isOpen open=this.open close=this.close focusOnClose=this.refocus Dialog=(component DialogElement open=@open onClose=this.handleClose register=this.register))}}\n ", {
21
+ setComponentTemplate(precompileTemplate("{{yield (hash isOpen=this.isOpen open=this.open close=this.close focusOnClose=this.refocus Dialog=(component DialogElement open=@open onClose=this.handleClose register=this.register))}}", {
23
22
  strictMode: true,
24
23
  scope: () => ({
25
24
  hash,
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"dialog.js","sources":["../../src/components/dialog.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { assert } from \"@ember/debug\";\nimport { hash } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\n\nimport { modifier as eModifier } from \"ember-modifier\";\n// temp\n// https://github.com/tracked-tools/tracked-toolbox/issues/38\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-expect-error\nimport { localCopy } from \"tracked-toolbox\";\n\nimport type { TOC } from \"@ember/component/template-only\";\nimport type { ModifierLike, WithBoundArgs } from \"@glint/template\";\n\nconst DialogElement: TOC<{\n Element: HTMLDialogElement;\n Args: {\n /**\n * @internal\n */\n open: boolean | undefined;\n /**\n * @internal\n */\n onClose: () => void;\n\n /**\n * @internal\n */\n register: ModifierLike<{ Element: HTMLDialogElement }>;\n };\n Blocks: { default: [] };\n}> = <template>\n <dialog ...attributes open={{@open}} {{on \"close\" @onClose}} {{@register}}>\n {{yield}}\n </dialog>\n</template>;\n\nexport interface Signature {\n Args: {\n /**\n * Optionally set the open state of the `<dialog>`\n * The state will still be managed internally,\n * so this does not need to be a maintained value, but whenever it changes,\n * the dialog element will reflect that change accordingly.\n */\n open?: boolean;\n /**\n * When the `<dialog>` is closed, this function will be called\n * and the `<dialog>`'s `returnValue` will be passed.\n *\n * This can be used to determine which button was clicked to close the modal\n *\n * Note though that this value is only populated when using\n * `<form method='dialog'>`\n */\n onClose?: (returnValue: string) => void;\n };\n Blocks: {\n default: [\n {\n /**\n * Represents the open state of the `<dialog>` element.\n */\n isOpen: boolean;\n\n /**\n * Closes the `<dialog>` element\n * Will throw an error if `Dialog` is not rendered.\n */\n close: () => void;\n\n /**\n * Opens the `<dialog>` element.\n * Will throw an error if `Dialog` is not rendered.\n */\n open: () => void;\n\n /**\n * This modifier should be applied to the button that opens the Dialog so that it can be re-focused when the dialog closes.\n *\n * Example:\n *\n * ```gjs\n * <template>\n * <Modal as |m|>\n * <button {{m.focusOnClose}} {{on \"click\" m.open}}>Open</button>\n *\n * <m.Dialog>...</m.Dialog>\n * </Modal>\n * </template>\n * ```\n */\n focusOnClose: ModifierLike<{ Element: HTMLElement }>;\n\n /**\n * This is the `<dialog>` element (with some defaults pre-wired).\n * This is required to be rendered.\n */\n Dialog: WithBoundArgs<typeof DialogElement, \"onClose\" | \"register\" | \"open\">;\n },\n ];\n };\n}\n\nclass ModalDialog extends Component<Signature> {\n <template>\n {{yield\n (hash\n isOpen=this.isOpen\n open=this.open\n close=this.close\n focusOnClose=this.refocus\n Dialog=(component DialogElement open=@open onClose=this.handleClose register=this.register)\n )\n }}\n </template>\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n @localCopy(\"args.open\") declare _isOpen: boolean;\n\n get isOpen() {\n /**\n * Always fallback to false (closed)\n */\n return this._isOpen ?? false;\n }\n set isOpen(val: boolean) {\n this._isOpen = val;\n }\n\n #lastIsOpen = false;\n refocus = eModifier((element) => {\n assert(`focusOnClose is only valid on a HTMLElement`, element instanceof HTMLElement);\n\n if (!this.isOpen && this.#lastIsOpen) {\n element.focus();\n }\n\n this.#lastIsOpen = this.isOpen;\n });\n\n @tracked declare dialogElement: HTMLDialogElement | undefined;\n\n register = eModifier((element: HTMLDialogElement) => {\n /**\n * This is very sad.\n *\n * But we need the element to be 'root state'\n * so that when we read things like \"isOpen\",\n * when the dialog is finally rendered, all the\n * downstream properties render.\n *\n * This has to be an async / delayed a bit, so that\n * the tracking frame can exit, and we don't infinite loop\n */\n void (async () => {\n await Promise.resolve();\n\n this.dialogElement = element;\n })();\n });\n\n /**\n * Closes the dialog -- this will throw an error in development if the dialog element was not rendered\n */\n close = () => {\n assert(\n \"Cannot call `close` on <Dialog> without rendering the dialog element.\",\n this.dialogElement,\n );\n\n /**\n * If the element is already closed, don't run all this again\n */\n if (!this.dialogElement.hasAttribute(\"open\")) {\n return;\n }\n\n /**\n * removes the `open` attribute\n * handleClose will be called because the dialog has bound the `close` event.\n */\n this.dialogElement.close();\n };\n\n /**\n * @internal\n *\n * handles the <dialog> element's native close behavior.\n * listened to via addEventListener('close', ...);\n */\n handleClose = () => {\n assert(\n \"Cannot call `handleDialogClose` on <Dialog> without rendering the dialog element. This is likely a bug in ember-primitives. Please open an issue <3\",\n this.dialogElement,\n );\n\n this.isOpen = false;\n this.args.onClose?.(this.dialogElement.returnValue);\n // the return value ends up staying... which is annoying\n this.dialogElement.returnValue = \"\";\n };\n\n /**\n * Opens the dialog -- this will throw an error in development if the dialog element was not rendered\n */\n open = () => {\n assert(\n \"Cannot call `open` on <Dialog> without rendering the dialog element.\",\n this.dialogElement,\n );\n\n /**\n * If the element is already open, don't run all this again\n */\n if (this.dialogElement.hasAttribute(\"open\")) {\n return;\n }\n\n /**\n * adds the `open` attribute\n */\n this.dialogElement.showModal();\n this.isOpen = true;\n };\n}\n\nexport const Modal = ModalDialog;\nexport const Dialog = ModalDialog;\n\nexport default ModalDialog;\n"],"names":["DialogElement","setComponentTemplate","precompileTemplate","strictMode","scope","on","templateOnly","ModalDialog","Component","hash","g","prototype","localCopy","i","isOpen","_isOpen","val","refocus","eModifier","element","assert","HTMLElement","focus","tracked","register","Promise","resolve","dialogElement","close","hasAttribute","handleClose","args","onClose","returnValue","open","showModal","Modal","Dialog"],"mappings":"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"}
@@ -1,9 +1,8 @@
1
-
2
1
  import { precompileTemplate } from '@ember/template-compilation';
3
2
  import { setComponentTemplate } from '@ember/component';
4
3
  import templateOnly from '@ember/component/template-only';
5
4
 
6
- const ExternalLink = setComponentTemplate(precompileTemplate("\n <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"##missing##\" ...attributes>\n {{yield}}\n </a>\n", {
5
+ const ExternalLink = setComponentTemplate(precompileTemplate("<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"##missing##\" ...attributes>\n {{yield}}\n</a>", {
7
6
  strictMode: true
8
7
  }), templateOnly());
9
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"external-link.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"external-link.js","sources":["../../src/components/external-link.gts"],"sourcesContent":["import type { TOC } from \"@ember/component/template-only\";\n\nexport const ExternalLink: TOC<{\n Element: HTMLAnchorElement;\n Blocks: {\n default: [];\n };\n}> = <template>\n <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"##missing##\" ...attributes>\n {{yield}}\n </a>\n</template>;\n\nexport default ExternalLink;\n"],"names":["ExternalLink","setComponentTemplate","precompileTemplate","strictMode","templateOnly"],"mappings":";;;;MAEaA,YAKR,GAAAC,oBAAA,CAAAC,kBAAA,CAAA,yGAAA,EAIL;EAAAC,UAAA,EAAA;AAAU,CAAA,CAAA,EAAAC,YAAA,EAAA;;;;"}
@@ -1,4 +1,3 @@
1
-
2
1
  import { fn } from '@ember/helper';
3
2
  import { on } from '@ember/modifier';
4
3
  import { dataFrom } from 'form-data-utils';
@@ -15,7 +14,7 @@ const handleSubmit = (onChange, event) => {
15
14
  event.preventDefault();
16
15
  handleInput(onChange, event, "submit");
17
16
  };
18
- const Form = setComponentTemplate(precompileTemplate("\n <form {{on \"input\" (fn handleInput @onChange)}} {{on \"submit\" (fn handleSubmit @onChange)}} ...attributes>\n {{yield}}\n </form>\n", {
17
+ const Form = setComponentTemplate(precompileTemplate("<form {{on \"input\" (fn handleInput @onChange)}} {{on \"submit\" (fn handleSubmit @onChange)}} ...attributes>\n {{yield}}\n</form>", {
19
18
  strictMode: true,
20
19
  scope: () => ({
21
20
  on,
@@ -1 +1 @@
1
- {"version":3,"file":"form.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"form.js","sources":["../../src/components/form.gts"],"sourcesContent":["import { fn } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\n\nimport { dataFrom } from \"form-data-utils\";\n\nimport type { TOC } from \"@ember/component/template-only\";\n\ntype Data = ReturnType<typeof dataFrom>;\n\nexport const dataFromEvent = dataFrom;\n\nconst handleInput = (\n onChange: (data: Data, eventType: \"input\" | \"submit\", event: Event) => void,\n event: Event | SubmitEvent,\n eventType: \"input\" | \"submit\" = \"input\",\n) => {\n const data = dataFrom(event);\n\n onChange(data, eventType, event);\n};\n\nconst handleSubmit = (\n onChange: (data: Data, eventType: \"input\" | \"submit\", event: Event | SubmitEvent) => void,\n event: SubmitEvent,\n) => {\n event.preventDefault();\n handleInput(onChange, event, \"submit\");\n};\n\nexport interface Signature {\n Element: HTMLFormElement;\n Args: {\n /**\n * Any time the value of any field is changed this function will be called.\n */\n onChange: (\n /**\n * The data from the form as an Object of `{ [field name] => value }` pairs.\n * This is generated from the native [FormData](https://developer.mozilla.org/en-US/docs/Web/API/FormData)\n *\n * Additional fields/inputs/controls can be added to this data by specifying a\n * \"name\" attribute.\n */\n data: Data,\n /**\n * Indicates whether the `onChange` function was called from the `input` or `submit` event handlers.\n */\n eventType: \"input\" | \"submit\",\n /**\n * The raw event, if needed.\n */\n event: Event | SubmitEvent,\n ) => void;\n };\n Blocks: {\n /**\n * The main content for the form. This is where inputs / fields / controls would go.\n * Within the `<form>` content, `<button type=\"submit\">` will submit the form, which\n * triggers the `@onChange` event.\n */\n default: [];\n };\n}\n\nexport const Form: TOC<Signature> = <template>\n <form\n {{on \"input\" (fn handleInput @onChange)}}\n {{on \"submit\" (fn handleSubmit @onChange)}}\n ...attributes\n >\n {{yield}}\n </form>\n</template>;\n\nexport default Form;\n"],"names":["dataFromEvent","dataFrom","handleInput","onChange","event","eventType","data","handleSubmit","preventDefault","Form","setComponentTemplate","precompileTemplate","strictMode","scope","on","fn","templateOnly"],"mappings":";;;;;;;AASO,MAAMA,gBAAgBC;AAE7B,MAAMC,cAAcA,CAClBC,QAA2E,EAC3EC,OACAC,YAAgC,OAAO,KAAA;AAEvC,EAAA,MAAMC,OAAOL,QAAA,CAASG,KAAA,CAAA;AAEtBD,EAAAA,QAAA,CAASG,MAAMD,SAAA,EAAWD,KAAA,CAAA;AAC5B,CAAA;AAEA,MAAMG,YAAA,GAAeA,CACnBJ,QAAyF,EACzFC,KAAO,KAAA;EAEPA,KAAA,CAAMI,cAAc,EAAA;AACpBN,EAAAA,WAAA,CAAYC,UAAUC,KAAA,EAAO,QAAA,CAAA;AAC/B,CAAA;MAqCaK,IAAU,GAAAC,oBAAA,CAAaC,kBAAA,CAAA,sIAAA,EAQpC;EAAAC,UAAA,EAAA,IAAA;AAAAC,EAAAA,KAAA,EAAAA,OAAA;IAAAC,EAAA;IAAAC,EAAA;IAAAb,WAAA;AAAAK,IAAAA;AAAA,GAAA;AAAU,CAAA,CAAA,EAAAS,YAAA,EAAA;;;;"}
@@ -1,4 +1,3 @@
1
-
2
1
  import Component from '@glimmer/component';
3
2
  import { element } from 'ember-element-helper';
4
3
  import { getSectionHeadingLevel } from 'which-heading-do-i-need';
@@ -18,7 +17,7 @@ class Heading extends Component {
18
17
  return `h${this.level}`;
19
18
  }
20
19
  static {
21
- setComponentTemplate(precompileTemplate("\n {{this.headingScopeAnchor}}\n\n {{#let (element this.hLevel) as |El|}}\n <El ...attributes>\n {{yield}}\n </El>\n {{/let}}\n ", {
20
+ setComponentTemplate(precompileTemplate("{{this.headingScopeAnchor}}\n\n{{#let (element this.hLevel) as |El|}}\n <El ...attributes>\n {{yield}}\n </El>\n{{/let}}", {
22
21
  strictMode: true,
23
22
  scope: () => ({
24
23
  element
@@ -1 +1 @@
1
- {"version":3,"file":"heading.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"heading.js","sources":["../../src/components/heading.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\n\nimport { element } from \"ember-element-helper\";\nimport { getSectionHeadingLevel } from \"which-heading-do-i-need\";\n\nimport type Owner from \"@ember/owner\";\n\nexport class Heading extends Component<{\n Element: HTMLElement;\n Blocks: { default: [] };\n}> {\n headingScopeAnchor: Text;\n constructor(owner: Owner, args: object) {\n super(owner, args);\n\n this.headingScopeAnchor = document.createTextNode(\"\");\n }\n\n get level() {\n return getSectionHeadingLevel(this.headingScopeAnchor);\n }\n\n get hLevel() {\n return `h${this.level}`;\n }\n\n <template>\n {{this.headingScopeAnchor}}\n\n {{#let (element this.hLevel) as |El|}}\n <El ...attributes>\n {{yield}}\n </El>\n {{/let}}\n </template>\n}\n"],"names":["Heading","Component","headingScopeAnchor","constructor","owner","args","document","createTextNode","level","getSectionHeadingLevel","hLevel","setComponentTemplate","precompileTemplate","strictMode","scope","element"],"mappings":";;;;;;AAOO,MAAMA,OAAA,SAAgBC,SAAA;EAI3BC,kBAAA;AACAC,EAAAA,WAAAA,CAAYC,KAAY,EAAEC,IAAY,EAAE;AACtC,IAAA,KAAK,CAACD,KAAA,EAAOC,IAAA,CAAA;IAEb,IAAI,CAACH,kBAAkB,GAAGI,QAAA,CAASC,cAAc,CAAC,EAAA,CAAA;AACpD,EAAA;EAEA,IAAIC,KAAAA,GAAQ;AACV,IAAA,OAAOC,sBAAA,CAAuB,IAAI,CAACP,kBAAkB,CAAA;AACvD,EAAA;EAEA,IAAIQ,MAAAA,GAAS;AACX,IAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAACF,KAAK,CAAA,CAAE;AACzB,EAAA;AAEA,EAAA;IAAAG,oBAAA,CAAAC,kBAAA,CAAA,+HAAA,EAQA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"}
@@ -1,4 +1,3 @@
1
-
2
1
  import { precompileTemplate } from '@ember/template-compilation';
3
2
  import { setComponentTemplate } from '@ember/component';
4
3
  import templateOnly from '@ember/component/template-only';
@@ -18,7 +17,7 @@ function getKeys(keys, mac) {
18
17
  const normalMac = Array.isArray(mac) ? mac : split(mac);
19
18
  return isMac ? normalMac : normalKeys;
20
19
  }
21
- const KeyCombo = setComponentTemplate(precompileTemplate("\n <span class=\"ember-primitives__key-combination\" ...attributes>\n {{#let (getKeys @keys @mac) as |keys|}}\n {{#each keys as |key i|}}\n <Key>{{key}}</Key>\n {{#if (isNotLast keys i)}}\n <span class=\"ember-primitives__key-combination__separator\">+</span>\n {{/if}}\n {{/each}}\n {{/let}}\n </span>\n", {
20
+ const KeyCombo = setComponentTemplate(precompileTemplate("<span class=\"ember-primitives__key-combination\" ...attributes>\n {{#let (getKeys @keys @mac) as |keys|}}\n {{#each keys as |key i|}}\n <Key>{{key}}</Key>\n {{#if (isNotLast keys i)}}\n <span class=\"ember-primitives__key-combination__separator\">+</span>\n {{/if}}\n {{/each}}\n {{/let}}\n</span>", {
22
21
  strictMode: true,
23
22
  scope: () => ({
24
23
  getKeys,
@@ -26,7 +25,7 @@ const KeyCombo = setComponentTemplate(precompileTemplate("\n <span class=\"embe
26
25
  isNotLast
27
26
  })
28
27
  }), templateOnly());
29
- const Key = setComponentTemplate(precompileTemplate("\n <kbd class=\"ember-primitives__key\" ...attributes>{{yield}}</kbd>\n", {
28
+ const Key = setComponentTemplate(precompileTemplate("<kbd class=\"ember-primitives__key\" ...attributes>{{yield}}</kbd>", {
30
29
  strictMode: true
31
30
  }), templateOnly());
32
31
 
@@ -1 +1 @@
1
- {"version":3,"file":"keys.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"keys.js","sources":["../../src/components/keys.gts"],"sourcesContent":["import type { TOC } from \"@ember/component/template-only\";\n\nconst isLast = (collection: unknown[], index: number) => index === collection.length - 1;\nconst isNotLast = (collection: unknown[], index: number) => !isLast(collection, index);\nconst isMac = navigator.userAgent.indexOf(\"Mac OS\") >= 0;\n\nfunction split(str: string) {\n const keys = str.split(\"+\").map((x) => x.trim());\n\n return keys;\n}\n\nfunction getKeys(keys: string[] | string, mac?: string[] | string) {\n const normalKeys = Array.isArray(keys) ? keys : split(keys);\n\n if (!mac) {\n return normalKeys;\n }\n\n const normalMac = Array.isArray(mac) ? mac : split(mac);\n\n return isMac ? normalMac : normalKeys;\n}\n\nexport interface KeyComboSignature {\n Element: HTMLElement;\n Args: {\n keys: string[] | string;\n mac?: string[] | string;\n };\n}\n\nexport const KeyCombo: TOC<KeyComboSignature> = <template>\n <span class=\"ember-primitives__key-combination\" ...attributes>\n {{#let (getKeys @keys @mac) as |keys|}}\n {{#each keys as |key i|}}\n <Key>{{key}}</Key>\n {{#if (isNotLast keys i)}}\n <span class=\"ember-primitives__key-combination__separator\">+</span>\n {{/if}}\n {{/each}}\n {{/let}}\n </span>\n</template>;\n\nexport interface KeySignature {\n Element: HTMLElement;\n Blocks: { default?: [] };\n}\n\nexport const Key: TOC<KeySignature> = <template>\n <kbd class=\"ember-primitives__key\" ...attributes>{{yield}}</kbd>\n</template>;\n"],"names":["isLast","collection","index","length","isNotLast","isMac","navigator","userAgent","indexOf","split","str","keys","map","x","trim","getKeys","mac","normalKeys","Array","isArray","normalMac","KeyCombo","setComponentTemplate","precompileTemplate","strictMode","scope","Key","templateOnly"],"mappings":";;;;AAEA,MAAMA,MAAA,GAASA,CAACC,UAAmB,EAAIC,KAAa,KAAKA,KAAA,KAAUD,UAAA,CAAWE,MAAM,GAAG,CAAA;AACvF,MAAMC,SAAA,GAAYA,CAACH,UAAmB,EAAIC,KAAa,KAAK,CAACF,MAAA,CAAOC,UAAA,EAAYC,KAAA,CAAA;AAChF,MAAMG,QAAQC,SAAA,CAAUC,SAAS,CAACC,OAAO,CAAC,QAAA,CAAA,IAAa,CAAA;AAEvD,SAASC,KAAAA,CAAMC,GAAW,EAAA;AACxB,EAAA,MAAMC,IAAA,GAAOD,GAAA,CAAID,KAAK,CAAC,GAAA,CAAA,CAAKG,GAAG,CAAEC,CAAA,IAAMA,CAAA,CAAEC,IAAI,EAAA,CAAA;AAE7C,EAAA,OAAOH,IAAA;AACT;AAEA,SAASI,OAAAA,CAAQJ,IAAuB,EAAEK,GAAuB,EAAA;AAC/D,EAAA,MAAMC,aAAaC,KAAA,CAAMC,OAAO,CAACR,IAAA,CAAA,GAAQA,OAAOF,KAAA,CAAME,IAAA,CAAA;EAEtD,IAAI,CAACK,GAAA,EAAK;AACR,IAAA,OAAOC,UAAA;AACT,EAAA;AAEA,EAAA,MAAMG,YAAYF,KAAA,CAAMC,OAAO,CAACH,GAAA,CAAA,GAAOA,MAAMP,KAAA,CAAMO,GAAA,CAAA;AAEnD,EAAA,OAAOX,QAAQe,SAAA,GAAYH,UAAA;AAC7B;MAUaI,QAAc,GAAAC,oBAAA,CAAqBC,kBAAA,CAAA,0UAAA,EAWhD;EAAAC,UAAA,EAAA,IAAA;AAAAC,EAAAA,KAAA,EAAAA,OAAA;IAAAV,OAAA;IAAAW,GAAA;AAAAtB,IAAAA;AAAA,GAAA;AAAU,CAAA,CAAA,EAAAuB,YAAA,EAAA;MAOGD,GAAS,GAAAJ,oBAAA,CAAgBC,kBAAA,CAAA,oEAAA,EAEtC;EAAAC,UAAA,EAAA;AAAU,CAAA,CAAA,EAAAG,YAAA,EAAA;;;;"}
@@ -5,7 +5,7 @@ import templateOnly from '@ember/component/template-only';
5
5
 
6
6
  ;
7
7
 
8
- const Hero = setComponentTemplate(precompileTemplate("\n <div class=\"ember-primitives__hero__wrapper\" ...attributes>\n {{yield}}\n </div>\n", {
8
+ const Hero = setComponentTemplate(precompileTemplate("<div class=\"ember-primitives__hero__wrapper\" ...attributes>\n {{yield}}\n</div>", {
9
9
  strictMode: true
10
10
  }), templateOnly());
11
11
 
@@ -5,7 +5,7 @@ import templateOnly from '@ember/component/template-only';
5
5
 
6
6
  ;
7
7
 
8
- const StickyFooter = setComponentTemplate(precompileTemplate("\n <div class=\"ember-primitives__sticky-footer__wrapper\" ...attributes>\n <div class=\"ember-primitives__sticky-footer__container\">\n <div class=\"ember-primitives__sticky-footer__content\">\n {{yield to=\"content\"}}\n </div>\n <div class=\"ember-primitives__sticky-footer__footer\">\n {{yield to=\"footer\"}}\n </div>\n </div>\n </div>\n", {
8
+ const StickyFooter = setComponentTemplate(precompileTemplate("<div class=\"ember-primitives__sticky-footer__wrapper\" ...attributes>\n <div class=\"ember-primitives__sticky-footer__container\">\n <div class=\"ember-primitives__sticky-footer__content\">\n {{yield to=\"content\"}}\n </div>\n <div class=\"ember-primitives__sticky-footer__footer\">\n {{yield to=\"footer\"}}\n </div>\n </div>\n</div>", {
9
9
  strictMode: true
10
10
  }), templateOnly());
11
11
 
@@ -1,4 +1,3 @@
1
-
2
1
  import { hash } from '@ember/helper';
3
2
  import { on } from '@ember/modifier';
4
3
  import { link } from '../helpers/link.js';
@@ -19,7 +18,7 @@ import templateOnly from '@ember/component/template-only';
19
18
  *
20
19
  * [mdn-a]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a
21
20
  */
22
- const Link = setComponentTemplate(precompileTemplate("\n {{#let (link @href includeActiveQueryParams=@includeActiveQueryParams activeOnSubPaths=@activeOnSubPaths) as |l|}}\n {{#if l.isExternal}}\n <ExternalLink href={{@href}} ...attributes>\n {{yield (hash isExternal=true isActive=false)}}\n </ExternalLink>\n {{else}}\n <a data-active={{l.isActive}} href={{if @href @href \"##missing##\"}} {{on \"click\" l.handleClick}} ...attributes>\n {{yield (hash isExternal=false isActive=l.isActive)}}\n </a>\n {{/if}}\n {{/let}}\n", {
21
+ const Link = setComponentTemplate(precompileTemplate("{{#let (link @href includeActiveQueryParams=@includeActiveQueryParams activeOnSubPaths=@activeOnSubPaths) as |l|}}\n {{#if l.isExternal}}\n <ExternalLink href={{@href}} ...attributes>\n {{yield (hash isExternal=true isActive=false)}}\n </ExternalLink>\n {{else}}\n <a data-active={{l.isActive}} href={{if @href @href \"##missing##\"}} {{on \"click\" l.handleClick}} ...attributes>\n {{yield (hash isExternal=false isActive=l.isActive)}}\n </a>\n {{/if}}\n{{/let}}", {
23
22
  strictMode: true,
24
23
  scope: () => ({
25
24
  link,
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"link.js","sources":["../../src/components/link.gts"],"sourcesContent":["/**\n * TODO: make template-only component,\n * and use class-based modifier?\n *\n * This would require that modifiers could run pre-render\n */\nimport { hash } from '@ember/helper';\nimport { on } from '@ember/modifier';\n\nimport { link } from '../helpers/link.ts';\nimport { ExternalLink } from './external-link.gts';\n\nimport type { TOC } from '@ember/component/template-only';\n\nexport interface Signature {\n Element: HTMLAnchorElement;\n Args: {\n /**\n * the `href` string value to set on the anchor element.\n */\n href: string;\n /**\n * When calculating the \"active\" state of the link, you may decide\n * whether or not you want to _require_ that all query params be considered (true)\n * or specify individual query params, ignoring anything not specified.\n *\n * For example:\n *\n * ```gjs live preview\n * import { Link } from 'ember-primitives';\n *\n * <template>\n * <Link @href=\"/\" @includeActiveQueryParams={{true}} as |a|>\n * ...\n * </Link>\n * </template>\n * ```\n *\n * the data-active state here will only be \"true\" on\n * - `/`\n * - `/?foo=2`\n * - `/?foo=&bar=`\n *\n */\n includeActiveQueryParams?: true | string[];\n /**\n * When calculating the \"active\" state of the link, you may decide\n * whether or not you want to consider sub paths to be active when\n * child routes/urls are active.\n *\n * For example:\n *\n * ```gjs live preview\n * import { Link } from 'ember-primitives';\n *\n * <template>\n * <Link @href=\"/forum/1\" @activeOnSubPaths={{true}} as |a|>\n * ...\n * </Link>\n * </template>\n * ```\n *\n * the data-active state here will be \"true\" on\n * - `/forum/1`\n * - `/forum/1/posts`\n * - `/forum/1/posts/comments`\n * - `/forum/1/*etc*`\n *\n * if `@activeOnSubPaths` is set to false or left off\n * the data-active state here will only be \"true\" on\n * - `/forum/1`\n *\n */\n activeOnSubPaths?: true;\n };\n Blocks: {\n default: [\n {\n /**\n * Indicates if the passed `href` is pointing to an external site.\n * Useful if you want your links to have additional context for when\n * a user is about to leave your site.\n *\n * For example:\n *\n * ```gjs live preview\n * import { Link } from 'ember-primitives';\n *\n * const MyLink = <template>\n * <Link @href={{@href}} as |a|>\n * {{yield}}\n * {{#if a.isExternal}}\n * ➚\n * {{/if}}\n * </Link>\n * </template>;\n *\n * <template>\n * <MyLink @href=\"https://developer.mozilla.org\">MDN</MyLink> &nbsp;&nbsp;\n * <MyLink @href=\"/\">Home</MyLink>\n * </template>\n * ```\n */\n isExternal: boolean;\n /**\n * Indicates if the passed `href` is *active*, or the user is on the same basepath.\n * This allows consumers to style their link if they wish or style their text.\n * The active state will also be present on a `data-active` attribute on the generated anchor tag.\n *\n *\n * For example\n * ```gjs\n * import { Link, service } from 'ember-primitives';\n *\n * const MyLink = <template>\n * <Link @href=\"...\"> as |a|>\n * <span class=\"{{if a.isActive 'underline'}}\">\n * {{yield}}\n * </span>\n * </Link>\n * </template>\n *\n * <template>\n * {{#let (service 'router') as |router|}}\n * <MyLink @href={{router.currentURL}}>Ths page</MyLink> &nbsp;&nbsp;\n * <MyLink @href=\"/\">Home</MyLink>\n * {{/let}}\n * </template>\n * ```\n *\n * By default, the query params are omitted from `isActive` calculation, but you may\n * configure the query params to be included if you wish\n * See: `@includeActiveQueryParams`\n *\n * By default, only the exact route/url is considered for the `isActive` calculation,\n * but you may configure sub routes/paths to also be considered active\n * See: `@activeOnSubPaths`\n *\n * Note that external links are never active.\n */\n isActive: boolean;\n },\n ];\n };\n}\n\n/**\n * A light wrapper around the [Anchor element][mdn-a], which will appropriately make your link an external link if the passed `@href` is not on the same domain.\n *\n *\n * [mdn-a]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a\n */\nexport const Link: TOC<Signature> = <template>\n {{#let (link @href includeActiveQueryParams=@includeActiveQueryParams activeOnSubPaths=@activeOnSubPaths) as |l|}}\n {{#if l.isExternal}}\n <ExternalLink href={{@href}} ...attributes>\n {{yield (hash isExternal=true isActive=false)}}\n </ExternalLink>\n {{else}}\n <a\n data-active={{l.isActive}}\n href={{if @href @href \"##missing##\"}}\n {{on \"click\" l.handleClick}}\n ...attributes\n >\n {{yield (hash isExternal=false isActive=l.isActive)}}\n </a>\n {{/if}}\n {{/let}}\n</template>;\n\nexport default Link;\n"],"names":["Link","setComponentTemplate","precompileTemplate","strictMode","scope","link","ExternalLink","hash","on","templateOnly"],"mappings":";;;;;;;;AAAA;;;;;AAKC;AA6ID;;;;;AAKC;MACYA,IAAU,GAAAC,oBAAA,CAAaC,kBAAA,CAAA,0eAAA,EAiBpC;EAAAC,UAAA,EAAA,IAAA;AAAAC,EAAAA,KAAA,EAAAA,OAAA;IAAAC,IAAA;IAAAC,YAAA;IAAAC,IAAA;AAAAC,IAAAA;AAAA,GAAA;AAAU,CAAA,CAAA,EAAAC,YAAA,EAAA;;;;"}
@@ -1,4 +1,3 @@
1
-
2
1
  import Component from '@glimmer/component';
3
2
  import { hash } from '@ember/helper';
4
3
  import { on } from '@ember/modifier';
@@ -22,7 +21,7 @@ const TABSTER_CONFIG_CONTENT = getTabsterAttribute({
22
21
  const TABSTER_CONFIG_TRIGGER = {
23
22
  deloser: {}
24
23
  };
25
- const Separator = setComponentTemplate(precompileTemplate("\n <div role=\"separator\" ...attributes>\n {{yield}}\n </div>\n", {
24
+ const Separator = setComponentTemplate(precompileTemplate("<div role=\"separator\" ...attributes>\n {{yield}}\n</div>", {
26
25
  strictMode: true
27
26
  }), templateOnly());
28
27
  /**
@@ -42,14 +41,14 @@ function focusOnHover(e) {
42
41
  item?.focus();
43
42
  }
44
43
  }
45
- const Item = setComponentTemplate(precompileTemplate("\n {{!-- @glint-expect-error --}}\n {{#let (if @onSelect (modifier on \"click\" @onSelect)) as |maybeClick|}}\n <button type=\"button\" role=\"menuitem\" {{!-- @glint-expect-error --}} {{maybeClick}} {{on \"click\" @toggle}} {{on \"pointermove\" focusOnHover}} ...attributes>\n {{yield}}\n </button>\n {{/let}}\n", {
44
+ const Item = setComponentTemplate(precompileTemplate("{{!-- @glint-expect-error --}}\n{{#let (if @onSelect (modifier on \"click\" @onSelect)) as |maybeClick|}}\n <button type=\"button\" role=\"menuitem\" {{!-- @glint-expect-error --}} {{maybeClick}} {{on \"click\" @toggle}} {{on \"pointermove\" focusOnHover}} ...attributes>\n {{yield}}\n </button>\n{{/let}}", {
46
45
  strictMode: true,
47
46
  scope: () => ({
48
47
  on,
49
48
  focusOnHover
50
49
  })
51
50
  }), templateOnly());
52
- const LinkItem = setComponentTemplate(precompileTemplate("\n <Link role=\"menuitem\" @href={{@href}} @includeActiveQueryParams={{@includeActiveQueryParams}} @activeOnSubPaths={{@activeOnSubPaths}} {{on \"click\" @toggle}} {{on \"pointermove\" focusOnHover}} ...attributes>\n {{yield}}\n </Link>\n", {
51
+ const LinkItem = setComponentTemplate(precompileTemplate("<Link role=\"menuitem\" @href={{@href}} @includeActiveQueryParams={{@includeActiveQueryParams}} @activeOnSubPaths={{@activeOnSubPaths}} {{on \"click\" @toggle}} {{on \"pointermove\" focusOnHover}} ...attributes>\n {{yield}}\n</Link>", {
53
52
  strictMode: true,
54
53
  scope: () => ({
55
54
  Link,
@@ -86,7 +85,7 @@ const installContent = modifier((element, _, {
86
85
  document.removeEventListener("keydown", onDocumentKeydown);
87
86
  };
88
87
  });
89
- const Content = setComponentTemplate(precompileTemplate("\n {{#if @isOpen.current}}\n <@PopoverContent id={{@contentId}} role=\"menu\" data-tabster={{TABSTER_CONFIG_CONTENT}} tabindex=\"0\" {{installContent isOpen=@isOpen triggerElement=@triggerElement}} ...attributes>\n {{yield (hash Item=(component Item toggle=@isOpen.toggle) LinkItem=(component LinkItem toggle=@isOpen.toggle) Separator=Separator)}}\n </@PopoverContent>\n {{/if}}\n", {
88
+ const Content = setComponentTemplate(precompileTemplate("{{#if @isOpen.current}}\n <@PopoverContent id={{@contentId}} role=\"menu\" data-tabster={{TABSTER_CONFIG_CONTENT}} tabindex=\"0\" {{installContent isOpen=@isOpen triggerElement=@triggerElement}} ...attributes>\n {{yield (hash Item=(component Item toggle=@isOpen.toggle) LinkItem=(component LinkItem toggle=@isOpen.toggle) Separator=Separator)}}\n </@PopoverContent>\n{{/if}}", {
90
89
  strictMode: true,
91
90
  scope: () => ({
92
91
  TABSTER_CONFIG_CONTENT,
@@ -125,13 +124,12 @@ const trigger = modifier((element, _, {
125
124
  };
126
125
  element.addEventListener("click", onTriggerClick);
127
126
  triggerElement.current = element;
128
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
129
127
  setReference(element);
130
128
  return () => {
131
129
  element.removeEventListener("click", onTriggerClick);
132
130
  };
133
131
  });
134
- const Trigger = setComponentTemplate(precompileTemplate("\n <button type=\"button\" {{@triggerModifier stopPropagation=@stopPropagation preventDefault=@preventDefault}} ...attributes>\n {{yield}}\n </button>\n", {
132
+ const Trigger = setComponentTemplate(precompileTemplate("<button type=\"button\" {{@triggerModifier stopPropagation=@stopPropagation preventDefault=@preventDefault}} ...attributes>\n {{yield}}\n</button>", {
135
133
  strictMode: true
136
134
  }), templateOnly());
137
135
  const IsOpen = () => cell(false);
@@ -139,7 +137,7 @@ const TriggerElement = () => cell();
139
137
  class Menu extends Component {
140
138
  contentId = guidFor(this);
141
139
  static {
142
- setComponentTemplate(precompileTemplate("\n {{#let (IsOpen) (TriggerElement) as |isOpen triggerEl|}}\n <Popover @flipOptions={{@flipOptions}} @middleware={{@middleware}} @offsetOptions={{@offsetOptions}} @placement={{@placement}} @shiftOptions={{@shiftOptions}} @strategy={{@strategy}} @inline={{@inline}} as |p|>\n {{#let (modifier trigger triggerElement=triggerEl isOpen=isOpen contentId=this.contentId setReference=p.setReference) as |triggerModifier|}}\n {{yield (hash trigger=triggerModifier Trigger=(component Trigger triggerModifier=triggerModifier) Content=(component Content PopoverContent=p.Content isOpen=isOpen triggerElement=triggerEl contentId=this.contentId) arrow=p.arrow isOpen=isOpen.current)}}\n {{/let}}\n </Popover>\n {{/let}}\n ", {
140
+ setComponentTemplate(precompileTemplate("{{#let (IsOpen) (TriggerElement) as |isOpen triggerEl|}}\n <Popover @flipOptions={{@flipOptions}} @middleware={{@middleware}} @offsetOptions={{@offsetOptions}} @placement={{@placement}} @shiftOptions={{@shiftOptions}} @strategy={{@strategy}} @inline={{@inline}} as |p|>\n {{#let (modifier trigger triggerElement=triggerEl isOpen=isOpen contentId=this.contentId setReference=p.setReference) as |triggerModifier|}}\n {{yield (hash trigger=triggerModifier Trigger=(component Trigger triggerModifier=triggerModifier) Content=(component Content PopoverContent=p.Content isOpen=isOpen triggerElement=triggerEl contentId=this.contentId) arrow=p.arrow isOpen=isOpen.current)}}\n {{/let}}\n </Popover>\n{{/let}}", {
143
141
  strictMode: true,
144
142
  scope: () => ({
145
143
  IsOpen,
@@ -1 +1 @@
1
- {"version":3,"file":"menu.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"menu.js","sources":["../../src/components/menu.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\nimport { hash } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { guidFor } from \"@ember/object/internals\";\n\nimport { modifier as eModifier } from \"ember-modifier\";\nimport { cell } from \"ember-resources\";\nimport { getTabster, getTabsterAttribute, MoverDirections, setTabsterAttribute } from \"tabster\";\n\nimport { Link, type Signature as LinkSignature } from \"./link.gts\";\nimport { Popover, type Signature as PopoverSignature } from \"./popover.gts\";\n\nimport type { TOC } from \"@ember/component/template-only\";\nimport type { WithBoundArgs } from \"@glint/template\";\n\ntype Cell<V> = ReturnType<typeof cell<V>>;\ntype LinkArgs = LinkSignature[\"Args\"];\ntype PopoverArgs = PopoverSignature[\"Args\"];\ntype PopoverBlockParams = PopoverSignature[\"Blocks\"][\"default\"][0];\n\nconst TABSTER_CONFIG_CONTENT = getTabsterAttribute(\n {\n mover: {\n direction: MoverDirections.Both,\n cyclic: true,\n },\n deloser: {},\n },\n true,\n);\n\nconst TABSTER_CONFIG_TRIGGER = {\n deloser: {},\n};\n\nexport interface Signature {\n Args: PopoverArgs;\n Blocks: {\n default: [\n {\n arrow: PopoverBlockParams[\"arrow\"];\n trigger: WithBoundArgs<\n typeof trigger,\n \"triggerElement\" | \"contentId\" | \"isOpen\" | \"setReference\"\n >;\n Trigger: WithBoundArgs<typeof Trigger, \"triggerModifier\">;\n Content: WithBoundArgs<\n typeof Content,\n \"triggerElement\" | \"contentId\" | \"isOpen\" | \"PopoverContent\"\n >;\n isOpen: boolean;\n },\n ];\n };\n}\n\nexport interface SeparatorSignature {\n Element: HTMLDivElement;\n Blocks: { default: [] };\n}\n\nconst Separator: TOC<SeparatorSignature> = <template>\n <div role=\"separator\" ...attributes>\n {{yield}}\n </div>\n</template>;\n\n/**\n * We focus items on `pointerMove` to achieve the following:\n *\n * - Mouse over an item (it focuses)\n * - Leave mouse where it is and use keyboard to focus a different item\n * - Wiggle mouse without it leaving previously focused item\n * - Previously focused item should re-focus\n *\n * If we used `mouseOver`/`mouseEnter` it would not re-focus when the mouse\n * wiggles. This is to match native menu implementation.\n */\nfunction focusOnHover(e: PointerEvent) {\n const item = e.currentTarget;\n\n if (item instanceof HTMLElement) {\n item?.focus();\n }\n}\n\ninterface PrivateItemSignature {\n Element: HTMLButtonElement;\n Args: { onSelect?: (event: Event) => void; toggle: () => void };\n Blocks: { default: [] };\n}\n\nexport interface ItemSignature {\n Element: PrivateItemSignature[\"Element\"];\n Args: Omit<PrivateItemSignature[\"Args\"], \"toggle\">;\n Blocks: PrivateItemSignature[\"Blocks\"];\n}\n\nconst Item: TOC<PrivateItemSignature> = <template>\n {{! @glint-expect-error }}\n {{#let (if @onSelect (modifier on \"click\" @onSelect)) as |maybeClick|}}\n <button\n type=\"button\"\n role=\"menuitem\"\n {{! @glint-expect-error }}\n {{maybeClick}}\n {{on \"click\" @toggle}}\n {{on \"pointermove\" focusOnHover}}\n ...attributes\n >\n {{yield}}\n </button>\n {{/let}}\n</template>;\n\ninterface LinkItemArgs extends LinkArgs {\n toggle: () => void;\n}\n\ninterface PrivateLinkItemSignature {\n Element: HTMLAnchorElement;\n Args: LinkItemArgs;\n Blocks: { default: [] };\n}\n\nexport interface LinkItemSignature {\n Element: PrivateLinkItemSignature[\"Element\"];\n Args: LinkArgs;\n Blocks: PrivateLinkItemSignature[\"Blocks\"];\n}\n\nconst LinkItem: TOC<PrivateLinkItemSignature> = <template>\n <Link\n role=\"menuitem\"\n @href={{@href}}\n @includeActiveQueryParams={{@includeActiveQueryParams}}\n @activeOnSubPaths={{@activeOnSubPaths}}\n {{on \"click\" @toggle}}\n {{on \"pointermove\" focusOnHover}}\n ...attributes\n >\n {{yield}}\n </Link>\n</template>;\n\nconst installContent = eModifier<{\n Element: HTMLElement;\n Args: {\n Named: {\n isOpen: Cell<boolean>;\n triggerElement: Cell<HTMLElement>;\n };\n };\n}>((element, _: [], { isOpen, triggerElement }) => {\n // focus first focusable element on the content\n const tabster = getTabster(window);\n const firstFocusable = tabster?.focusable.findFirst({\n container: element,\n });\n\n firstFocusable?.focus();\n\n // listen for \"outside\" clicks\n function onDocumentClick(e: MouseEvent) {\n if (\n isOpen.current &&\n e.target &&\n !element.contains(e.target as HTMLElement) &&\n !triggerElement.current?.contains(e.target as HTMLElement)\n ) {\n isOpen.current = false;\n }\n }\n\n // listen for the escape key\n function onDocumentKeydown(e: KeyboardEvent) {\n if (isOpen.current && e.key === \"Escape\") {\n isOpen.current = false;\n }\n }\n\n document.addEventListener(\"click\", onDocumentClick);\n document.addEventListener(\"keydown\", onDocumentKeydown);\n\n return () => {\n document.removeEventListener(\"click\", onDocumentClick);\n document.removeEventListener(\"keydown\", onDocumentKeydown);\n };\n});\n\ninterface PrivateContentSignature {\n Element: HTMLDivElement;\n Args: {\n triggerElement: Cell<HTMLElement>;\n contentId: string;\n isOpen: Cell<boolean>;\n PopoverContent: PopoverBlockParams[\"Content\"];\n };\n Blocks: {\n default: [\n {\n Item: WithBoundArgs<typeof Item, \"toggle\">;\n LinkItem: WithBoundArgs<typeof LinkItem, \"toggle\">;\n Separator: typeof Separator;\n },\n ];\n };\n}\n\nexport interface ContentSignature {\n Element: PrivateContentSignature[\"Element\"];\n Blocks: PrivateContentSignature[\"Blocks\"];\n}\n\nconst Content: TOC<PrivateContentSignature> = <template>\n {{#if @isOpen.current}}\n <@PopoverContent\n id={{@contentId}}\n role=\"menu\"\n data-tabster={{TABSTER_CONFIG_CONTENT}}\n tabindex=\"0\"\n {{installContent isOpen=@isOpen triggerElement=@triggerElement}}\n ...attributes\n >\n {{yield\n (hash\n Item=(component Item toggle=@isOpen.toggle)\n LinkItem=(component LinkItem toggle=@isOpen.toggle)\n Separator=Separator\n )\n }}\n </@PopoverContent>\n {{/if}}\n</template>;\n\ninterface PrivateTriggerModifierSignature {\n Element: HTMLElement;\n Args: {\n Named: {\n triggerElement: Cell<HTMLElement>;\n isOpen: Cell<boolean>;\n contentId: string;\n setReference: PopoverBlockParams[\"setReference\"];\n stopPropagation?: boolean;\n preventDefault?: boolean;\n };\n };\n}\n\nexport interface TriggerModifierSignature {\n Element: PrivateTriggerModifierSignature[\"Element\"];\n}\n\nconst trigger = eModifier<PrivateTriggerModifierSignature>(\n (\n element,\n _: [],\n { triggerElement, isOpen, contentId, setReference, stopPropagation, preventDefault },\n ) => {\n element.setAttribute(\"aria-haspopup\", \"menu\");\n\n if (isOpen.current) {\n element.setAttribute(\"aria-controls\", contentId);\n element.setAttribute(\"aria-expanded\", \"true\");\n } else {\n element.removeAttribute(\"aria-controls\");\n element.setAttribute(\"aria-expanded\", \"false\");\n }\n\n setTabsterAttribute(element, TABSTER_CONFIG_TRIGGER);\n\n const onTriggerClick = (event: MouseEvent) => {\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n if (preventDefault) {\n event.preventDefault();\n }\n\n isOpen.toggle();\n };\n\n element.addEventListener(\"click\", onTriggerClick);\n\n triggerElement.current = element;\n\n setReference(element);\n\n return () => {\n element.removeEventListener(\"click\", onTriggerClick);\n };\n },\n);\n\ninterface PrivateTriggerSignature {\n Element: HTMLButtonElement;\n Args: {\n triggerModifier: WithBoundArgs<\n typeof trigger,\n \"triggerElement\" | \"contentId\" | \"isOpen\" | \"setReference\"\n >;\n stopPropagation?: boolean;\n preventDefault?: boolean;\n };\n Blocks: { default: [] };\n}\n\nexport interface TriggerSignature {\n Element: PrivateTriggerSignature[\"Element\"];\n Blocks: PrivateTriggerSignature[\"Blocks\"];\n}\n\nconst Trigger: TOC<PrivateTriggerSignature> = <template>\n <button\n type=\"button\"\n {{@triggerModifier stopPropagation=@stopPropagation preventDefault=@preventDefault}}\n ...attributes\n >\n {{yield}}\n </button>\n</template>;\n\nconst IsOpen = () => cell<boolean>(false);\nconst TriggerElement = () => cell<HTMLElement>();\n\nexport class Menu extends Component<Signature> {\n contentId = guidFor(this);\n\n <template>\n {{#let (IsOpen) (TriggerElement) as |isOpen triggerEl|}}\n <Popover\n @flipOptions={{@flipOptions}}\n @middleware={{@middleware}}\n @offsetOptions={{@offsetOptions}}\n @placement={{@placement}}\n @shiftOptions={{@shiftOptions}}\n @strategy={{@strategy}}\n @inline={{@inline}}\n as |p|\n >\n {{#let\n (modifier\n trigger\n triggerElement=triggerEl\n isOpen=isOpen\n contentId=this.contentId\n setReference=p.setReference\n )\n as |triggerModifier|\n }}\n {{yield\n (hash\n trigger=triggerModifier\n Trigger=(component Trigger triggerModifier=triggerModifier)\n Content=(component\n Content\n PopoverContent=p.Content\n isOpen=isOpen\n triggerElement=triggerEl\n contentId=this.contentId\n )\n arrow=p.arrow\n isOpen=isOpen.current\n )\n }}\n {{/let}}\n </Popover>\n {{/let}}\n </template>\n}\n\nexport default Menu;\n"],"names":["TABSTER_CONFIG_CONTENT","getTabsterAttribute","mover","direction","MoverDirections","Both","cyclic","deloser","TABSTER_CONFIG_TRIGGER","Separator","setComponentTemplate","precompileTemplate","strictMode","templateOnly","focusOnHover","e","item","currentTarget","HTMLElement","focus","Item","scope","on","LinkItem","Link","installContent","eModifier","element","_","isOpen","triggerElement","tabster","getTabster","window","firstFocusable","focusable","findFirst","container","onDocumentClick","current","target","contains","onDocumentKeydown","key","document","addEventListener","removeEventListener","Content","hash","trigger","contentId","setReference","stopPropagation","preventDefault","setAttribute","removeAttribute","setTabsterAttribute","onTriggerClick","event","toggle","Trigger","IsOpen","cell","TriggerElement","Menu","Component","guidFor","Popover"],"mappings":"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"}
@@ -1,3 +1,2 @@
1
-
2
- export { a as OTP, O as OTPInput } from '../otp-C6hCCXKx.js';
1
+ export { a as OTP, O as OTPInput } from '../otp-7rz1PWP0.js';
3
2
  //# sourceMappingURL=one-time-password.js.map
@@ -1,10 +1,9 @@
1
-
2
1
  import { hash } from '@ember/helper';
3
2
  import { arrow } from '@floating-ui/dom';
4
3
  import { element } from 'ember-element-helper';
5
4
  import { modifier } from 'ember-modifier';
6
5
  import { cell } from 'ember-resources';
7
- import { F as FloatingUI } from '../component-Bs3N-G9z.js';
6
+ import { F as FloatingUI } from '../component-BXy_iafw.js';
8
7
  import { Portal } from './portal.js';
9
8
  import { TARGETS } from './portal-targets.js';
10
9
  import { precompileTemplate } from '@ember/template-compilation';
@@ -18,7 +17,7 @@ function getElementTag(tagName) {
18
17
  * Allows lazy evaluation of the portal target (do nothing until rendered)
19
18
  * This is useful because the algorithm for finding the portal target isn't cheap.
20
19
  */
21
- const Content = setComponentTemplate(precompileTemplate("\n {{#let (element (getElementTag @as)) as |El|}}\n {{#if @inline}}\n {{!-- @glint-ignore\n https://github.com/tildeio/ember-element-helper/issues/91\n https://github.com/typed-ember/glint/issues/610\n --}}\n <El {{@floating}} ...attributes>\n {{yield}}\n </El>\n {{else}}\n <Portal @to={{TARGETS.popover}}>\n {{!-- @glint-ignore\n https://github.com/tildeio/ember-element-helper/issues/91\n https://github.com/typed-ember/glint/issues/610\n --}}\n <El {{@floating}} ...attributes>\n {{yield}}\n </El>\n </Portal>\n {{/if}}\n {{/let}}\n", {
20
+ const Content = setComponentTemplate(precompileTemplate("{{#let (element (getElementTag @as)) as |El|}}\n {{#if @inline}}\n {{!-- @glint-ignore\n https://github.com/tildeio/ember-element-helper/issues/91\n https://github.com/typed-ember/glint/issues/610\n --}}\n <El {{@floating}} ...attributes>\n {{yield}}\n </El>\n {{else}}\n <Portal @to={{TARGETS.popover}}>\n {{!-- @glint-ignore\n https://github.com/tildeio/ember-element-helper/issues/91\n https://github.com/typed-ember/glint/issues/610\n --}}\n <El {{@floating}} ...attributes>\n {{yield}}\n </El>\n </Portal>\n {{/if}}\n{{/let}}", {
22
21
  strictMode: true,
23
22
  scope: () => ({
24
23
  element,
@@ -81,7 +80,7 @@ function flipOptions(options) {
81
80
  ...options
82
81
  };
83
82
  }
84
- const Popover = setComponentTemplate(precompileTemplate("\n {{#let (ArrowElement) as |arrowElement|}}\n <FloatingUI @placement={{@placement}} @strategy={{@strategy}} @middleware={{maybeAddArrow @middleware arrowElement.current}} @flipOptions={{flipOptions @flipOptions}} @shiftOptions={{@shiftOptions}} @offsetOptions={{@offsetOptions}} as |reference floating extra|>\n {{#let (modifier attachArrow arrowElement=arrowElement data=extra.data) as |arrow|}}\n {{yield (hash reference=reference setReference=extra.setReference Content=(component Content floating=floating inline=@inline) data=extra.data arrow=arrow)}}\n {{/let}}\n </FloatingUI>\n {{/let}}\n", {
83
+ const Popover = setComponentTemplate(precompileTemplate("{{#let (ArrowElement) as |arrowElement|}}\n <FloatingUI @placement={{@placement}} @strategy={{@strategy}} @middleware={{maybeAddArrow @middleware arrowElement.current}} @flipOptions={{flipOptions @flipOptions}} @shiftOptions={{@shiftOptions}} @offsetOptions={{@offsetOptions}} as |reference floating extra|>\n {{#let (modifier attachArrow arrowElement=arrowElement data=extra.data) as |arrow|}}\n {{yield (hash reference=reference setReference=extra.setReference Content=(component Content floating=floating inline=@inline) data=extra.data arrow=arrow)}}\n {{/let}}\n </FloatingUI>\n{{/let}}", {
85
84
  strictMode: true,
86
85
  scope: () => ({
87
86
  ArrowElement,
@@ -1 +1 @@
1
- {"version":3,"file":"popover.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"popover.js","sources":["../../src/components/popover.gts"],"sourcesContent":["import { hash } from \"@ember/helper\";\n\nimport { arrow } from \"@floating-ui/dom\";\nimport { element } from \"ember-element-helper\";\nimport { modifier as eModifier } from \"ember-modifier\";\nimport { cell } from \"ember-resources\";\n\nimport { FloatingUI } from \"../floating-ui.ts\";\nimport { Portal } from \"./portal.gts\";\nimport { TARGETS } from \"./portal-targets.gts\";\n\nimport type { Signature as FloatingUiComponentSignature } from \"../floating-ui/component.ts\";\nimport type { Signature as HookSignature } from \"../floating-ui/modifier.ts\";\nimport type { TOC } from \"@ember/component/template-only\";\nimport type { ElementContext, Middleware } from \"@floating-ui/dom\";\nimport type { ModifierLike, WithBoundArgs } from \"@glint/template\";\n\nexport interface Signature {\n Args: {\n /**\n * See the Floating UI's [flip docs](https://floating-ui.com/docs/flip) for possible values.\n *\n * This argument is forwarded to the `<FloatingUI>` component.\n */\n flipOptions?: HookSignature[\"Args\"][\"Named\"][\"flipOptions\"];\n /**\n * Array of one or more objects to add to Floating UI's list of [middleware](https://floating-ui.com/docs/middleware)\n *\n * This argument is forwarded to the `<FloatingUI>` component.\n */\n middleware?: HookSignature[\"Args\"][\"Named\"][\"middleware\"];\n /**\n * See the Floating UI's [offset docs](https://floating-ui.com/docs/offset) for possible values.\n *\n * This argument is forwarded to the `<FloatingUI>` component.\n */\n offsetOptions?: HookSignature[\"Args\"][\"Named\"][\"offsetOptions\"];\n /**\n * One of the possible [`placements`](https://floating-ui.com/docs/computeposition#placement). The default is 'bottom'.\n *\n * Possible values are\n * - top\n * - bottom\n * - right\n * - left\n *\n * And may optionally have `-start` or `-end` added to adjust position along the side.\n *\n * This argument is forwarded to the `<FloatingUI>` component.\n */\n placement?: `${\"top\" | \"bottom\" | \"left\" | \"right\"}${\"\" | \"-start\" | \"-end\"}`;\n /**\n * See the Floating UI's [shift docs](https://floating-ui.com/docs/shift) for possible values.\n *\n * This argument is forwarded to the `<FloatingUI>` component.\n */\n shiftOptions?: HookSignature[\"Args\"][\"Named\"][\"shiftOptions\"];\n /**\n * CSS position property, either `fixed` or `absolute`.\n *\n * Pros and cons of each strategy are explained on [Floating UI's Docs](https://floating-ui.com/docs/computePosition#strategy)\n *\n * This argument is forwarded to the `<FloatingUI>` component.\n */\n strategy?: HookSignature[\"Args\"][\"Named\"][\"strategy\"];\n\n /**\n * By default, the popover is portaled.\n * If you don't control your CSS, and the positioning of the popover content\n * is misbehaving, you may pass \"@inline={{true}}\" to opt out of portalling.\n *\n * Inline may also be useful in nested menus, where you know exactly how the nesting occurs\n */\n inline?: boolean;\n };\n Blocks: {\n default: [\n {\n reference: FloatingUiComponentSignature[\"Blocks\"][\"default\"][0];\n setReference: FloatingUiComponentSignature[\"Blocks\"][\"default\"][2][\"setReference\"];\n Content: WithBoundArgs<typeof Content, \"floating\">;\n data: FloatingUiComponentSignature[\"Blocks\"][\"default\"][2][\"data\"];\n arrow: ModifierLike<{ Element: HTMLElement }>;\n },\n ];\n };\n}\n\nfunction getElementTag(tagName: undefined | string) {\n return tagName || \"div\";\n}\n\n/**\n * Allows lazy evaluation of the portal target (do nothing until rendered)\n * This is useful because the algorithm for finding the portal target isn't cheap.\n */\nconst Content: TOC<{\n Element: HTMLDivElement;\n Args: {\n floating: ModifierLike<{ Element: HTMLElement }>;\n inline?: boolean;\n /**\n * By default the popover content is wrapped in a div.\n * You may change this by supplying the name of an element here.\n *\n * For example:\n * ```gjs\n * <Popover as |p|>\n * <p.Content @as=\"dialog\">\n * this is now focus trapped\n * </p.Content>\n * </Popover>\n * ```\n */\n as?: string;\n };\n Blocks: { default: [] };\n}> = <template>\n {{#let (element (getElementTag @as)) as |El|}}\n {{#if @inline}}\n {{! @glint-ignore\n https://github.com/tildeio/ember-element-helper/issues/91\n https://github.com/typed-ember/glint/issues/610\n }}\n <El {{@floating}} ...attributes>\n {{yield}}\n </El>\n {{else}}\n <Portal @to={{TARGETS.popover}}>\n {{! @glint-ignore\n https://github.com/tildeio/ember-element-helper/issues/91\n https://github.com/typed-ember/glint/issues/610\n }}\n <El {{@floating}} ...attributes>\n {{yield}}\n </El>\n </Portal>\n {{/if}}\n {{/let}}\n</template>;\n\ninterface AttachArrowSignature {\n Element: HTMLElement;\n Args: {\n Named: {\n arrowElement: ReturnType<typeof ArrowElement>;\n data:\n | undefined\n | {\n placement: string;\n middlewareData?: {\n arrow?: { x?: number; y?: number };\n };\n };\n };\n };\n}\n\nconst arrowSides = {\n top: \"bottom\",\n right: \"left\",\n bottom: \"top\",\n left: \"right\",\n};\n\ntype Direction = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Placement = `${Direction}${\"\" | \"-start\" | \"-end\"}`;\n\nconst attachArrow: ModifierLike<AttachArrowSignature> = eModifier<AttachArrowSignature>(\n (element, _: [], named) => {\n if (element === named.arrowElement.current) {\n if (!named.data) return;\n if (!named.data.middlewareData) return;\n\n const { arrow } = named.data.middlewareData;\n const { placement } = named.data;\n\n if (!arrow) return;\n if (!placement) return;\n\n const { x: arrowX, y: arrowY } = arrow;\n const otherSide = (placement as Placement).split(\"-\")[0] as Direction;\n const staticSide = arrowSides[otherSide];\n\n Object.assign(named.arrowElement.current.style, {\n left: arrowX != null ? `${arrowX}px` : \"\",\n top: arrowY != null ? `${arrowY}px` : \"\",\n right: \"\",\n bottom: \"\",\n [staticSide]: \"-4px\",\n });\n\n return;\n }\n\n void (async () => {\n await Promise.resolve();\n named.arrowElement.set(element);\n })();\n },\n);\n\nconst ArrowElement: () => ReturnType<typeof cell<HTMLElement>> = () => cell<HTMLElement>();\n\nfunction maybeAddArrow(middleware: Middleware[] | undefined, element: Element | undefined) {\n const result = [...(middleware || [])];\n\n if (element) {\n result.push(arrow({ element }));\n }\n\n return result;\n}\n\nfunction flipOptions(options: HookSignature[\"Args\"][\"Named\"][\"flipOptions\"]) {\n return {\n elementContext: \"reference\" as ElementContext,\n ...options,\n };\n}\n\nexport const Popover: TOC<Signature> = <template>\n {{#let (ArrowElement) as |arrowElement|}}\n <FloatingUI\n @placement={{@placement}}\n @strategy={{@strategy}}\n @middleware={{maybeAddArrow @middleware arrowElement.current}}\n @flipOptions={{flipOptions @flipOptions}}\n @shiftOptions={{@shiftOptions}}\n @offsetOptions={{@offsetOptions}}\n as |reference floating extra|\n >\n {{#let (modifier attachArrow arrowElement=arrowElement data=extra.data) as |arrow|}}\n {{yield\n (hash\n reference=reference\n setReference=extra.setReference\n Content=(component Content floating=floating inline=@inline)\n data=extra.data\n arrow=arrow\n )\n }}\n {{/let}}\n </FloatingUI>\n {{/let}}\n</template>;\n\nexport default Popover;\n"],"names":["getElementTag","tagName","Content","setComponentTemplate","precompileTemplate","strictMode","scope","element","Portal","TARGETS","templateOnly","arrowSides","top","right","bottom","left","attachArrow","eModifier","_","named","arrowElement","current","data","middlewareData","arrow","placement","x","arrowX","y","arrowY","otherSide","split","staticSide","Object","assign","style","Promise","resolve","set","ArrowElement","cell","maybeAddArrow","middleware","result","push","flipOptions","options","elementContext","Popover","FloatingUI","hash"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
-
2
1
  import { assert } from '@ember/debug';
3
2
  import { macroCondition, isDevelopingApp } from '@embroider/macros';
4
3
  import { modifier } from 'ember-modifier';
@@ -72,7 +71,7 @@ const register = modifier((element, [name]) => {
72
71
  cache.delete(name);
73
72
  };
74
73
  });
75
- const PortalTargets = setComponentTemplate(precompileTemplate("\n <div data-portal-name={{TARGETS.popover}}></div>\n <div data-portal-name={{TARGETS.tooltip}}></div>\n <div data-portal-name={{TARGETS.modal}}></div>\n", {
74
+ const PortalTargets = setComponentTemplate(precompileTemplate("<div data-portal-name={{TARGETS.popover}}></div>\n<div data-portal-name={{TARGETS.tooltip}}></div>\n<div data-portal-name={{TARGETS.modal}}></div>", {
76
75
  strictMode: true,
77
76
  scope: () => ({
78
77
  TARGETS
@@ -81,7 +80,7 @@ const PortalTargets = setComponentTemplate(precompileTemplate("\n <div data-por
81
80
  /**
82
81
  * For manually registering a PortalTarget for use with Portal
83
82
  */
84
- const PortalTarget = setComponentTemplate(precompileTemplate("\n <div {{register @name}} ...attributes></div>\n", {
83
+ const PortalTarget = setComponentTemplate(precompileTemplate("<div {{register @name}} ...attributes></div>", {
85
84
  strictMode: true,
86
85
  scope: () => ({
87
86
  register
@@ -1 +1 @@
1
- {"version":3,"file":"portal-targets.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"portal-targets.js","sources":["../../src/components/portal-targets.gts"],"sourcesContent":["import { assert } from \"@ember/debug\";\nimport { isDevelopingApp, macroCondition } from \"@embroider/macros\";\n\nimport { modifier } from \"ember-modifier\";\nimport { TrackedMap, TrackedSet } from \"tracked-built-ins\";\n\nimport type { TOC } from \"@ember/component/template-only\";\n\nconst cache = new TrackedMap<string, Set<Element>>();\n\nexport const TARGETS = Object.freeze({\n popover: \"ember-primitives__portal-targets__popover\",\n tooltip: \"ember-primitives__portal-targets__tooltip\",\n modal: \"ember-primitives__portal-targets__modal\",\n});\n\nexport function findNearestTarget(origin: Element, name: string): Element | undefined {\n assert(`first argument to \\`findNearestTarget\\` must be an element`, origin instanceof Element);\n assert(`second argument to \\`findNearestTarget\\` must be a string`, typeof name === `string`);\n\n let element: Element | undefined | null = null;\n\n let parent = origin.parentNode;\n\n const manuallyRegisteredSet = cache.get(name);\n const manuallyRegistered: Element[] | null = manuallyRegisteredSet?.size\n ? [...manuallyRegisteredSet]\n : null;\n\n /**\n * For use with <PortalTarget @name=\"hi\" />\n */\n function findRegistered(host: ParentNode): Element | undefined {\n return manuallyRegistered?.find((element) => {\n if (host.contains(element)) {\n return element;\n }\n });\n }\n\n const selector = Object.values(TARGETS as Record<string, string>).includes(name)\n ? `[data-portal-name=${name}]`\n : name;\n\n /**\n * Default portals / non-registered -- here we match a query selector instead of an element\n */\n function findDefault(host: ParentNode): Element | undefined {\n return host.querySelector(selector) as Element;\n }\n\n const finder = manuallyRegistered ? findRegistered : findDefault;\n\n /**\n * Crawl up the ancestry looking for our portal target\n */\n while (!element && parent) {\n element = finder(parent);\n if (element) break;\n parent = parent.parentNode;\n }\n\n if (macroCondition(isDevelopingApp())) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (window as any).prime0 = origin;\n }\n\n if (name.startsWith(\"ember-primitives\")) {\n assert(\n `Could not find element by the given name: \\`${name}\\`.` +\n ` The known names are ` +\n `${Object.values(TARGETS).join(\", \")} ` +\n `-- but any name will work as long as it is set to the \\`data-portal-name\\` attribute ` +\n `(or if the name has been specifically registered via the <PortalTarget /> component). ` +\n `Double check that the element you're wanting to portal to is rendered. ` +\n `The element passed to \\`findNearestTarget\\` is stored on \\`window.prime0\\` ` +\n `You can debug in your browser's console via ` +\n `\\`document.querySelector('[data-portal-name=\"${name}\"]')\\``,\n element,\n );\n }\n\n return element ?? undefined;\n}\n\nconst register = modifier((element: Element, [name]: [name: string]) => {\n assert(`@name is required when using <PortalTarget>`, name);\n\n void (async () => {\n // Bad TypeScript lint.\n // eslint-disable-next-line @typescript-eslint/await-thenable\n await 0;\n\n let existing = cache.get(name);\n\n if (!existing) {\n existing = new TrackedSet<Element>();\n cache.set(name, existing);\n }\n\n existing.add(element);\n })();\n\n return () => {\n cache.delete(name);\n };\n});\n\nexport interface Signature {\n Element: null;\n}\n\nexport const PortalTargets: TOC<Signature> = <template>\n <div data-portal-name={{TARGETS.popover}}></div>\n <div data-portal-name={{TARGETS.tooltip}}></div>\n <div data-portal-name={{TARGETS.modal}}></div>\n</template>;\n\n/**\n * For manually registering a PortalTarget for use with Portal\n */\nexport const PortalTarget: TOC<{\n Element: HTMLDivElement;\n Args: {\n /**\n * The name of the PortalTarget\n *\n * This exact string may be passed to `Portal`'s `@to` argument.\n */\n name: string;\n };\n}> = <template>\n <div {{register @name}} ...attributes></div>\n</template>;\n\nexport default PortalTargets;\n"],"names":["cache","TrackedMap","TARGETS","Object","freeze","popover","tooltip","modal","findNearestTarget","origin","name","assert","Element","element","parent","parentNode","manuallyRegisteredSet","get","manuallyRegistered","size","findRegistered","host","find","contains","selector","values","includes","findDefault","querySelector","finder","macroCondition","isDevelopingApp","window","prime0","startsWith","join","undefined","register","modifier","existing","TrackedSet","set","add","delete","PortalTargets","setComponentTemplate","precompileTemplate","strictMode","scope","templateOnly","PortalTarget"],"mappings":"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"}