@oscarpalmer/oui 0.38.0 → 0.40.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 (264) hide show
  1. package/README.md +1 -1
  2. package/dist/css/badge.css +11 -8
  3. package/dist/css/button.css +106 -14
  4. package/dist/css/color-picker.css +555 -73
  5. package/dist/css/color.css +86 -86
  6. package/dist/css/combobox.css +98 -4
  7. package/dist/css/content.css +7 -6
  8. package/dist/css/floatable.css +1 -3
  9. package/dist/css/form.css +99 -6
  10. package/dist/css/icon.css +99 -0
  11. package/dist/css/listbox.css +3 -0
  12. package/dist/css/message.css +4 -3
  13. package/dist/css/mixins/button.mixins.css +1 -0
  14. package/dist/css/reset.css +1 -1
  15. package/dist/css/tabs.css +95 -3
  16. package/dist/css/typography.css +90 -0
  17. package/dist/js/color-picker/color-picker.constants.d.mts +2 -0
  18. package/dist/js/color-picker/color-picker.constants.mjs +60 -0
  19. package/dist/js/color-picker/color-picker.dom.d.mts +8 -0
  20. package/dist/js/color-picker/color-picker.dom.mjs +191 -0
  21. package/dist/js/color-picker/color-picker.event.d.mts +9 -0
  22. package/dist/js/color-picker/color-picker.event.mjs +2 -0
  23. package/dist/js/color-picker/color-picker.form.d.mts +5 -0
  24. package/dist/js/color-picker/color-picker.form.mjs +27 -0
  25. package/dist/js/color-picker/color-picker.misc.d.mts +2 -0
  26. package/dist/js/color-picker/color-picker.misc.mjs +2 -0
  27. package/dist/js/color-picker/color-picker.model.d.mts +2 -0
  28. package/dist/js/color-picker/color-picker.model.mjs +24 -0
  29. package/dist/js/color-picker/color-picker.output.d.mts +8 -0
  30. package/dist/js/color-picker/color-picker.output.mjs +235 -0
  31. package/dist/js/color-picker/color-picker.state.d.mts +8 -0
  32. package/dist/js/color-picker/color-picker.state.mjs +2 -0
  33. package/dist/js/{color-picker.d.mts → color-picker/index.d.mts} +10 -43
  34. package/dist/js/color-picker/index.mjs +305 -0
  35. package/dist/js/color-picker.constants-D1mxw_Le.d.mts +179 -0
  36. package/dist/js/color-picker.event-Cksj5TvS.mjs +500 -0
  37. package/dist/js/color-picker.misc-CtsXGrOe.d.mts +27 -0
  38. package/dist/js/combobox/combobox.constants.d.mts +2 -0
  39. package/dist/js/combobox/{constants.combobox.mjs → combobox.constants.mjs} +21 -21
  40. package/dist/js/combobox/combobox.dom.d.mts +26 -0
  41. package/dist/js/combobox/{dom.combobox.mjs → combobox.dom.mjs} +44 -37
  42. package/dist/js/combobox/combobox.event.d.mts +22 -0
  43. package/dist/js/combobox/{event.combobox.mjs → combobox.event.mjs} +1 -1
  44. package/dist/js/combobox/combobox.misc.d.mts +2 -0
  45. package/dist/js/combobox/{misc.combobox.mjs → combobox.misc.mjs} +1 -1
  46. package/dist/js/combobox/combobox.model.d.mts +2 -0
  47. package/dist/js/combobox/combobox.state.d.mts +10 -0
  48. package/dist/js/combobox/combobox.state.mjs +2 -0
  49. package/dist/js/combobox/index.d.mts +163 -2
  50. package/dist/js/combobox/index.mjs +53 -52
  51. package/dist/js/combobox.constants-DZVkMP5g.d.mts +19 -0
  52. package/dist/js/combobox.misc-C1tPZZDi.d.mts +22 -0
  53. package/dist/js/{combobox/models.combobox.d.mts → combobox.model-oDV06XCN.d.mts} +6 -6
  54. package/dist/js/{state.combobox-Qm3FWzYW.mjs → combobox.state-BfJ3Hxg8.mjs} +96 -82
  55. package/dist/js/constants.listbox-C5Ap6Ag_.d.mts +9 -0
  56. package/dist/js/dialog/dialog.model.d.mts +2 -0
  57. package/dist/js/dialog/dialog.model.mjs +11 -0
  58. package/dist/js/dialog/index.d.mts +12 -0
  59. package/dist/js/dialog/index.mjs +123 -0
  60. package/dist/js/dialog.model-DX2mndMh.d.mts +45 -0
  61. package/dist/js/floatable/floatable.embedded.d.mts +2 -2
  62. package/dist/js/floatable/floatable.embedded.mjs +64 -92
  63. package/dist/js/floatable/floatable.model.d.mts +2 -0
  64. package/dist/js/floatable/floatable.model.mjs +23 -0
  65. package/dist/js/floatable/floatable.standalone.d.mts +2 -1
  66. package/dist/js/floatable.embedded-MeTyXjFn.d.mts +17 -0
  67. package/dist/js/floatable.model-DXsQgoU7.d.mts +62 -0
  68. package/dist/js/focus-trap/focus-trap.embedded.d.mts +2 -2
  69. package/dist/js/focus-trap/focus-trap.embedded.mjs +112 -134
  70. package/dist/js/focus-trap/focus-trap.model.d.mts +2 -0
  71. package/dist/js/focus-trap/focus-trap.model.mjs +15 -0
  72. package/dist/js/focus-trap/focus-trap.standalone.d.mts +2 -1
  73. package/dist/js/focus-trap.embedded-DIU05m1z.d.mts +13 -0
  74. package/dist/js/{focus-trap.embedded-DR8NpZfr.d.mts → focus-trap.model-BeX6UYlw.d.mts} +16 -18
  75. package/dist/js/index.d.mts +26 -14
  76. package/dist/js/index.mjs +18 -15
  77. package/dist/js/internal/attributable.d.mts +2 -3
  78. package/dist/js/internal/attributable.mjs +3 -2
  79. package/dist/js/internal/draggable/draggable.model.d.mts +2 -0
  80. package/dist/js/internal/draggable/draggable.model.mjs +37 -0
  81. package/dist/js/internal/draggable/index.d.mts +13 -0
  82. package/dist/js/internal/{draggable.mjs → draggable/index.mjs} +83 -114
  83. package/dist/js/internal/listbox/listbox.constants.d.mts +7 -10
  84. package/dist/js/internal/listbox/listbox.constants.mjs +15 -16
  85. package/dist/js/internal/listbox/listbox.data.d.mts +9 -10
  86. package/dist/js/internal/listbox/listbox.data.mjs +1 -1
  87. package/dist/js/internal/listbox/listbox.dom.d.mts +19 -20
  88. package/dist/js/internal/listbox/listbox.dom.mjs +1 -1
  89. package/dist/js/internal/listbox/listbox.event.d.mts +3 -4
  90. package/dist/js/internal/listbox/listbox.event.mjs +23 -20
  91. package/dist/js/internal/listbox/listbox.form.d.mts +4 -5
  92. package/dist/js/internal/listbox/listbox.form.mjs +15 -12
  93. package/dist/js/internal/listbox/listbox.misc.d.mts +10 -11
  94. package/dist/js/internal/listbox/listbox.misc.mjs +1 -1
  95. package/dist/js/internal/listbox/listbox.model.d.mts +2 -2
  96. package/dist/js/internal/listbox/listbox.state.d.mts +5 -6
  97. package/dist/js/internal/listbox/listbox.state.mjs +19 -20
  98. package/dist/js/internal/misc.d.mts +5 -4
  99. package/dist/js/internal/misc.mjs +7 -1
  100. package/dist/js/internal/navigable/index.d.mts +6 -0
  101. package/dist/js/internal/navigable/index.mjs +125 -0
  102. package/dist/js/internal/navigable/navigable.model.d.mts +2 -0
  103. package/dist/js/internal/navigable/navigable.model.mjs +18 -0
  104. package/dist/js/l10n/index.d.mts +9 -0
  105. package/dist/js/{l10n.mjs → l10n/index.mjs} +50 -23
  106. package/dist/js/l10n/l10n.model.d.mts +2 -0
  107. package/dist/js/l10n/l10n.model.mjs +9 -0
  108. package/dist/js/l10n.model-D6a9frgl.d.mts +26 -0
  109. package/dist/js/listbox/constants.listbox.d.mts +2 -2
  110. package/dist/js/listbox/constants.listbox.mjs +10 -14
  111. package/dist/js/listbox/event.listbox.d.mts +6 -7
  112. package/dist/js/listbox/event.listbox.mjs +47 -1
  113. package/dist/js/listbox/index.d.mts +8 -6
  114. package/dist/js/listbox/index.mjs +47 -49
  115. package/dist/js/listbox/misc.listbox.d.mts +1 -1
  116. package/dist/js/listbox/misc.listbox.mjs +1 -1
  117. package/dist/js/listbox/state.listbox.d.mts +8 -10
  118. package/dist/js/listbox/state.listbox.mjs +2 -2
  119. package/dist/js/{listbox.data-C7CRa5Ya.mjs → listbox.data-BQyZGKgr.mjs} +83 -66
  120. package/dist/js/{listbox.model-CRReGOmu.d.mts → listbox.model-CuBOj4qe.d.mts} +15 -11
  121. package/dist/js/menu/index.mjs +167 -0
  122. package/dist/js/menu/menu.model.d.mts +33 -0
  123. package/dist/js/menu/menu.model.mjs +15 -0
  124. package/dist/js/{misc.listbox-Cyz2CRDy.mjs → misc.listbox-CjfBUbHD.mjs} +27 -69
  125. package/dist/js/{misc.listbox-gnoJhrTr.d.mts → misc.listbox-CtoGvXQo.d.mts} +2 -2
  126. package/dist/js/movable/movable.embedded.d.mts +2 -2
  127. package/dist/js/movable/movable.embedded.mjs +60 -72
  128. package/dist/js/movable/movable.model.d.mts +2 -0
  129. package/dist/js/movable/movable.model.mjs +12 -0
  130. package/dist/js/movable/movable.standalone.d.mts +2 -1
  131. package/dist/js/movable.embedded-DoyXLegc.d.mts +11 -0
  132. package/dist/js/movable.model-BHaK_mKw.d.mts +186 -0
  133. package/dist/js/navigable.model-BPOM8DZk.d.mts +44 -0
  134. package/dist/js/popover/index.d.mts +12 -0
  135. package/dist/js/{popover.mjs → popover/index.mjs} +40 -50
  136. package/dist/js/popover/popover.model.d.mts +2 -0
  137. package/dist/js/popover/popover.model.mjs +12 -0
  138. package/dist/js/popover.model-ubKNG612.d.mts +38 -0
  139. package/dist/js/resizable/resizable.embedded.d.mts +2 -2
  140. package/dist/js/resizable/resizable.embedded.mjs +44 -59
  141. package/dist/js/resizable/resizable.model.d.mts +2 -0
  142. package/dist/js/resizable/resizable.model.mjs +21 -0
  143. package/dist/js/resizable/resizable.standalone.d.mts +2 -1
  144. package/dist/js/resizable.embedded-Bf1qBUdt.d.mts +11 -0
  145. package/dist/js/resizable.model-BwzJcTVJ.d.mts +46 -0
  146. package/dist/js/sortable/sortable.embedded.d.mts +2 -2
  147. package/dist/js/sortable/sortable.embedded.mjs +69 -82
  148. package/dist/js/sortable/sortable.model.d.mts +2 -0
  149. package/dist/js/sortable/sortable.model.mjs +24 -0
  150. package/dist/js/sortable/sortable.standalone.d.mts +2 -1
  151. package/dist/js/sortable.embedded-DzBKAwSG.d.mts +11 -0
  152. package/dist/js/{splitter.d.mts → splitter/index.d.mts} +8 -7
  153. package/dist/js/splitter/index.mjs +284 -0
  154. package/dist/js/splitter/splitter.model.d.mts +2 -0
  155. package/dist/js/splitter/splitter.model.mjs +37 -0
  156. package/dist/js/splitter.model-DOLNjLVS.d.mts +57 -0
  157. package/dist/js/{tabs.d.mts → tabs/index.d.mts} +7 -8
  158. package/dist/js/{tabs.mjs → tabs/index.mjs} +58 -58
  159. package/dist/js/tabs/tabs.model.d.mts +2 -0
  160. package/dist/js/tabs/tabs.model.mjs +18 -0
  161. package/dist/js/tabs.model-DRBX_JtI.d.mts +40 -0
  162. package/dist/js/toolbar/index.mjs +27 -0
  163. package/dist/js/toolbar/toolbar.model.d.mts +11 -0
  164. package/dist/js/toolbar/toolbar.model.mjs +7 -0
  165. package/dist/js/tooltip/index.d.mts +19 -0
  166. package/dist/js/{tooltip.mjs → tooltip/index.mjs} +60 -85
  167. package/dist/js/tooltip/tooltip.model.d.mts +2 -0
  168. package/dist/js/tooltip/tooltip.model.mjs +15 -0
  169. package/dist/js/tooltip.model-DRkY_BsL.d.mts +37 -0
  170. package/package.json +43 -37
  171. package/dist/js/color-picker.mjs +0 -924
  172. package/dist/js/combobox/constants.combobox.d.mts +0 -2
  173. package/dist/js/combobox/dom.combobox.d.mts +0 -27
  174. package/dist/js/combobox/event.combobox.d.mts +0 -23
  175. package/dist/js/combobox/misc.combobox.d.mts +0 -2
  176. package/dist/js/combobox/state.combobox.d.mts +0 -12
  177. package/dist/js/combobox/state.combobox.mjs +0 -2
  178. package/dist/js/constants.combobox-DmRAMC64.d.mts +0 -26
  179. package/dist/js/constants.listbox-DRsXUxd3.d.mts +0 -14
  180. package/dist/js/dialog.d.mts +0 -47
  181. package/dist/js/dialog.mjs +0 -131
  182. package/dist/js/draggable-a6w0J1OD.d.mts +0 -154
  183. package/dist/js/floatable.embedded-Bct4U5Dm.d.mts +0 -69
  184. package/dist/js/index-DJdFlTLm.d.mts +0 -177
  185. package/dist/js/internal/draggable.d.mts +0 -2
  186. package/dist/js/internal/navigable.d.mts +0 -37
  187. package/dist/js/internal/navigable.mjs +0 -135
  188. package/dist/js/l10n-Bn-7RcwR.d.mts +0 -20
  189. package/dist/js/l10n.d.mts +0 -2
  190. package/dist/js/menu.mjs +0 -172
  191. package/dist/js/popover.d.mts +0 -38
  192. package/dist/js/resizable.embedded-3qoR0Bjm.d.mts +0 -34
  193. package/dist/js/splitter.mjs +0 -322
  194. package/dist/js/toolbar.mjs +0 -31
  195. package/dist/js/tooltip.d.mts +0 -45
  196. package/src/css/a11y.scss +0 -13
  197. package/src/css/badge.scss +0 -62
  198. package/src/css/button.scss +0 -50
  199. package/src/css/color-picker.scss +0 -344
  200. package/src/css/color.scss +0 -113
  201. package/src/css/combobox.scss +0 -255
  202. package/src/css/content.scss +0 -181
  203. package/src/css/flex.scss +0 -107
  204. package/src/css/floatable.scss +0 -155
  205. package/src/css/form.scss +0 -575
  206. package/src/css/listbox.scss +0 -121
  207. package/src/css/message.scss +0 -74
  208. package/src/css/mixins/badge.mixins.scss +0 -53
  209. package/src/css/mixins/button.mixins.scss +0 -112
  210. package/src/css/mixins/input.mixins.scss +0 -114
  211. package/src/css/mixins/message.mixins.scss +0 -41
  212. package/src/css/mixins/misc.mixins.scss +0 -48
  213. package/src/css/mixins/shadow.mixins.scss +0 -57
  214. package/src/css/reset.scss +0 -392
  215. package/src/css/splitter.scss +0 -89
  216. package/src/css/table.scss +0 -107
  217. package/src/css/tabs.scss +0 -74
  218. package/src/js/color-picker.ts +0 -1653
  219. package/src/js/combobox/constants.combobox.ts +0 -83
  220. package/src/js/combobox/dom.combobox.ts +0 -411
  221. package/src/js/combobox/event.combobox.ts +0 -365
  222. package/src/js/combobox/index.ts +0 -382
  223. package/src/js/combobox/misc.combobox.ts +0 -104
  224. package/src/js/combobox/models.combobox.ts +0 -54
  225. package/src/js/combobox/state.combobox.ts +0 -246
  226. package/src/js/dialog.ts +0 -255
  227. package/src/js/floatable/floatable.embedded.ts +0 -336
  228. package/src/js/floatable/floatable.standalone.ts +0 -6
  229. package/src/js/focus-trap/focus-trap.embedded.ts +0 -411
  230. package/src/js/focus-trap/focus-trap.standalone.ts +0 -1
  231. package/src/js/index.ts +0 -16
  232. package/src/js/internal/attributable.ts +0 -73
  233. package/src/js/internal/draggable.ts +0 -657
  234. package/src/js/internal/listbox/listbox.constants.ts +0 -25
  235. package/src/js/internal/listbox/listbox.data.ts +0 -287
  236. package/src/js/internal/listbox/listbox.dom.ts +0 -446
  237. package/src/js/internal/listbox/listbox.event.ts +0 -129
  238. package/src/js/internal/listbox/listbox.form.ts +0 -125
  239. package/src/js/internal/listbox/listbox.misc.ts +0 -135
  240. package/src/js/internal/listbox/listbox.model.ts +0 -169
  241. package/src/js/internal/listbox/listbox.state.ts +0 -82
  242. package/src/js/internal/misc.ts +0 -27
  243. package/src/js/internal/navigable.ts +0 -317
  244. package/src/js/l10n.ts +0 -192
  245. package/src/js/listbox/constants.listbox.ts +0 -61
  246. package/src/js/listbox/event.listbox.ts +0 -106
  247. package/src/js/listbox/index.ts +0 -364
  248. package/src/js/listbox/misc.listbox.ts +0 -70
  249. package/src/js/listbox/state.listbox.ts +0 -194
  250. package/src/js/menu.ts +0 -348
  251. package/src/js/movable/movable.embedded.ts +0 -318
  252. package/src/js/movable/movable.standalone.ts +0 -2
  253. package/src/js/popover.ts +0 -229
  254. package/src/js/resizable/resizable.embedded.ts +0 -413
  255. package/src/js/resizable/resizable.standalone.ts +0 -5
  256. package/src/js/sortable/sortable.embedded.ts +0 -527
  257. package/src/js/sortable/sortable.standalone.ts +0 -2
  258. package/src/js/splitter.ts +0 -583
  259. package/src/js/tabs.ts +0 -441
  260. package/src/js/toolbar.ts +0 -63
  261. package/src/js/tooltip.ts +0 -367
  262. /package/dist/js/combobox/{models.combobox.mjs → combobox.model.mjs} +0 -0
  263. /package/dist/js/{menu.d.mts → menu/index.d.mts} +0 -0
  264. /package/dist/js/{toolbar.d.mts → toolbar/index.d.mts} +0 -0
