native-document 1.0.168 → 1.0.172

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 (153) hide show
  1. package/CHANGELOG.md +99 -4
  2. package/components.js +3 -1
  3. package/dist/native-document.components.min.js +197 -171
  4. package/dist/native-document.dev.js +92 -75
  5. package/dist/native-document.dev.js.map +1 -1
  6. package/dist/native-document.min.js +1 -1
  7. package/docs/components/icons.md +321 -0
  8. package/docs/vitepress-conventions.md +2 -2
  9. package/package.json +11 -4
  10. package/src/components/BaseComponent.js +43 -1
  11. package/src/components/accordion/Accordion.js +1 -0
  12. package/src/components/accordion/AccordionItem.js +1 -0
  13. package/src/components/alert/Alert.js +4 -0
  14. package/src/components/avatar/Avatar.js +1 -0
  15. package/src/components/avatar/AvatarGroup.js +1 -0
  16. package/src/components/badge/Badge.js +1 -0
  17. package/src/components/breadcrumb/BreadCrumb.js +4 -0
  18. package/src/components/button/Button.js +1 -0
  19. package/src/components/card/Card.js +1 -0
  20. package/src/components/context-menu/ContextMenu.js +2 -0
  21. package/src/components/context-menu/ContextMenuGroup.js +2 -0
  22. package/src/components/context-menu/ContextMenuItem.js +2 -0
  23. package/src/components/divider/Divider.js +2 -0
  24. package/src/components/dropdown/Dropdown.js +1 -0
  25. package/src/components/dropdown/DropdownDivider.js +1 -0
  26. package/src/components/dropdown/DropdownGroup.js +1 -0
  27. package/src/components/dropdown/DropdownItem.js +1 -0
  28. package/src/components/dropdown/DropdownTrigger.js +1 -0
  29. package/src/components/form/FormControl.js +1 -0
  30. package/src/components/form/field/Field.js +1 -0
  31. package/src/components/form/field/types/FileField.js +3 -3
  32. package/src/components/form/field/types/StringField.js +1 -1
  33. package/src/components/icon/Icon.js +108 -0
  34. package/src/components/icon/icon-getters.js +142 -0
  35. package/src/components/icon/icons.js +171 -0
  36. package/src/components/icon/index.js +17 -0
  37. package/src/components/icon/types/Icon.d.ts +191 -0
  38. package/src/components/index.d.ts +6 -1
  39. package/src/components/list/ListItem.js +1 -0
  40. package/src/components/list/types/List.d.ts +45 -32
  41. package/src/components/list/types/ListDivider.ts +16 -0
  42. package/src/components/list/types/ListGroup.d.ts +51 -29
  43. package/src/components/list/types/ListItem.d.ts +20 -21
  44. package/src/components/menu/Menu.js +3 -0
  45. package/src/components/menu/MenuDivider.js +1 -0
  46. package/src/components/menu/MenuGroup.js +1 -0
  47. package/src/components/menu/MenuItem.js +1 -0
  48. package/src/components/menu/MenuLink.js +1 -0
  49. package/src/components/modal/Modal.js +4 -0
  50. package/src/components/pagination/Pagination.js +1 -0
  51. package/src/components/popover/Popover.js +1 -0
  52. package/src/components/popover/PopoverFooter.js +1 -0
  53. package/src/components/popover/PopoverHeader.js +1 -0
  54. package/src/components/progress/Progress.js +5 -0
  55. package/src/components/skeleton/Skeleton.js +4 -0
  56. package/src/components/slider/Slider.js +1 -0
  57. package/src/components/spacer/Spacer.js +1 -0
  58. package/src/components/spinner/Spinner.js +1 -0
  59. package/src/components/splitter/Splitter.js +1 -0
  60. package/src/components/splitter/SplitterGutter.js +6 -0
  61. package/src/components/splitter/SplitterPanel.js +1 -0
  62. package/src/components/stacks/AbsoluteStack.js +1 -0
  63. package/src/components/stacks/FixedStack.js +1 -0
  64. package/src/components/stacks/HStack.js +1 -0
  65. package/src/components/stacks/PositionStack.js +1 -0
  66. package/src/components/stacks/RelativeStack.js +1 -0
  67. package/src/components/stacks/Stack.js +1 -0
  68. package/src/components/stacks/VStack.js +1 -0
  69. package/src/components/stepper/Stepper.js +1 -0
  70. package/src/components/stepper/StepperStep.js +1 -0
  71. package/src/components/switch/Switch.js +1 -0
  72. package/src/components/table/DataTable.js +1 -0
  73. package/src/components/table/SimpleTable.js +1 -0
  74. package/src/components/tabs/Tabs.js +1 -0
  75. package/src/components/toast/Toast.js +1 -0
  76. package/src/components/tooltip/Tooltip.js +1 -0
  77. package/src/core/data/MemoryManager.js +6 -1
  78. package/src/core/data/ObservableItem.js +28 -10
  79. package/src/core/elements/anchor/anchor.js +4 -3
  80. package/src/core/elements/anchor/one-child-anchor-overwriting.js +4 -4
  81. package/src/core/elements/content-formatter.js +35 -2
  82. package/src/core/elements/control/for-each-array-cache.js +59 -0
  83. package/src/core/elements/control/for-each-array.js +15 -23
  84. package/src/core/elements/form.js +1 -1
  85. package/src/core/elements/img.js +1 -1
  86. package/src/core/elements/medias.js +2 -2
  87. package/src/core/elements/meta-data.js +1 -1
  88. package/src/core/wrappers/AttributesWrapper.js +44 -29
  89. package/src/core/wrappers/ElementCreator.js +38 -22
  90. package/src/core/wrappers/HtmlElementWrapper.js +33 -9
  91. package/src/core/wrappers/NDElement.js +35 -9
  92. package/src/core/wrappers/NdPrototype.js +31 -39
  93. package/src/core/wrappers/constants.js +12 -12
  94. package/src/core/wrappers/prototypes/attributes-extensions.js +24 -24
  95. package/src/core/wrappers/prototypes/nd-element-extensions.js +128 -65
  96. package/src/ui/components/accordion/AccordionItemRender.js +29 -7
  97. package/src/ui/components/alert/AlertRender.js +6 -0
  98. package/src/ui/components/breadcrumb/BreadcrumbRender.js +9 -1
  99. package/src/ui/components/button/ButtonRender.js +3 -0
  100. package/src/ui/components/contextmenu/ContextmenuRender.js +2 -0
  101. package/src/ui/components/dropdown/DropdownRender.js +3 -0
  102. package/src/ui/components/dropdown/item/DropdownItemRender.js +6 -1
  103. package/src/ui/components/form/FieldCollectionRender.js +4 -0
  104. package/src/ui/components/form/fields/CheckboxFieldRender.js +4 -0
  105. package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +4 -0
  106. package/src/ui/components/form/fields/RadioFieldRender.js +4 -0
  107. package/src/ui/components/form/fields/RangeFieldRender.js +4 -0
  108. package/src/ui/components/form/fields/SelectFieldRender.js +5 -0
  109. package/src/ui/components/form/fields/SliderFieldRender.js +3 -0
  110. package/src/ui/components/icon/material/MaterialIconRender.js +71 -0
  111. package/src/ui/components/icon/material/material.css +15 -0
  112. package/src/ui/components/icon/material/material.map.js +170 -0
  113. package/src/ui/components/icon/phosphor/PhosphorIconRender.js +71 -0
  114. package/src/ui/components/icon/phosphor/phosphor.css +17 -0
  115. package/src/ui/components/icon/phosphor/phosphor.map.js +165 -0
  116. package/src/ui/components/icon/tabler/TablerIconRender.js +58 -0
  117. package/src/ui/components/icon/tabler/tabler.css +14 -0
  118. package/src/ui/components/icon/tabler/tabler.map.js +165 -0
  119. package/src/ui/components/list/item/ListItemRender.js +4 -0
  120. package/src/ui/components/menu/MenuItemRender.js +8 -0
  121. package/src/ui/components/menu/MenuLinkRender.js +11 -0
  122. package/src/ui/components/menu/MenuRender.js +5 -0
  123. package/src/ui/components/menu/helpers.js +2 -1
  124. package/src/ui/components/modal/ModalRender.js +8 -2
  125. package/src/ui/components/progress/ProgressRender.js +9 -0
  126. package/src/ui/components/skeleton/SkeletonRender.js +2 -0
  127. package/src/ui/components/spinner/SpinnerRender.js +3 -0
  128. package/src/ui/components/splitter/SplitterGutterRender.js +4 -0
  129. package/src/ui/components/splitter/SplitterPanelRender.js +4 -0
  130. package/src/ui/components/splitter/SplitterRender.js +2 -0
  131. package/src/ui/components/stepper/StepperRender.js +2 -1
  132. package/src/ui/components/stepper/StepperStepRender.js +8 -1
  133. package/src/ui/components/switch/SwitchRender.js +3 -0
  134. package/src/ui/components/table/data-table/DataTableRender.js +4 -0
  135. package/src/ui/components/table/simple-table/SimpleTableRender.js +2 -0
  136. package/src/ui/components/toast/ToastRender.js +4 -0
  137. package/src/ui/index.js +5 -0
  138. package/src/ui/utils/aria.js +19 -0
  139. package/tests/integration/ui/attributes-wrapper.test.js +177 -0
  140. package/tests/integration/ui/for-each-array.test.js +167 -0
  141. package/tests/integration/ui/lifecycle.test.js +146 -0
  142. package/tests/integration/ui/show-if.test.js +168 -0
  143. package/tests/unit/core/observable-array.test.js +404 -0
  144. package/tests/unit/core/observable-item.test.js +428 -0
  145. package/tests/unit/core/observable-object.test.js +239 -0
  146. package/tests/unit/core/observable-resource.test.js +323 -0
  147. package/tests/unit/core/store.test.js +347 -0
  148. package/tests/unit/router/route-matching.test.js +169 -0
  149. package/tests/unit/router/router-guards.test.js +189 -0
  150. package/tests/unit/utils/cache.test.js +120 -0
  151. package/tests/unit/utils/filters.test.js +394 -0
  152. package/types/elements.d.ts +5 -0
  153. package/vitest.config.js +15 -0
