@angular/aria 22.0.0-next.5 → 22.0.0-next.7

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 (56) hide show
  1. package/fesm2022/_combobox-chunk.mjs +51 -2
  2. package/fesm2022/_combobox-chunk.mjs.map +1 -1
  3. package/fesm2022/_combobox-listbox-chunk.mjs +3 -0
  4. package/fesm2022/_combobox-listbox-chunk.mjs.map +1 -1
  5. package/fesm2022/_combobox-tree-chunk.mjs.map +1 -1
  6. package/fesm2022/_deferred-content-chunk.mjs +16 -14
  7. package/fesm2022/_deferred-content-chunk.mjs.map +1 -1
  8. package/fesm2022/_list-navigation-chunk.mjs +3 -1
  9. package/fesm2022/_list-navigation-chunk.mjs.map +1 -1
  10. package/fesm2022/_signal-like-chunk.mjs +0 -1
  11. package/fesm2022/_signal-like-chunk.mjs.map +1 -1
  12. package/fesm2022/_tabs-chunk.mjs +22 -47
  13. package/fesm2022/_tabs-chunk.mjs.map +1 -1
  14. package/fesm2022/_widget-chunk.mjs +55 -13
  15. package/fesm2022/_widget-chunk.mjs.map +1 -1
  16. package/fesm2022/accordion.mjs +16 -14
  17. package/fesm2022/accordion.mjs.map +1 -1
  18. package/fesm2022/aria.mjs +1 -1
  19. package/fesm2022/aria.mjs.map +1 -1
  20. package/fesm2022/combobox.mjs +59 -34
  21. package/fesm2022/combobox.mjs.map +1 -1
  22. package/fesm2022/grid-testing.mjs +72 -0
  23. package/fesm2022/grid-testing.mjs.map +1 -0
  24. package/fesm2022/grid.mjs +83 -37
  25. package/fesm2022/grid.mjs.map +1 -1
  26. package/fesm2022/listbox.mjs +58 -31
  27. package/fesm2022/listbox.mjs.map +1 -1
  28. package/fesm2022/menu.mjs +41 -35
  29. package/fesm2022/menu.mjs.map +1 -1
  30. package/fesm2022/private.mjs +156 -5
  31. package/fesm2022/private.mjs.map +1 -1
  32. package/fesm2022/simple-combobox.mjs +443 -0
  33. package/fesm2022/simple-combobox.mjs.map +1 -0
  34. package/fesm2022/tabs.mjs +243 -218
  35. package/fesm2022/tabs.mjs.map +1 -1
  36. package/fesm2022/toolbar.mjs +11 -11
  37. package/fesm2022/toolbar.mjs.map +1 -1
  38. package/fesm2022/tree.mjs +65 -33
  39. package/fesm2022/tree.mjs.map +1 -1
  40. package/package.json +10 -2
  41. package/types/_combobox-chunk.d.ts +32 -2
  42. package/types/_grid-chunk.d.ts +16 -8
  43. package/types/_tabs-chunk.d.ts +7 -42
  44. package/types/combobox.d.ts +4 -3
  45. package/types/grid-testing.d.ts +79 -0
  46. package/types/grid.d.ts +14 -6
  47. package/types/listbox.d.ts +8 -6
  48. package/types/menu.d.ts +7 -4
  49. package/types/private.d.ts +106 -10
  50. package/types/simple-combobox.d.ts +124 -0
  51. package/types/tabs.d.ts +79 -74
  52. package/types/tree.d.ts +5 -2
  53. package/fesm2022/_pointer-event-manager-chunk.mjs +0 -54
  54. package/fesm2022/_pointer-event-manager-chunk.mjs.map +0 -1
  55. package/resources/code-examples.db +0 -0
  56. package/types/_pointer-event-manager-chunk.d.ts +0 -34
@@ -1,63 +1,37 @@
1
1
  import { ListExpansion } from './_expansion-chunk.mjs';
2
- import { computed, signal, KeyboardEventManager } from './_signal-like-chunk.mjs';
2
+ import { signal, computed, linkedSignal, KeyboardEventManager } from './_signal-like-chunk.mjs';
3
3
  import { ListFocus, ListNavigation } from './_list-navigation-chunk.mjs';
4
4
  import { ClickEventManager } from './_click-event-manager-chunk.mjs';
5
5
 