package/src/js/tabs.ts DELETED
@@ -1,441 +0,0 @@
1
- import {getAria, setAria} from '@oscarpalmer/toretto/aria';
2
- import {getAttribute, setAttribute} from '@oscarpalmer/toretto/attribute';
3
- import {createElement} from '@oscarpalmer/toretto/create';
4
- import {
5
- getNavigableOrientation,
6
- OuiNavigable,
7
- type OuiNavigableOrientation,
8
- } from './internal/navigable';
9
-
10
- // #region Types
11
-
12
- declare global {
13
- interface HTMLElementTagNameMap {
14
- [TAGNAME]: OuiTabsElement;
15
- }
16
- }
17
-
18
- export class OuiTabsEvent extends Event {
19
- constructor(
20
- name: 'oui:beforechange' | 'oui:change',
21
- public oldIndex: number,
22
- public newIndex: number,
23
- cancelable: boolean,
24
- ) {
25
- super(name, {
26
- cancelable,
27
- bubbles: true,
28
- composed: true,
29
- });
30
- }
31
- }
32
-
33
- type OuiTabsContent = {
34
- element: HTMLDivElement;
35
- panels: OuiTabsPanels;
36
- };
37
-
38
- export class OuiTabsElement extends HTMLElement {
39
- static observedAttributes = ['active'];
40
-
41
- #state?: OuiTabsState;
42
-
43
- get active(): number {
44
- return this.#state?.active ?? 0;
45
- }
46
-
47
- set active(value: number) {
48
- setActive(this.#state, value);
49
- }
50
-
51
- get panel(): HTMLElement {
52
- return this.#state?.panels.elements[this.active] as HTMLElement;
53
- }
54
-
55
- get tab(): HTMLButtonElement {
56
- return this.#state?.tabList.tabs[this.active] as HTMLButtonElement;
57
- }
58
-
59
- attributeChangedCallback(name: string, _: string | null, value: string | null): void {
60
- switch (name) {
61
- case 'active':
62
- setActive(this.#state, value);
63
- break;
64
-
65
- default:
66
- break;
67
- }
68
- }
69
-
70
- connectedCallback(): void {
71
- if (this.#state == null) {
72
- this.#state = initializeTabs(this);
73
- } else {
74
- attachTabs(this.#state);
75
- }
76
- }
77
-
78
- disconnectedCallback(): void {
79
- if (this.#state != null) {
80
- detachTabs(this.#state);
81
- }
82
- }
83
- }
84
-
85
- type OuiTabsPanels = {
86
- elements: HTMLElement[];
87
- hidden: Array<boolean | 'until-found'>;
88
- roles: Array<string | null>;
89
- };
90
-
91
- type OuiTabsState = {
92
- active: number;
93
- content: HTMLDivElement;
94
- host: OuiTabsElement;
95
- id: string;
96
- navigable?: OuiNavigable;
97
- orientation: OuiNavigableOrientation;
98
- panels: OuiTabsPanels;
99
- tabList: OuiTabsTabList;
100
- };
101
-
102
- type OuiTabsTabList = {
103
- element: HTMLDivElement;
104
- tabs: HTMLButtonElement[];
105
- };
106
-
107
- // #endregion
108
-
109
- // #region Functions
110
-
111
- function attachTabs(state: OuiTabsState): void {
112
- const navigable = new OuiNavigable(state.tabList.element, {
113
- orientation: state.orientation,
114
- selector: SELECTOR_TAB,
115
- vertical: false,
116
- onActivate: navigable => {
117
- const index = state.tabList.tabs.indexOf(navigable.active.element as HTMLButtonElement);
118
-
119
- if (index > -1 && index !== state.active) {
120
- onActivate(state, index);
121
- }
122
- },
123
- });
124
-
125
- state.navigable = navigable;
126
-
127
- const {length} = state.panels.elements;
128
-
129
- for (let index = 0; index < length; index += 1) {
130
- const panel = state.panels.elements[index];
131
-
132
- panel.hidden = index !== state.active;
133
- panel.role = 'tabpanel';
134
-
135
- if (index === 0) {
136
- panel.insertAdjacentElement('beforebegin', state.tabList.element);
137
- panel.insertAdjacentElement('beforebegin', state.content);
138
- }
139
-
140
- state.content.append(panel);
141
- }
142
- }
143
-
144
- function createContent(prefix: string, panels: HTMLElement[], active: number): OuiTabsContent {
145
- const content = createElement('div', {
146
- attribute: {
147
- [`${TAGNAME}-content`]: '',
148
- },
149
- });
150
-
151
- const {length} = panels;
152
-
153
- const hidden: Array<boolean | 'until-found'> = [];
154
- const roles: Array<string | null> = [];
155
-
156
- for (let index = 0; index < length; index += 1) {
157
- const panel = panels[index];
158
-
159
- hidden.push(panel.hidden);
160
- roles.push(panel.role);
161
-
162
- panel.hidden = index !== active;
163
-
164
- if (panel.id === '') {
165
- panel.id = `${prefix}_panel_${index}`;
166
- }
167
- }
168
-
169
- return {
170
- element: content,
171
- panels: {
172
- hidden,
173
- roles,
174
- elements: panels,
175
- },
176
- };
177
- }
178
-
179
- function createTab(
180
- prefix: string,
181
- index: number,
182
- panel: HTMLElement,
183
- label: string,
184
- selected: boolean,
185
- ): HTMLButtonElement {
186
- return createElement('button', {
187
- aria: {
188
- selected,
189
- controls: panel.id,
190
- },
191
- attribute: {
192
- [`${TAGNAME}-tab`]: '',
193
- },
194
- property: {
195
- id: `${prefix}_tab_${index}`,
196
- role: 'tab',
197
- tabIndex: selected ? 0 : -1,
198
- textContent: label,
199
- type: 'button',
200
- },
201
- });
202
- }
203
-
204
- function createTabList(
205
- prefix: string,
206
- panels: HTMLElement[],
207
- labels: string[],
208
- active: number,
209
- ): OuiTabsTabList {
210
- const element = createElement('div', {
211
- attribute: {
212
- [`${TAGNAME}-tablist`]: '',
213
- },
214
- property: {
215
- role: 'tablist',
216
- },
217
- });
218
-
219
- const {length} = panels;
220
-
221
- const tabs: HTMLButtonElement[] = [];
222
-
223
- for (let index = 0; index < length; index += 1) {
224
- const tab = createTab(prefix, index, panels[index], labels[index], index === active);
225
-
226
- element.append(tab);
227
- tabs.push(tab);
228
- }
229
-
230
- return {
231
- element,
232
- tabs,
233
- };
234
- }
235
-
236
- function detachTabs(state: OuiTabsState): void {
237
- state.navigable?.destroy();
238
-
239
- const {length} = state.panels.elements;
240
-
241
- for (let index = 0; index < length; index += 1) {
242
- const panel = state.panels.elements[index];
243
-
244
- panel.hidden = state.panels.hidden[index];
245
- panel.role = state.panels.roles[index];
246
-
247
- state.content.before(panel);
248
- }
249
-
250
- state.tabList.element.remove();
251
- state.content.remove();
252
- }
253
-
254
- function getActive(element: OuiTabsElement, max: number): number {
255
- const attribute = getAttribute(element, 'active');
256
-
257
- let index = 0;
258
-
259
- if (attribute != null) {
260
- const value = Number.parseInt(attribute, 10);
261
-
262
- if (!Number.isNaN(value) && value >= 0) {
263
- index = value > max ? max : value;
264
- }
265
- }
266
-
267
- return index;
268
- }
269
-
270
- function getId(): string {
271
- index += 1;
272
-
273
- return `oui_tabs_${index}`;
274
- }
275
-
276
- function getLabels(panels: HTMLElement[]): string[] | undefined {
277
- const labels: string[] = [];
278
-
279
- const {length} = panels;
280
-
281
- for (let index = 0; index < length; index += 1) {
282
- const panel = panels[index];
283
-
284
- const labelledBy = getAria(panel, 'labelledby');
285
-
286
- if (typeof labelledBy === 'string' && labelledBy.trim().length > 0) {
287
- const label: string[] = [];
288
- const selectors = labelledBy.split(/\s+/);
289
-
290
- for (const selector of selectors) {
291
- const element = document.getElementById(selector);
292
-
293
- if (element == null) {
294
- return;
295
- }
296
-
297
- label.push(element.textContent);
298
- }
299
-
300
- labels.push(label.join(' '));
301
-
302
- continue;
303
- }
304
-
305
- const label = getAria(panel, 'label');
306
-
307
- if (typeof label === 'string' && label.trim().length > 0) {
308
- labels.push(label);
309
-
310
- continue;
311
- }
312
-
313
- return;
314
- }
315
-
316
- return labels;
317
- }
318
-
319
- function initializeTabs(element: OuiTabsElement): OuiTabsState {
320
- const panels = [...element.querySelectorAll(SELECTOR_PANEL)] as HTMLElement[];
321
-
322
- if (panels.length === 0) {
323
- throw new Error(MESSAGE_EMPTY);
324
- }
325
-
326
- const labels = getLabels(panels);
327
-
328
- if (labels == null) {
329
- throw new Error(MESSAGE_INVALID);
330
- }
331
-
332
- let id: string;
333
-
334
- if (element.id === '') {
335
- id = getId();
336
- } else {
337
- id = element.id;
338
- }
339
-
340
- const active = getActive(element, panels.length - 1);
341
- const orientation = getNavigableOrientation(element, false, false);
342
-
343
- const content = createContent(id, panels, active);
344
- const tabList = createTabList(id, panels, labels, active);
345
-
346
- const state: OuiTabsState = {
347
- active,
348
- id,
349
- orientation,
350
- tabList,
351
- content: content.element,
352
- host: element,
353
- panels: content.panels,
354
- };
355
-
356
- attachTabs(state);
357
-
358
- return state;
359
- }
360
-
361
- function onActivate(state: OuiTabsState, next: number): void {
362
- const current = state.active;
363
-
364
- const event = new OuiTabsEvent('oui:beforechange', current, next, true);
365
-
366
- state.host.dispatchEvent(event);
367
-
368
- if (event.defaultPrevented) {
369
- return;
370
- }
371
-
372
- state.active = next;
373
-
374
- const {length} = state.panels.elements;
375
-
376
- for (let index = 0; index < length; index += 1) {
377
- const panel = state.panels.elements[index];
378
-
379
- panel.hidden = index !== next;
380
-
381
- setAria(state.tabList.tabs[index], 'selected', index === next);
382
- }
383
-
384
- setAttribute(state.host, 'active', next);
385
-
386
- state.host.dispatchEvent(new OuiTabsEvent('oui:change', current, next, false));
387
- }
388
-
389
- function setActive(state: OuiTabsState | undefined, value: unknown): void {
390
- if (state == null) {
391
- return;
392
- }
393
-
394
- const max = state.panels.elements.length - 1;
395
-
396
- let index: number | undefined;
397
-
398
- if (typeof value === 'number' && !Number.isNaN(value) && value >= 0) {
399
- index = value > max ? max : value;
400
- } else if (typeof value === 'string') {
401
- const parsed = Number.parseInt(value, 10);
402
-
403
- if (!Number.isNaN(parsed) && parsed >= 0) {
404
- index = parsed > max ? max : parsed;
405
- }
406
- }
407
-
408
- if (index == null) {
409
- setAttribute(state.host, 'active', state.active);
410
- } else if (index !== state.active) {
411
- state.navigable?.navigate(index, false);
412
-
413
- onActivate(state, index);
414
- }
415
- }
416
-
417
- // #endregion
418
-
419
- // #region Variables
420
-
421
- const TAGNAME = 'oui-tabs';
422
-
423
- const ATTRIBUTE_PANEL = `${TAGNAME}-panel`;
424
-
425
- const MESSAGE_EMPTY = `<${TAGNAME}> must contain at least one [${ATTRIBUTE_PANEL}] child element`;
426
-
427
- const MESSAGE_INVALID = `A [${ATTRIBUTE_PANEL}] child element of <${TAGNAME}> must have a valid 'aria-label' or 'aria-labelledby' attribute`;
428
-
429
- const SELECTOR_PANEL = `:scope > [${ATTRIBUTE_PANEL}]`;
430
-
431
- const SELECTOR_TAB = `[${TAGNAME}-tab]`;
432
-
433
- let index = 0;
434
-
435
- // #endregion
436
-
437
- // #region Initialization
438
-
439
- customElements.define(TAGNAME, OuiTabsElement);
440
-
441
- // #endregion
package/src/js/toolbar.ts DELETED
@@ -1,63 +0,0 @@
1
- import {attributable} from './internal/attributable';
2
- import {getNavigable, OuiNavigable, updateNavigableFocus} from './internal/navigable';
3
-
4
- // #region Types
5
-
6
- class OuiToolbar {
7
- #navigable: OuiNavigable;
8
-
9
- constructor(navigable: OuiNavigable) {
10
- this.#navigable = navigable;
11
-
12
- updateNavigableFocus(this.#navigable, false);
13
- }
14
-
15
- destroy(): void {
16
- this.#navigable.destroy();
17
-
18
- this.#navigable = undefined as never;
19
- }
20
- }
21
-
22
- // #endregion
23
-
24
- // #region Functions
25
-
26
- function addToolbar(element: HTMLElement): void {
27
- if (!instances.has(element)) {
28
- instances.set(
29
- element,
30
- new OuiToolbar(
31
- getNavigable(element, {
32
- role: 'toolbar',
33
- selector: SELECTOR,
34
- vertical: false,
35
- }),
36
- ),
37
- );
38
- }
39
- }
40
-
41
- function removeToolbar(element: HTMLElement): void {
42
- instances.get(element)?.destroy();
43
-
44
- instances.delete(element);
45
- }
46
-
47
- // #endregion
48
-
49
- // #region Variables
50
-
51
- const ATTRIBUTE = 'oui-toolbar';
52
-
53
- const SELECTOR = `[${ATTRIBUTE}-item]`;
54
-
55
- const instances = new WeakMap<HTMLElement, OuiToolbar>();
56
-
57
- // #endregion
58
-
59
- // #region Initialization
60
-
61
- attributable(ATTRIBUTE, addToolbar, removeToolbar);
62
-
63
- // #endregion