@@ -1,43 +1,56 @@
1
- import type { ValidChild } from '../../../../types/elements';
2
- import type { ObservableItem } from '../../../../types/observable';
3
- import type { BaseComponent } from '../../BaseComponent';
4
- import type { ListItemInterface } from './ListItem';
1
+ import type { ValidChild } from '../../../../types/elements';
2
+ import type { ObservableItem, ObservableArray } from '../../../../types/observable';
5
3
  import type { GlobalAttributes } from '../../../../types/globals';
4
+ import type { ListItemInterface } from './ListItem';
5
+ import type { ListGroupInterface } from './ListGroup';
6
+ import type { ListDividerInterface } from './ListDivider';
6
7
 
7
8
  export type ListDescription = {
8
- selectable: boolean;
9
- multiSelect: boolean;
10
- selectedValues: ObservableItem<unknown[]> | null;
11
- inset: boolean;
12
- divider: boolean;
13
- data: unknown | null;
14
- render: ((desc: ListDescription, instance: ListInterface) => ValidChild) | null;
15
- selectByCheckbox: boolean;
16
- selectByClick: boolean;
17
- loopOnKeyboard: boolean;
18
- props: GlobalAttributes;
19
- };
20
-
21
- export interface ListInterface extends BaseComponent {
22
- selectable(selectable?: boolean): this;
23
- selectByClick(): void;
24
- selectByCheckbox(): void;
25
- multiSelect(multi?: boolean): this;
26
- selectedValuesModel(observable: ObservableItem<unknown[]>): this;
27
- inset(inset?: boolean): this;
9
+ selectable: ObservableItem<boolean>;
10
+ multiSelect: ObservableItem<boolean>;
11
+ selectedValues: ObservableArray<unknown>;
12
+ inset: ObservableItem<number>;
13
+ divider: boolean;
14
+ items: ObservableArray<unknown>;
15
+ render: ((desc: ListDescription, instance: ListInterface) => ValidChild) | null;
16
+ selectByCheckbox: ObservableItem<boolean>;
17
+ selectByClick: ObservableItem<boolean>;
18
+ loopOnKeyboard: ObservableItem<boolean>;
19
+ props: GlobalAttributes;
20
+ };
21
+
22
+ export interface ListInterface {
23
+ $description: ListDescription;
24
+
25
+ // HasListItem
26
+ selectable(selectable?: boolean | ObservableItem<boolean>): this;
27
+ selectByClick(): this;
28
+ selectByCheckbox(): this;
29
+ multiSelect(multi?: boolean | ObservableItem<boolean>): this;
30
+ selectInto(list: ObservableArray<unknown> | unknown[]): this;
31
+ selectedValuesModel(observable: ObservableArray<unknown> | ObservableItem<unknown[]>): this;
32
+ loopOnKeyboard(loopOnKeyboard: boolean): this;
33
+ add(item: ListItemInterface | ListGroupInterface | ListDividerInterface): this;
34
+ item(label: ValidChild, iconOrBuilder?: ValidChild | ((item: ListItemInterface) => void), builder?: (item: ListItemInterface) => void): this;
35
+ group(label: ValidChild, iconOrBuilder?: ValidChild | ((group: ListGroupInterface) => void), builder?: (group: ListGroupInterface) => void): this;
36
+ divider(): this;
37
+ from(source: ObservableArray<unknown> | unknown[], builder: (item: unknown) => ListItemInterface | ListGroupInterface): this;
38
+
39
+ // Own methods
40
+ inset(inset?: number): this;
28
41
  withDivider(divider?: boolean): this;
29
42
  data(data: unknown): this;
30
43
  onItemClick(handler: (item: ListItemInterface, event: MouseEvent) => void): this;
31
44
  onItemSelect(handler: (item: ListItemInterface) => void): this;
32
- render(template: (description: ListDescription, instance: ListInterface) => ValidChild): this;
33
- }
34
45
 