6
- class LabelControl {
7
- inputs;
8
- label = computed(() => this.inputs.label?.());
9
- labelledBy = computed(() => {
10
- const label = this.label();
11
- const labelledBy = this.inputs.labelledBy?.();
12
- const defaultLabelledBy = this.inputs.defaultLabelledBy();
13
- if (labelledBy && labelledBy.length > 0) {
14
- return labelledBy;
15
- }
16
- if (label) {
17
- return [];
18
- }
19
- return defaultLabelledBy;
20
- });
21
- constructor(inputs) {
22
- this.inputs = inputs;
23
- }
24
- }
25
-
26
6
  class TabPattern {
27
7
  inputs;
28
- id = () => this.inputs.id();
29
- index = computed(() => this.inputs.tablist().inputs.items().indexOf(this));
30
- value = () => this.inputs.value();
31
- disabled = () => this.inputs.disabled();
8
+ id;
9
+ disabled;
32
10
  element = () => this.inputs.element();
33
11
  expandable = () => true;
34
- expanded;
35
- active = computed(() => this.inputs.tablist().inputs.activeItem() === this);
36
- selected = computed(() => this.inputs.tablist().selectedTab() === this);
37
- tabIndex = computed(() => this.inputs.tablist().focusBehavior.getItemTabIndex(this));
38
- controls = computed(() => this.inputs.tabpanel()?.id());
12
+ expanded = linkedSignal(() => this.inputs.tabList().selectedTab() === this);
13
+ active = computed(() => this.inputs.tabList().inputs.activeItem() === this);
14
+ selected = computed(() => this.inputs.tabList().selectedTab() === this);
15
+ tabIndex = computed(() => this.inputs.tabList().focusBehavior.getItemTabIndex(this));
16
+ controls = computed(() => this.inputs.tabPanel()?.id());
39
17
  constructor(inputs) {
40
18
  this.inputs = inputs;
41
- this.expanded = inputs.expanded;
19
+ this.id = inputs.id;
20
+ this.disabled = inputs.disabled;
42
21
  }
43
22
  open() {
44
- return this.inputs.tablist().open(this);
23
+ return this.inputs.tabList().open(this);
45
24
  }
46
25
  }
47
26
  class TabPanelPattern {
48
27
  inputs;
49
- id = () => this.inputs.id();
50
- value = () => this.inputs.value();
51
- labelManager;
28
+ id;
52
29
  hidden = computed(() => this.inputs.tab()?.expanded() === false);
53
30
  tabIndex = computed(() => this.hidden() ? -1 : 0);
54
- labelledBy = computed(() => this.labelManager.labelledBy().length > 0 ? this.labelManager.labelledBy().join(' ') : undefined);
31
+ labelledBy = computed(() => this.inputs.tab()?.id());
55
32
  constructor(inputs) {
56
33
  this.inputs = inputs;
57
- this.labelManager = new LabelControl({
58
- ...inputs,
59
- defaultLabelledBy: computed(() => this.inputs.tab() ? [this.inputs.tab().id()] : [])
60
- });
34
+ this.id = inputs.id;
61
35
  }
62
36
  }