46
+ // HasEventEmitter
47
+ on(event: string, handler: (...args: unknown[]) => void): this;
48
+ emit(event: string, ...args: unknown[]): void;
49
+ hasListeners(event: string): boolean;
50
+ }
35
51
 
36
- export declare function List(config?: Record<string, unknown>): ListInterface;
52
+ export declare function List(props?: GlobalAttributes): ListInterface;
37
53
  export declare namespace List {
38
-
39
-
40
54
  function use(template: (description: ListDescription, instance: ListInterface) => ValidChild): void;
41
-
42
-
43
- }
55
+ let defaultTemplate: ((description: ListDescription, instance: ListInterface) => ValidChild) | null;
56
+ }
@@ -0,0 +1,16 @@
1
+ import type { ValidChild } from '../../../../types/elements';
2
+ import type { GlobalAttributes } from '../../../../types/globals';
3
+
4
+ export type ListDividerDescription = {
5
+ props: GlobalAttributes;
6
+ };
7
+
8
+ export interface ListDividerInterface {
9
+ $description: ListDividerDescription;
10
+ }
11
+
12
+ export declare function ListDivider(props?: GlobalAttributes): ListDividerInterface;
13
+ export declare namespace ListDivider {
14
+ function use(template: (description: ListDividerDescription, instance: ListDividerInterface) => ValidChild): void;
15
+ let defaultTemplate: ((description: ListDividerDescription, instance: ListDividerInterface) => ValidChild) | null;
16
+ }
@@ -1,37 +1,59 @@
1
- import type { ValidChild } from '../../../../types/elements';
2
- import type { ObservableItem } from '../../../../types/observable';
3
- import type { BaseComponent } from '../../BaseComponent';
1
+ import type { ValidChild } from '../../../../types/elements';
2
+ import type { ObservableItem, ObservableArray } from '../../../../types/observable';
4
3
  import type { GlobalAttributes } from '../../../../types/globals';
4
+ import type { ListItemInterface } from './ListItem';
5
+ import type { ListDividerInterface } from './ListDivider';
5
6
 
6
7
  export type ListGroupDescription = {
7
- header: ValidChild | null;
8
- footer: ValidChild | null;
9
- items: unknown[];
10
- inset: boolean;
11
- data: unknown | null;
12
- renderHeader: ((desc: ListGroupDescription, instance: ListGroupInterface) => ValidChild) | null;
13
- renderFooter: ((desc: ListGroupDescription, instance: ListGroupInterface) => ValidChild) | null;
14
- render: ((desc: ListGroupDescription, instance: ListGroupInterface) => ValidChild) | null;
15
- props: GlobalAttributes;
16
- };
17
-
18
- export interface ListGroupInterface extends BaseComponent {
19
- header(header: ValidChild): this;
20
- title(title: ValidChild): this;
21
- footer(footer: ValidChild): this;
22
- inset(inset?: boolean): this;
8
+ label: ValidChild;
9
+ icon: ValidChild | null;
10
+ items: ObservableArray<unknown>;
11
+ render: ((desc: ListGroupDescription, instance: ListGroupInterface) => ValidChild) | null;
12
+ collapsable: boolean;
13
+ collapsed: ObservableItem<boolean> | null;
14
+ collapsableOpenedIcon: ValidChild | null;
15
+ collapsableClosedIcon: ValidChild | null;
16
+ visibility: ObservableItem<boolean>;
17
+ selectable: ObservableItem<boolean>;
18
+ multiSelect: ObservableItem<boolean>;
19
+ selectedValues: ObservableArray<unknown>;
20
+ selectByCheckbox: ObservableItem<boolean>;
21
+ selectByClick: ObservableItem<boolean>;
22
+ loopOnKeyboard: ObservableItem<boolean>;
23
+ props: GlobalAttributes;
24
+ };
25
+
26
+ export interface ListGroupInterface {
27
+ $description: ListGroupDescription;
28
+
29
+ // Own methods
30
+ icon(icon: ValidChild): this;
31
+ collapsable(mode?: boolean, openedIcon?: ValidChild, closedIcon?: ValidChild): this;
32
+ collapsed(mode?: boolean): this;
33
+ visibility(mode: boolean | ObservableItem<boolean>): this;
23
34
  data(data: unknown): this;
24
- renderHeader(renderFn: (desc: ListGroupDescription, instance: ListGroupInterface) => ValidChild): this;
25
- renderFooter(renderFn: (desc: ListGroupDescription, instance: ListGroupInterface) => ValidChild): this;
26
- render(renderFn: (desc: ListGroupDescription, instance: ListGroupInterface) => ValidChild): this;
27
- }
28
35
 