63
37
  class TabListPattern {
@@ -66,10 +40,10 @@ class TabListPattern {
66
40
  navigationBehavior;
67
41
  expansionBehavior;
68
42
  hasBeenInteracted = signal(false);
69
- activeTab = () => this.inputs.activeItem();
70
- selectedTab = signal(undefined);
71
- orientation = () => this.inputs.orientation();
72
- disabled = () => this.inputs.disabled();
43
+ activeTab;
44
+ selectedTab;
45
+ orientation;
46
+ disabled;
73
47
  tabIndex = computed(() => this.focusBehavior.getListTabIndex());
74
48
  activeDescendant = computed(() => this.focusBehavior.getActiveDescendant());
75
49
  followFocus = computed(() => this.inputs.selectionMode() === 'follow');
@@ -97,6 +71,10 @@ class TabListPattern {
97
71
  });
98
72
  constructor(inputs) {
99
73
  this.inputs = inputs;
74
+ this.selectedTab = inputs.selectedTab;
75
+ this.activeTab = inputs.activeItem;
76
+ this.orientation = inputs.orientation;
77
+ this.disabled = inputs.disabled;
100
78
  this.focusBehavior = new ListFocus(inputs);
101
79
  this.navigationBehavior = new ListNavigation({
102
80
  ...inputs,
@@ -144,9 +122,6 @@ class TabListPattern {
144
122
  }
145
123
  open(tab) {
146
124
  tab ??= this.activeTab();
147
- if (typeof tab === 'string') {
148
- tab = this.inputs.items().find(t => t.value() === tab);
149
- }
150
125
  if (tab === undefined) return false;
151
126
  const success = this.expansionBehavior.open(tab);
152
127
  if (success) {
@@ -1 +1 @@
1
- {"version":3,"file":"_tabs-chunk.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/aria/private/behaviors/label/label.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/aria/private/tabs/tabs.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {computed, SignalLike} from '../signal-like/signal-like';\n\n/** Represents the required inputs for the label control. */\nexport interface LabelControlInputs {\n /** The default `aria-labelledby` ids. */\n defaultLabelledBy: SignalLike<string[]>;\n}\n\n/** Represents the optional inputs for the label control. */\nexport interface LabelControlOptionalInputs {\n /** The `aria-label`. */\n label?: SignalLike<string | undefined>;\n\n /** The user-provided `aria-labelledby` ids. */\n labelledBy?: SignalLike<string[]>;\n}\n\n/** Controls label and description of an element. */\nexport class LabelControl {\n /** The `aria-label`. */\n readonly label = computed(() => this.inputs.label?.());\n\n /** The `aria-labelledby` ids. */\n readonly labelledBy = computed(() => {\n const label = this.label();\n const labelledBy = this.inputs.labelledBy?.();\n const defaultLabelledBy = this.inputs.defaultLabelledBy();\n\n if (labelledBy && labelledBy.length > 0) {\n return labelledBy;\n }\n\n // If an aria-label is provided by developers, do not set aria-labelledby with the\n // defaultLabelledBy value because if both attributes are set, aria-labelledby will be used.\n if (label) {\n return [];\n }\n\n return defaultLabelledBy;\n });\n\n constructor(readonly inputs: LabelControlInputs & LabelControlOptionalInputs) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {KeyboardEventManager, ClickEventManager} from '../behaviors/event-manager';\nimport {ExpansionItem, ListExpansionInputs, ListExpansion} from '../behaviors/expansion/expansion';\nimport {\n SignalLike,\n computed,\n signal,\n WritableSignalLike,\n} from '../behaviors/signal-like/signal-like';\nimport {LabelControl, LabelControlOptionalInputs} from '../behaviors/label/label';\nimport {ListFocus} from '../behaviors/list-focus/list-focus';\nimport {\n ListNavigationItem,\n ListNavigation,\n ListNavigationInputs,\n} from '../behaviors/list-navigation/list-navigation';\n\n/** The required inputs to tabs. */\nexport interface TabInputs\n extends Omit<ListNavigationItem, 'index'>, Omit<ExpansionItem, 'expandable'> {\n /** The parent tablist that controls the tab. */\n tablist: SignalLike<TabListPattern>;\n\n /** The remote tabpanel controlled by the tab. */\n tabpanel: SignalLike<TabPanelPattern | undefined>;\n\n /** The remote tabpanel unique identifier. */\n value: SignalLike<string>;\n}\n\n/** A tab in a tablist. */\nexport class TabPattern {\n /** A global unique identifier for the tab. */\n readonly id: SignalLike<string> = () => this.inputs.id();\n\n /** The index of the tab. */\n readonly index = computed(() => this.inputs.tablist().inputs.items().indexOf(this));\n\n /** The remote tabpanel unique identifier. */\n readonly value: SignalLike<string> = () => this.inputs.value();\n\n /** Whether the tab is disabled. */\n readonly disabled: SignalLike<boolean> = () => this.inputs.disabled();\n\n /** The html element that should receive focus. */\n readonly element: SignalLike<HTMLElement> = () => this.inputs.element()!;\n\n /** Whether this tab has expandable panel. */\n readonly expandable: SignalLike<boolean> = () => true;\n\n /** Whether the tab panel is expanded. */\n readonly expanded: WritableSignalLike<boolean>;\n\n /** Whether the tab is active. */\n readonly active = computed(() => this.inputs.tablist().inputs.activeItem() === this);\n\n /** Whether the tab is selected. */\n readonly selected = computed(() => this.inputs.tablist().selectedTab() === this);\n\n /** The tab index of the tab. */\n readonly tabIndex = computed(() => this.inputs.tablist().focusBehavior.getItemTabIndex(this));\n\n /** The id of the tabpanel associated with the tab. */\n readonly controls = computed(() => this.inputs.tabpanel()?.id());\n\n constructor(readonly inputs: TabInputs) {\n this.expanded = inputs.expanded;\n }\n\n /** Opens the tab. */\n open(): boolean {\n return this.inputs.tablist().open(this);\n }\n}\n\n/** The required inputs for the tabpanel. */\nexport interface TabPanelInputs extends LabelControlOptionalInputs {\n /** A global unique identifier for the tabpanel. */\n id: SignalLike<string>;\n\n /** The tab that controls this tabpanel. */\n tab: SignalLike<TabPattern | undefined>;\n\n /** A local unique identifier for the tabpanel. */\n value: SignalLike<string>;\n}\n\n/** A tabpanel associated with a tab. */\nexport class TabPanelPattern {\n /** A global unique identifier for the tabpanel. */\n readonly id: SignalLike<string> = () => this.inputs.id();\n\n /** A local unique identifier for the tabpanel. */\n readonly value: SignalLike<string> = () => this.inputs.value();\n\n /** Controls label for this tabpanel. */\n readonly labelManager: LabelControl;\n\n /** Whether the tabpanel is hidden. */\n readonly hidden = computed(() => this.inputs.tab()?.expanded() === false);\n\n /** The tab index of this tabpanel. */\n readonly tabIndex = computed(() => (this.hidden() ? -1 : 0));\n\n /** The aria-labelledby value for this tabpanel. */\n readonly labelledBy = computed(() =>\n this.labelManager.labelledBy().length > 0\n ? this.labelManager.labelledBy().join(' ')\n : undefined,\n );\n\n constructor(readonly inputs: TabPanelInputs) {\n this.labelManager = new LabelControl({\n ...inputs,\n defaultLabelledBy: computed(() => (this.inputs.tab() ? [this.inputs.tab()!.id()] : [])),\n });\n }\n}\n\n/** The required inputs for the tablist. */\nexport interface TabListInputs\n extends\n Omit<ListNavigationInputs<TabPattern>, 'multi'>,\n Omit<ListExpansionInputs, 'multiExpandable' | 'items'> {\n /** The selection strategy used by the tablist. */\n selectionMode: SignalLike<'follow' | 'explicit'>;\n}\n\n/** Controls the state of a tablist. */\nexport class TabListPattern {\n /** The list focus behavior for the tablist. */\n readonly focusBehavior: ListFocus<TabPattern>;\n\n /** The list navigation behavior for the tablist. */\n readonly navigationBehavior: ListNavigation<TabPattern>;\n\n /** Controls expansion for the tablist. */\n readonly expansionBehavior: ListExpansion;\n\n /** Whether the tablist has been interacted with. */\n readonly hasBeenInteracted = signal(false);\n\n /** The currently active tab. */\n readonly activeTab: SignalLike<TabPattern | undefined> = () => this.inputs.activeItem();\n\n /** The currently selected tab. */\n readonly selectedTab: WritableSignalLike<TabPattern | undefined> = signal(undefined);\n\n /** Whether the tablist is vertically or horizontally oriented. */\n readonly orientation: SignalLike<'vertical' | 'horizontal'> = () => this.inputs.orientation();\n\n /** Whether the tablist is disabled. */\n readonly disabled: SignalLike<boolean> = () => this.inputs.disabled();\n\n /** The tab index of the tablist. */\n readonly tabIndex = computed(() => this.focusBehavior.getListTabIndex());\n\n /** The id of the current active tab. */\n readonly activeDescendant = computed(() => this.focusBehavior.getActiveDescendant());\n\n /** Whether selection should follow focus. */\n readonly followFocus = computed(() => this.inputs.selectionMode() === 'follow');\n\n /** The key used to navigate to the previous tab in the tablist. */\n readonly prevKey = computed(() => {\n if (this.inputs.orientation() === 'vertical') {\n return 'ArrowUp';\n }\n return this.inputs.textDirection() === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n });\n\n /** The key used to navigate to the next item in the list. */\n readonly nextKey = computed(() => {\n if (this.inputs.orientation() === 'vertical') {\n return 'ArrowDown';\n }\n return this.inputs.textDirection() === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n });\n\n /** The keydown event manager for the tablist. */\n readonly keydown = computed(() => {\n return new KeyboardEventManager()\n .on(\n this.prevKey,\n () => this._navigate(() => this.navigationBehavior.prev(), this.followFocus()),\n {ignoreRepeat: false},\n )\n .on(\n this.nextKey,\n () => this._navigate(() => this.navigationBehavior.next(), this.followFocus()),\n {ignoreRepeat: false},\n )\n .on('Home', () => this._navigate(() => this.navigationBehavior.first(), this.followFocus()))\n .on('End', () => this._navigate(() => this.navigationBehavior.last(), this.followFocus()))\n .on(' ', () => this.open())\n .on('Enter', () => this.open());\n });\n\n /** The click event manager for the tablist. */\n readonly clickManager = computed(() => {\n return new ClickEventManager<PointerEvent>().on(e =>\n this._navigate(() => this.navigationBehavior.goto(this._getItem(e)!), true),\n );\n });\n\n constructor(readonly inputs: TabListInputs) {\n this.focusBehavior = new ListFocus(inputs);\n\n this.navigationBehavior = new ListNavigation({\n ...inputs,\n focusManager: this.focusBehavior,\n });\n\n this.expansionBehavior = new ListExpansion({\n ...inputs,\n multiExpandable: () => false,\n });\n }\n\n /**\n * Sets the tablist to its default initial state.\n *\n * Sets the active index of the tablist to the first focusable selected\n * tab if one exists. Otherwise, sets focus to the first focusable tab.\n *\n * This method should be called once the tablist and its tabs are properly initialized.\n */\n setDefaultState() {\n let firstItem: TabPattern | undefined;\n\n for (const item of this.inputs.items()) {\n if (!this.focusBehavior.isFocusable(item)) continue;\n\n if (firstItem === undefined) {\n firstItem = item;\n }\n\n if (item.selected()) {\n this.inputs.activeItem.set(item);\n return;\n }\n }\n if (firstItem !== undefined) {\n this.inputs.activeItem.set(firstItem);\n }\n }\n\n /** Sets the default active state of the tablist before receiving interaction for the first time. */\n setDefaultStateEffect(): void {\n if (this.hasBeenInteracted()) return;\n\n this.setDefaultState();\n }\n\n /** Handles keydown events for the tablist. */\n onKeydown(event: KeyboardEvent) {\n if (!this.disabled()) {\n this.hasBeenInteracted.set(true);\n this.keydown().handle(event);\n }\n }\n\n /** The click event manager for the tablist. */\n onClick(event: PointerEvent) {\n if (!this.disabled()) {\n this.hasBeenInteracted.set(true);\n this.clickManager().handle(event);\n }\n }\n\n /** Handles focusin events for the tablist. */\n onFocusIn() {\n this.hasBeenInteracted.set(true);\n }\n\n /** Opens the tab by given value. */\n open(value: string): boolean;\n\n /** Opens the given tab or the current active tab. */\n open(tab?: TabPattern): boolean;\n\n open(tab: TabPattern | string | undefined): boolean {\n tab ??= this.activeTab();\n\n if (typeof tab === 'string') {\n tab = this.inputs.items().find(t => t.value() === tab);\n }\n\n if (tab === undefined) return false;\n\n const success = this.expansionBehavior.open(tab);\n if (success) {\n this.selectedTab.set(tab);\n }\n\n return success;\n }\n\n /** Executes a navigation operation and expand the active tab if needed. */\n private _navigate(op: () => boolean, shouldExpand: boolean = false): void {\n const success = op();\n if (success && shouldExpand) {\n this.open();\n }\n }\n\n /** Returns the tab item associated with the given pointer event. */\n private _getItem(e: PointerEvent) {\n if (!(e.target instanceof HTMLElement)) {\n return;\n }\n\n const element = e.target.closest('[role=\"tab\"]');\n return this.inputs.items().find(i => i.element() === element);\n }\n}\n"],"names":["LabelControl","inputs","label","computed","labelledBy","defaultLabelledBy","length","constructor","TabPattern","id","index","tablist","items","indexOf","value","disabled","element","expandable","expanded","active","activeItem","selected","selectedTab","tabIndex","focusBehavior","getItemTabIndex","controls","tabpanel","open","TabPanelPattern","labelManager","hidden","tab","join","undefined","TabListPattern","navigationBehavior","expansionBehavior","hasBeenInteracted","signal","activeTab","orientation","getListTabIndex","activeDescendant","getActiveDescendant","followFocus","selectionMode","prevKey","textDirection","nextKey","keydown","KeyboardEventManager","on","_navigate","prev","ignoreRepeat","next","first","last","clickManager","ClickEventManager","e","goto","_getItem","ListFocus","ListNavigation","focusManager","ListExpansion","multiExpandable","setDefaultState","firstItem","item","isFocusable","set","setDefaultStateEffect","onKeydown","event","handle","onClick","onFocusIn","find","t","success","op","shouldExpand","target","HTMLElement","closest","i"],"mappings":"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"}
1
+ {"version":3,"file":"_tabs-chunk.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/aria/private/tabs/tabs.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {KeyboardEventManager, ClickEventManager} from '../behaviors/event-manager';\nimport {ExpansionItem, ListExpansion, ListExpansionInputs} from '../behaviors/expansion/expansion';\nimport {\n SignalLike,\n WritableSignalLike,\n computed,\n linkedSignal,\n signal,\n} from '../behaviors/signal-like/signal-like';\nimport {ListFocus} from '../behaviors/list-focus/list-focus';\nimport {\n ListNavigation,\n ListNavigationInputs,\n ListNavigationItem,\n} from '../behaviors/list-navigation/list-navigation';\n\n/** The required inputs to tabs. */\nexport interface TabInputs\n extends Omit<ListNavigationItem, 'index'>, Omit<ExpansionItem, 'expandable' | 'expanded'> {\n /** The parent tablist that controls the tab. */\n tabList: SignalLike<TabListPattern>;\n\n /** The remote tabpanel controlled by the tab. */\n tabPanel: SignalLike<TabPanelPattern | undefined>;\n}\n\n/** A tab in a tablist. */\nexport class TabPattern {\n /** A global unique identifier for the tab. */\n readonly id: SignalLike<string>; // set from inputs\n\n /** Whether the tab is disabled. */\n readonly disabled: SignalLike<boolean>; // set from inputs\n\n /** The html element that should receive focus. */\n readonly element: SignalLike<HTMLElement> = () => this.inputs.element()!;\n\n /** Whether this tab has expandable panel. */\n readonly expandable: SignalLike<boolean> = () => true;\n\n /*\n * Whether the tab panel is expanded.\n * Primarily controlled by the behavior, which will read/write this value.\n * The consumer of this pattern will instead only use the selectedTab input.\n * The pattern will be responsible for synchronizing their state.\n */\n readonly expanded: WritableSignalLike<boolean> = linkedSignal(\n () => this.inputs.tabList().selectedTab() === this,\n );\n\n /** Whether the tab is active. */\n readonly active = computed(() => this.inputs.tabList().inputs.activeItem() === this);\n\n /** Whether the tab is selected. */\n readonly selected = computed(() => this.inputs.tabList().selectedTab() === this);\n\n /** The tab index of the tab. */\n readonly tabIndex = computed(() => this.inputs.tabList().focusBehavior.getItemTabIndex(this));\n\n /** The id of the tabpanel associated with the tab. */\n readonly controls = computed(() => this.inputs.tabPanel()?.id());\n\n constructor(readonly inputs: TabInputs) {\n this.id = inputs.id;\n this.disabled = inputs.disabled;\n }\n\n /** Opens the tab. */\n open(): boolean {\n return this.inputs.tabList().open(this);\n }\n}\n\n/** The required inputs for the tabpanel. */\nexport interface TabPanelInputs {\n /** A global unique identifier for the tabpanel. */\n id: SignalLike<string>;\n\n /** The tab that controls this tabpanel. */\n readonly tab: SignalLike<TabPattern | undefined>;\n}\n\n/** A tabpanel associated with a tab. */\nexport class TabPanelPattern {\n /** A global unique identifier for the tabpanel. */\n readonly id: SignalLike<string>; // set from inputs\n\n /** Whether the tabpanel is hidden. */\n readonly hidden = computed(() => this.inputs.tab()?.expanded() === false);\n\n /** The tab index of this tabpanel. */\n readonly tabIndex = computed(() => (this.hidden() ? -1 : 0));\n\n /** The aria-labelledby value for this tabpanel. */\n readonly labelledBy = computed(() => this.inputs.tab()?.id());\n\n constructor(readonly inputs: TabPanelInputs) {\n this.id = inputs.id;\n }\n}\n\n/** The required inputs for the tablist. */\nexport interface TabListInputs\n extends\n Omit<ListNavigationInputs<TabPattern>, 'multi'>,\n Omit<ListExpansionInputs, 'multiExpandable' | 'items'> {\n /** The selection strategy used by the tablist. */\n selectionMode: SignalLike<'follow' | 'explicit'>;\n\n /** The currently selected tab. */\n selectedTab: WritableSignalLike<TabPattern | undefined>;\n}\n\n/** Controls the state of a tablist. */\nexport class TabListPattern {\n /** The list focus behavior for the tablist. */\n readonly focusBehavior: ListFocus<TabPattern>;\n\n /** The list navigation behavior for the tablist. */\n readonly navigationBehavior: ListNavigation<TabPattern>;\n\n /** Controls expansion for the tablist. */\n readonly expansionBehavior: ListExpansion;\n\n /** Whether the tablist has been interacted with. */\n readonly hasBeenInteracted = signal(false);\n\n /** The currently active tab. */\n readonly activeTab: SignalLike<TabPattern | undefined>; // set from inputs\n\n /** The currently selected tab. */\n readonly selectedTab: WritableSignalLike<TabPattern | undefined>; // set from inputs\n\n /** Whether the tablist is vertically or horizontally oriented. */\n readonly orientation: SignalLike<'vertical' | 'horizontal'>; // set from inputs\n\n /** Whether the tablist is disabled. */\n readonly disabled: SignalLike<boolean>; // set from inputs\n\n /** The tab index of the tablist. */\n readonly tabIndex = computed(() => this.focusBehavior.getListTabIndex());\n\n /** The id of the current active tab. */\n readonly activeDescendant = computed(() => this.focusBehavior.getActiveDescendant());\n\n /** Whether selection should follow focus. */\n readonly followFocus = computed(() => this.inputs.selectionMode() === 'follow');\n\n /** The key used to navigate to the previous tab in the tablist. */\n readonly prevKey = computed(() => {\n if (this.inputs.orientation() === 'vertical') {\n return 'ArrowUp';\n }\n return this.inputs.textDirection() === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n });\n\n /** The key used to navigate to the next item in the list. */\n readonly nextKey = computed(() => {\n if (this.inputs.orientation() === 'vertical') {\n return 'ArrowDown';\n }\n return this.inputs.textDirection() === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n });\n\n /** The keydown event manager for the tablist. */\n readonly keydown = computed(() => {\n return new KeyboardEventManager()\n .on(\n this.prevKey,\n () => this._navigate(() => this.navigationBehavior.prev(), this.followFocus()),\n {ignoreRepeat: false},\n )\n .on(\n this.nextKey,\n () => this._navigate(() => this.navigationBehavior.next(), this.followFocus()),\n {ignoreRepeat: false},\n )\n .on('Home', () => this._navigate(() => this.navigationBehavior.first(), this.followFocus()))\n .on('End', () => this._navigate(() => this.navigationBehavior.last(), this.followFocus()))\n .on(' ', () => this.open())\n .on('Enter', () => this.open());\n });\n\n /** The click event manager for the tablist. */\n readonly clickManager = computed(() => {\n return new ClickEventManager<PointerEvent>().on(e =>\n this._navigate(() => this.navigationBehavior.goto(this._getItem(e)!), true),\n );\n });\n\n constructor(readonly inputs: TabListInputs) {\n this.selectedTab = inputs.selectedTab;\n this.activeTab = inputs.activeItem;\n this.orientation = inputs.orientation;\n this.disabled = inputs.disabled;\n\n this.focusBehavior = new ListFocus(inputs);\n\n this.navigationBehavior = new ListNavigation({\n ...inputs,\n focusManager: this.focusBehavior,\n });\n\n this.expansionBehavior = new ListExpansion({\n ...inputs,\n multiExpandable: () => false,\n });\n }\n\n /**\n * Sets the tablist to its default initial state.\n *\n * Sets the active index of the tablist to the first focusable selected\n * tab if one exists. Otherwise, sets focus to the first focusable tab.\n *\n * This method should be called once the tablist and its tabs are properly initialized.\n */\n setDefaultState() {\n let firstItem: TabPattern | undefined;\n\n for (const item of this.inputs.items()) {\n if (!this.focusBehavior.isFocusable(item)) continue;\n\n if (firstItem === undefined) {\n firstItem = item;\n }\n\n if (item.selected()) {\n this.inputs.activeItem.set(item);\n return;\n }\n }\n if (firstItem !== undefined) {\n this.inputs.activeItem.set(firstItem);\n }\n }\n\n /** Sets the default active state of the tablist before receiving interaction for the first time. */\n setDefaultStateEffect(): void {\n if (this.hasBeenInteracted()) return;\n\n this.setDefaultState();\n }\n\n /** Handles keydown events for the tablist. */\n onKeydown(event: KeyboardEvent) {\n if (!this.disabled()) {\n this.hasBeenInteracted.set(true);\n this.keydown().handle(event);\n }\n }\n\n /** The click event manager for the tablist. */\n onClick(event: PointerEvent) {\n if (!this.disabled()) {\n this.hasBeenInteracted.set(true);\n this.clickManager().handle(event);\n }\n }\n\n /** Handles focusin events for the tablist. */\n onFocusIn() {\n this.hasBeenInteracted.set(true);\n }\n\n /** Opens the given tab or the current active tab. */\n open(tab?: TabPattern): boolean;\n open(tab: TabPattern | undefined): boolean {\n tab ??= this.activeTab();\n\n if (tab === undefined) return false;\n\n const success = this.expansionBehavior.open(tab);\n if (success) {\n this.selectedTab.set(tab);\n }\n\n return success;\n }\n\n /** Executes a navigation operation and expand the active tab if needed. */\n private _navigate(op: () => boolean, shouldExpand: boolean = false): void {\n const success = op();\n if (success && shouldExpand) {\n this.open();\n }\n }\n\n /** Returns the tab item associated with the given pointer event. */\n private _getItem(e: PointerEvent) {\n if (!(e.target instanceof HTMLElement)) {\n return;\n }\n\n const element = e.target.closest('[role=\"tab\"]');\n return this.inputs.items().find(i => i.element() === element);\n }\n}\n"],"names":["TabPattern","inputs","id","disabled","element","expandable","expanded","linkedSignal","tabList","selectedTab","active","computed","activeItem","selected","tabIndex","focusBehavior","getItemTabIndex","controls","tabPanel","constructor","open","TabPanelPattern","hidden","tab","labelledBy","TabListPattern","navigationBehavior","expansionBehavior","hasBeenInteracted","signal","activeTab","orientation","getListTabIndex","activeDescendant","getActiveDescendant","followFocus","selectionMode","prevKey","textDirection","nextKey","keydown","KeyboardEventManager","on","_navigate","prev","ignoreRepeat","next","first","last","clickManager","ClickEventManager","e","goto","_getItem","ListFocus","ListNavigation","focusManager","ListExpansion","multiExpandable","setDefaultState","firstItem","item","items","isFocusable","undefined","set","setDefaultStateEffect","onKeydown","event","handle","onClick","onFocusIn","success","op","shouldExpand","target","HTMLElement","closest","find","i"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { computed, signal, linkedSignal, KeyboardEventManager, Modifier } from './_signal-like-chunk.mjs';
2
- import { PointerEventManager } from './_pointer-event-manager-chunk.mjs';
2
+ import { ClickEventManager } from './_click-event-manager-chunk.mjs';
3
3
  import { untracked } from '@angular/core/primitives/signals';
4
+ import { ElementRef } from '@angular/core';
4
5
 
5
6
  class GridData {
6
7
  inputs;
@@ -511,15 +512,47 @@ class Grid {
511
512
  return this.setDefaultState();
512
513
  }
513
514
  if (this.focusBehavior.stateStale()) {
514
- if (this.focusBehavior.focusCell(this.focusBehavior.activeCell())) {
515
+ const activeCell = this.focusBehavior.activeCell();
516
+ const activeCoords = this.focusBehavior.activeCoords();
517
+ if (activeCell && this.focusBehavior.focusCell(activeCell)) {
515
518
  return true;
516
519
  }
517
- if (this.focusBehavior.focusCoordinates(this.focusBehavior.activeCoords())) {
520
+ if (this.focusBehavior.focusCoordinates(activeCoords)) {
518
521
  return true;
519
522
  }
520
- if (this.focusBehavior.focusCoordinates(this.navigationBehavior.peekFirst())) {
523
+ const maxRow = this.data.maxRowCount() - 1;
524
+ const targetRow = Math.min(activeCoords.row, maxRow);
525
+ if (targetRow >= 0) {
526
+ if (this.focusBehavior.focusCoordinates({
527
+ row: targetRow,
528
+ col: activeCoords.col
529
+ })) {
530
+ return true;
531
+ }
532
+ const colCount = this.data.getColCount(targetRow);
533
+ if (colCount !== undefined) {
534
+ const targetCol = Math.min(activeCoords.col, colCount - 1);
535
+ if (targetCol >= 0 && this.focusBehavior.focusCoordinates({
536
+ row: targetRow,
537
+ col: targetCol
538
+ })) {
539
+ return true;
540
+ }
541
+ }
542
+ const firstInRow = this.navigationBehavior.peekFirst(targetRow);
543
+ if (firstInRow !== undefined && this.focusBehavior.focusCoordinates(firstInRow)) {
544
+ return true;
545
+ }
546
+ }
547
+ const firstAvailable = this.navigationBehavior.peekFirst();
548
+ if (firstAvailable !== undefined && this.focusBehavior.focusCoordinates(firstAvailable)) {
521
549
  return true;
522
550
  }
551
+ this.focusBehavior.activeCell.set(undefined);
552
+ this.focusBehavior.activeCoords.set({
553
+ row: -1,
554
+ col: -1
555
+ });
523
556
  }
524
557
  return false;
525
558
  }
@@ -633,8 +666,8 @@ class GridPattern {
633
666
  }
634
667
  return manager;
635
668
  });
636
- pointerdown = computed(() => {
637
- const manager = new PointerEventManager();
669
+ clickManager = computed(() => {
670
+ const manager = new ClickEventManager();
638
671
  if (!this.inputs.enableSelection()) {
639
672
  manager.on(e => {
640
673
  const cell = this.inputs.getCell(e.target);
@@ -680,10 +713,10 @@ class GridPattern {
680
713
  this.activeCell()?.onKeydown(event);
681
714
  this.keydown().handle(event);
682
715
  }
683
- onPointerdown(event) {
716
+ onClick(event) {
684
717
  if (this.disabled()) return;
685
718
  this.hasBeenInteracted.set(true);
686
- this.pointerdown().handle(event);
719
+ this.clickManager().handle(event);
687
720
  }
688
721
  onFocusIn(event) {
689
722
  this.isFocused.set(true);
@@ -798,6 +831,11 @@ class GridCellPattern {
798
831
  onKeydown(event) {
799
832
  if (this.disabled()) return;
800
833
  this.widget()?.onKeydown(event);
834
+ if (this.widget()?.inputs.widgetType() === 'simple') {
835
+ if (event.key === 'Enter' || event.key === ' ') {
836
+ this.inputs.onActivate?.(event);
837
+ }
838
+ }
801
839
  }
802
840
  onFocusIn(event) {
803
841
  this.isFocused.set(true);
@@ -827,10 +865,17 @@ class GridCellPattern {
827
865
  }
828
866
  }
829
867
 
868
+ function resolveElement(resolver, context) {
869
+ if (typeof resolver === 'function') {
870
+ return resolver(context) ?? undefined;
871
+ }
872
+ return (resolver instanceof ElementRef ? resolver.nativeElement : resolver) ?? undefined;
873
+ }
874
+
830
875
  class GridCellWidgetPattern {
831
876
  inputs;
832
877
  element = () => this.inputs.element();
833
- widgetHost = computed(() => this.inputs.focusTarget() ?? this.element());
878
+ widgetHost = () => resolveElement(this.inputs.focusTarget(), this.element()) ?? this.element();
834
879
  disabled = computed(() => this.inputs.disabled() || this.inputs.cell().disabled());
835
880
  tabIndex = computed(() => this.inputs.cell().widgetTabIndex());
836
881
  active = computed(() => this.inputs.cell().active() && this.inputs.cell().widget() === this);
@@ -839,9 +884,6 @@ class GridCellWidgetPattern {
839
884
  lastDeactivateEvent = signal(undefined);
840
885
  keydown = computed(() => {
841
886
  const manager = new KeyboardEventManager();
842
- if (this.inputs.widgetType() === 'simple') {
843
- return manager;
844
- }
845
887
  if (this.isActivated()) {
846
888
  manager.on('Escape', e => {
847
889
  this.deactivate(e);
@@ -898,5 +940,5 @@ class GridCellWidgetPattern {
898
940
  }
899
941
  }
900
942
 
901
- export { GridCellPattern, GridCellWidgetPattern, GridPattern, GridRowPattern };
943
+ export { GridCellPattern, GridCellWidgetPattern, GridPattern, GridRowPattern, resolveElement };
902
944
  //# sourceMappingURL=_widget-chunk.mjs.map