36
+ // HasListItem
37
+ selectable(selectable?: boolean | ObservableItem<boolean>): this;
38
+ selectByClick(): this;
39
+ selectByCheckbox(): this;
40
+ multiSelect(multi?: boolean | ObservableItem<boolean>): this;
41
+ selectInto(list: ObservableArray<unknown> | unknown[]): this;
42
+ loopOnKeyboard(loopOnKeyboard: boolean): this;
43
+ add(item: ListItemInterface | ListGroupInterface | ListDividerInterface): this;
44
+ item(label: ValidChild, iconOrBuilder?: ValidChild | ((item: ListItemInterface) => void), builder?: (item: ListItemInterface) => void): this;
45
+ group(label: ValidChild, iconOrBuilder?: ValidChild | ((group: ListGroupInterface) => void), builder?: (group: ListGroupInterface) => void): this;
46
+ divider(): this;
47
+ from(source: ObservableArray<unknown> | unknown[], builder: (item: unknown) => ListItemInterface | ListGroupInterface): this;
48
+
49
+ // HasEventEmitter
50
+ on(event: string, handler: (...args: unknown[]) => void): this;
51
+ emit(event: string, ...args: unknown[]): void;
52
+ hasListeners(event: string): boolean;
53
+ }
29
54
 
30
- export declare function ListGroup(label?: ValidChild, config?: Record<string, unknown>): ListGroupInterface;
55
+ export declare function ListGroup(label: ValidChild, props?: GlobalAttributes): ListGroupInterface;
31
56
  export declare namespace ListGroup {
32
-
33
-
34
57
  function use(template: (description: ListGroupDescription, instance: ListGroupInterface) => ValidChild): void;
35
-
36
-
37
- }
58
+ let defaultTemplate: ((description: ListGroupDescription, instance: ListGroupInterface) => ValidChild) | null;
59
+ }
@@ -1,8 +1,8 @@
1
- import { GlobalAttributes, Observable } from '../../../../types/globals';
2
- import { ValidChild } from '../../../../types/elements';
3
- import { ObservableArray } from '../../../../types/observable';
1
+ import type { ValidChild } from '../../../../types/elements';
2
+ import type { ObservableItem } from '../../../../types/observable';
3
+ import type { GlobalAttributes } from '../../../../types/globals';
4
4
 
5
- export interface ListItemDescription {
5
+ export type ListItemDescription = {
6
6
  label: ValidChild | null;
7
7
  subtitle: ValidChild | null;
8
8
  icon: ValidChild | null;
@@ -10,24 +10,19 @@ export interface ListItemDescription {
10
10
  value: unknown;
11
11
  data: unknown | null;
12
12
  key: string | null;
13
- disabled: Observable<boolean> | null;
14
- selected: Observable<boolean> | null;
15
- visibility: Observable<boolean> | null;
13
+ disabled: ObservableItem<boolean> | null;
14
+ selected: ObservableItem<boolean> | null;
15
+ visibility: ObservableItem<boolean> | null;
16
16
  isSelectedIcon: ValidChild | null;
17
17
  swipeLeading: ValidChild[];
18
18
  swipeTrailing: ValidChild[];
19
- render: ((desc: ListItemDescription, instance: ListItem) => ValidChild) | null;
19
+ render: ((desc: ListItemDescription, instance: ListItemInterface) => ValidChild) | null;
20
20
  props: GlobalAttributes;
21
- }
21
+ };
22
22
 
23
- export declare class ListItem {
23
+ export interface ListItemInterface {
24
24
  $description: ListItemDescription;
25
- $parent: unknown;
26
-
27
- constructor(props?: GlobalAttributes);
28
-
29
- static use(template: (description: ListItemDescription, instance: ListItem) => ValidChild): void;
30
- static defaultTemplate: ((description: ListItemDescription, instance: ListItem) => ValidChild) | null;
25
+ $parent: unknown;
31
26
 
32
27
  label(label: ValidChild): this;
33
28
  subtitle(subtitle: ValidChild): this;
@@ -36,13 +31,13 @@ export declare class ListItem {
36
31
  value(value: unknown): this;
37
32
  data(data: unknown): this;
38
33
  key(key: string): this;
39
- disabled(disabled?: boolean | Observable<boolean>): this;
40
- selected(selected?: boolean | Observable<boolean>): this;
41
- visibility(mode: boolean | Observable<boolean>): this;
34
+ disabled(disabled?: boolean | ObservableItem<boolean>): this;
35
+ selected(selected?: boolean | ObservableItem<boolean>): this;
36
+ visibility(mode: boolean | ObservableItem<boolean>): this;
42
37
  isSelectedIcon(icon: ValidChild): this;
43
38
  swipeLeading(actions: ValidChild | ValidChild[]): this;
44
39
  swipeTrailing(actions: ValidChild | ValidChild[]): this;
45
- onClick(handler: (item: ListItem, event: MouseEvent) => void): this;
40
+ onClick(handler: (item: ListItemInterface, event: MouseEvent) => void): this;
46
41
 
47
42
  // HasEventEmitter
48
43
  on(event: string, handler: (...args: unknown[]) => void): this;
@@ -50,4 +45,8 @@ export declare class ListItem {
50
45
  hasListeners(event: string): boolean;
51
46
  }
52
47
 
53
- export declare function ListItem(props?: GlobalAttributes): ListItem;
48
+ export declare function ListItem(props?: GlobalAttributes): ListItemInterface;
49
+ export declare namespace ListItem {
50
+ function use(template: (description: ListItemDescription, instance: ListItemInterface) => ValidChild): void;
51
+ let defaultTemplate: ((description: ListItemDescription, instance: ListItemInterface) => ValidChild) | null;
52
+ }
@@ -53,6 +53,9 @@ export default function Menu(props = {}) {
53
53
  props,
54
54
  };
55
55
 
56
+
57
+ this.aria = { 'role': 'menu' };
58
+
56
59
  }
57
60
 
58
61
  BaseComponent.extends(Menu);
@@ -19,6 +19,7 @@ export default function MenuDivider(props = {}) {
19
19
  this.$description = {
20
20
  props,
21
21
  };
22
+ this.aria = { 'role': 'separator' };
22
23
  }
23
24
 
24
25
  BaseComponent.extends(MenuDivider);
@@ -39,6 +39,7 @@ export default function MenuGroup(label, props = {}) {
39
39
  collapsableClosedIcon: null,
40
40
  props,
41
41
  };
42
+ this.aria = { 'role': 'group' };
42
43
  }
43
44
 
44
45
  HasMenuItem.components.MenuGroup = MenuGroup;
@@ -51,6 +51,7 @@ export default function MenuItem(props = {}) {
51
51
  visibility: null,
52
52
  props,
53
53
  };
54
+ this.aria = { 'role': 'menuitem', 'tabindex': '-1' };
54
55
 
55
56
  }
56
57
 
@@ -21,6 +21,7 @@ export default function MenuLink(props = {}) {
21
21
  return new MenuLink(props);
22
22
  }
23
23
  MenuItem.call(this, props);
24
+ this.aria = { 'role': 'menuitem' };
24
25
  }
25
26
 
26
27
  MenuLink.prototype = Object.create(MenuItem.prototype);
@@ -67,6 +67,10 @@ export default function Modal(content, props = {}) {
67
67
  variant: null,
68
68
  props,
69
69
  };
70
+ this.aria = {
71
+ 'role': 'dialog',
72
+ 'aria-modal': 'true'
73
+ };
70
74
  }
71
75
 
72
76
  BaseComponent.extends(Modal);
@@ -50,6 +50,7 @@ export default function Pagination(props = {}) {
50
50
  render: null,
51
51
  props,
52
52
  };
53
+ this.aria = { 'role': 'navigation', 'aria-label': 'Pagination' };
53
54
 
54
55
  this.$element = null;
55
56
  }
@@ -64,6 +64,7 @@ export default function Popover(content, props = {}) {
64
64
  includeTriggerIntoGhost: true,
65
65
  props,
66
66
  };
67
+ this.aria = { 'role': 'tooltip' };
67
68
 
68
69
  this.$element = null;
69
70
 
@@ -24,6 +24,7 @@ export default function PopoverFooter(content, config = {}) {
24
24
  render: null,
25
25
  ...config,
26
26
  };
27
+ this.aria = { };
27
28
  }
28
29
 
29
30
  BaseComponent.extends(PopoverFooter);
@@ -25,6 +25,7 @@ export default function PopoverHeader(content, config = {}) {
25
25
  render: null,
26
26
  ...config,
27
27
  };
28
+ this.aria = { 'role': 'heading' };
28
29
  }
29
30
 
30
31
  BaseComponent.extends(PopoverHeader);
@@ -50,6 +50,11 @@ export default function Progress(props = {}) {
50
50
  borderRadiusType: null,
51
51
  props,
52
52
  };
53
+ this.aria = {
54
+ 'role': 'progressbar',
55
+ 'aria-valuemin': '0',
56
+ 'aria-valuemax': '100'
57
+ };
53
58
  }
54
59
 
55
60
  BaseComponent.extends(Progress);
@@ -42,6 +42,10 @@ export default function Skeleton(props = {}) {
42
42
  repeat: null,
43
43
  props,
44
44
  };
45
+ this.aria = {
46
+ 'aria-busy': 'true',
47
+ 'aria-live': 'polite'
48
+ };
45
49
  }
46
50
 
47
51
  BaseComponent.extends(Skeleton);
@@ -61,6 +61,7 @@ export default function Slider(name, props = {}) {
61
61
  renderThumb: null,
62
62
  props,
63
63
  };
64
+ this.aria = { 'role': 'slider', 'tabindex': '0' };
64
65
  }
65
66
 
66
67
  Slider.prototype = Object.create(Field.prototype);
@@ -9,6 +9,7 @@ export default function Spacer(props = {}) {
9
9
  type: 'spacer',
10
10
  props,
11
11
  };
12
+ this.aria = { 'aria-hidden': 'true' };
12
13
  }
13
14
  BaseComponent.extends(Spacer);
14
15
 
@@ -42,6 +42,7 @@ export default function Spinner(props = {}) {
42
42
  fullScreenOverlay: null,
43
43
  props,
44
44
  };
45
+ this.aria = { 'role': 'status', 'aria-label': 'Loading' };
45
46
  }
46
47
 
47
48
  Spinner.defaultTemplate = null;
@@ -33,6 +33,7 @@ export default function Splitter(props = {}) {
33
33
  render: null,
34
34
  props,
35
35
  };
36
+ this.aria = { 'role': 'group' };
36
37
 
37
38
  this.$element = null;
38
39
  }
@@ -33,6 +33,10 @@ export default function SplitterGutter(leftPanel, rightPanel, props = {}) {
33
33
  isDragging: $(false),
34
34
  props,
35
35
  };
36
+ this.aria = {
37
+ 'role': 'separator',
38
+ 'aria-orientation': 'horizontal',
39
+ };
36
40
  }
37
41
 
38
42
  BaseComponent.extends(SplitterGutter);
@@ -62,6 +66,7 @@ SplitterGutter.use = function(template) {
62
66
  SplitterGutter.prototype.vertical = function() {
63
67
  this.$description.orientation = 'vertical';
64
68
  this.$description.cursor = 'row-resize';
69
+ this.aria['aria-orientation'] = 'vertical';
65
70
  return this;
66
71
  };
67
72
 
@@ -71,6 +76,7 @@ SplitterGutter.prototype.vertical = function() {
71
76
  SplitterGutter.prototype.horizontal = function() {
72
77
  this.$description.orientation = 'horizontal';
73
78
  this.$description.cursor = 'col-resize';
79
+ this.aria['aria-orientation'] = 'horizontal';
74
80
  return this;
75
81
  };
76
82
 
@@ -37,6 +37,7 @@ export default function SplitterPanel(content, props = {}) {
37
37
  render: null,
38
38
  props,
39
39
  };
40
+ this.aria = { 'role': 'region' };
40
41
  }
41
42
 
42
43
  BaseComponent.extends(SplitterPanel);
@@ -15,6 +15,7 @@ export default function AbsoluteStack(content, props = {}) {
15
15
  }
16
16
  PositionStack.call(this, content, props);
17
17
  this.$description.position = 'absolute';
18
+ this.aria = {};
18
19
  }
19
20
 
20
21
  BaseComponent.extends(AbsoluteStack, PositionStack);
@@ -15,6 +15,7 @@ export default function FixedStack(content, props = {}) {
15
15
  }
16
16
  PositionStack.call(this, content, props);
17
17
  this.$description.position = 'fixed';
18
+ this.aria = {};
18
19
  }
19
20
 
20
21
  BaseComponent.extends(FixedStack, PositionStack);
@@ -16,6 +16,7 @@ export default function HStack(content, props = {}) {
16
16
 
17
17
  Stack.call(this, content, props);
18
18
  this.$description.orientation = 'horizontal';
19
+ this.aria = {};
19
20
  }
20
21
 
21
22
  BaseComponent.extends(HStack, Stack);
@@ -34,6 +34,7 @@ export default function PositionStack(content, props = {}) {
34
34
  anchor: null,
35
35
  props,
36
36
  };
37
+ this.aria = {};
37
38
  }
38
39
 
39
40
  BaseComponent.extends(PositionStack);
@@ -15,6 +15,7 @@ export default function RelativeStack(content, props = {}) {
15
15
  }
16
16
  PositionStack.call(this, content, props);
17
17
  this.$description.position = 'relative';
18
+ this.aria = {};
18
19
  }
19
20
 
20
21
  BaseComponent.extends(RelativeStack, PositionStack);
@@ -36,6 +36,7 @@ export default function Stack(content, props = {}) {
36
36
  reverse: false,
37
37
  props,
38
38
  };
39
+ this.aria = {};
39
40
  }
40
41
 
41
42
  BaseComponent.extends(Stack);
@@ -18,6 +18,7 @@ export default function VStack(content, props = {}) {
18
18
 
19
19
  this.$description.orientation = 'vertical';
20
20
  this.$description.alignment = 'leading';
21
+ this.aria = {};
21
22
  }
22
23
  BaseComponent.extends(VStack, Stack);
23
24
 
@@ -50,6 +50,7 @@ export default function Stepper(props = {}) {
50
50
  position: 'bottom',
51
51
  props,
52
52
  };
53
+ this.aria = { 'role': 'list' };
53
54
 
54
55
  this.$element = null;
55
56
  }
@@ -47,6 +47,7 @@ export default function StepperStep(label, props = {}) {
47
47
  isVisible: $(true),
48
48
  props,
49
49
  };
50
+ this.aria = { 'role': 'listitem', 'tabindex': '0' };
50
51
  }
51
52
 
52
53
  BaseComponent.extends(StepperStep);
@@ -43,6 +43,7 @@ export default function Switch(props = {}) {
43
43
  innerOnLabel: null,
44
44
  innerOffLabel: null,
45
45
  };
46
+ this.aria = { 'role': 'switch' };
46
47
  }
47
48
 
48
49
  BaseComponent.extends(Switch);
@@ -115,6 +115,7 @@ export default function DataTable(props = {}) {
115
115
  isExpandedIcon: null,
116
116
  isNotExpandedIcon: null,
117
117
  };
118
+ this.aria = { 'role': 'table' };
118
119
  }
119
120
 
120
121
  BaseComponent.extends(DataTable);
@@ -28,6 +28,7 @@ export default function SimpleTable(props = {}) {
28
28
  headerProps: null,
29
29
  props,
30
30
  };
31
+ this.aria = { 'role': 'table' };
31
32
  }
32
33
 
33
34
  BaseComponent.extends(SimpleTable);
@@ -47,6 +47,7 @@ export default function Tabs(props = {}) {
47
47
  renderPlusButton: null,
48
48
  props,
49
49
  };
50
+ this.aria = { 'role': 'tablist' };
50
51
  }
51
52
 
52
53
  BaseComponent.extends(Tabs);
@@ -45,6 +45,7 @@ export default function Toast(content, props = {}) {
45
45
  render: null,
46
46
  props,
47
47
  };
48
+ this.aria = { 'role': 'status', 'aria-live': 'polite' };
48
49
  }
49
50
 
50
51
  BaseComponent.extends(Toast);
@@ -47,6 +47,7 @@ export default function Tooltip(content, props = {}) {
47
47
  updatePositionOn: null,
48
48
  props,
49
49
  };
50
+ this.aria = { 'role': 'tooltip' };
50
51
  }
51
52
 
52
53
  BaseComponent.extends(Tooltip);
@@ -23,7 +23,12 @@ const MemoryManager = (function() {
23
23
  $observables.delete(id);
24
24
  },
25
25
  getObservableById(id) {
26
- return $observables.get(id)?.deref();
26
+ const observable = $observables.get(id);
27
+ if(!observable) {
28
+ $observables.delete(id);
29
+ return null;
30
+ }
31
+ return observable.deref();
27
32
  },
28
33
  cleanup() {
29
34
  for (const [_, weakObservableRef] of $observables) {