@shortfuse/materialdesignweb 0.5.0 → 0.7.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 (418) hide show
  1. package/README.md +155 -77
  2. package/bin/generate-css.js +12 -0
  3. package/components/Badge.css +30 -0
  4. package/components/Badge.js +15 -0
  5. package/components/Body.css +14 -0
  6. package/components/Body.js +7 -0
  7. package/components/BottomAppBar.css +23 -0
  8. package/components/BottomAppBar.js +25 -0
  9. package/components/Box.css +31 -0
  10. package/components/Box.js +24 -0
  11. package/components/Button.css +146 -0
  12. package/components/Button.js +95 -0
  13. package/components/Button.md +61 -0
  14. package/components/Card.css +109 -0
  15. package/components/Card.js +82 -0
  16. package/components/Checkbox.css +77 -0
  17. package/components/Checkbox.js +59 -0
  18. package/components/CheckboxIcon.css +89 -0
  19. package/components/CheckboxIcon.js +41 -0
  20. package/components/Chip.css +35 -0
  21. package/components/Chip.js +22 -0
  22. package/components/Dialog.css +235 -0
  23. package/components/Dialog.js +327 -0
  24. package/components/DialogActions.js +13 -0
  25. package/components/Divider.css +41 -0
  26. package/components/Divider.js +13 -0
  27. package/components/ExtendedFab.css +24 -0
  28. package/components/ExtendedFab.js +11 -0
  29. package/components/Fab.css +23 -0
  30. package/components/Fab.js +26 -0
  31. package/components/FilterChip.css +80 -0
  32. package/components/FilterChip.js +51 -0
  33. package/components/Headline.css +14 -0
  34. package/components/Headline.js +33 -0
  35. package/components/Icon.css +76 -0
  36. package/components/Icon.js +174 -0
  37. package/components/IconButton.css +151 -0
  38. package/components/IconButton.js +65 -0
  39. package/components/Input.js +16 -0
  40. package/components/Label.css +14 -0
  41. package/components/Label.js +7 -0
  42. package/components/Layout.css +19 -0
  43. package/components/Layout.js +12 -0
  44. package/components/List.css +12 -0
  45. package/components/List.js +17 -0
  46. package/components/ListItem.css +224 -0
  47. package/components/ListItem.js +112 -0
  48. package/components/ListOption.css +34 -0
  49. package/components/ListOption.js +122 -0
  50. package/components/ListSelect.css +9 -0
  51. package/components/ListSelect.js +206 -0
  52. package/components/Menu.css +171 -0
  53. package/components/Menu.js +470 -0
  54. package/components/MenuItem.css +53 -0
  55. package/components/MenuItem.js +215 -0
  56. package/components/Nav.css +17 -0
  57. package/components/Nav.js +23 -0
  58. package/components/NavBar.css +34 -0
  59. package/components/NavBar.js +88 -0
  60. package/components/NavBarItem.css +41 -0
  61. package/components/NavBarItem.js +7 -0
  62. package/components/NavDrawer.css +31 -0
  63. package/components/NavDrawer.js +13 -0
  64. package/components/NavDrawerItem.css +42 -0
  65. package/components/NavDrawerItem.js +12 -0
  66. package/components/NavItem.css +181 -0
  67. package/components/NavItem.js +83 -0
  68. package/components/NavRail.css +47 -0
  69. package/components/NavRail.js +17 -0
  70. package/components/NavRailItem.css +25 -0
  71. package/components/NavRailItem.js +7 -0
  72. package/components/Option.js +91 -0
  73. package/components/Outline.css +138 -0
  74. package/components/Pane.css +261 -0
  75. package/components/Pane.js +21 -0
  76. package/components/Progress.css +74 -0
  77. package/components/Progress.js +67 -0
  78. package/components/ProgressCircle.css +226 -0
  79. package/components/ProgressLine.css +155 -0
  80. package/components/Radio.css +83 -0
  81. package/components/Radio.js +42 -0
  82. package/components/RadioIcon.css +73 -0
  83. package/components/RadioIcon.js +37 -0
  84. package/components/Ripple.css +74 -0
  85. package/components/Ripple.js +114 -0
  86. package/components/SegmentedButton.css +94 -0
  87. package/components/SegmentedButton.js +49 -0
  88. package/components/SegmentedButtonGroup.css +12 -0
  89. package/components/SegmentedButtonGroup.js +44 -0
  90. package/components/Select.css +52 -0
  91. package/components/Select.js +71 -0
  92. package/components/Shape.css +132 -0
  93. package/components/Shape.js +25 -0
  94. package/components/Slider.css +306 -0
  95. package/components/Slider.js +206 -0
  96. package/components/Snackbar.css +80 -0
  97. package/components/Snackbar.js +75 -0
  98. package/components/Surface.css +10 -0
  99. package/components/Surface.js +23 -0
  100. package/components/Switch.css +63 -0
  101. package/components/Switch.js +127 -0
  102. package/components/SwitchIcon.css +177 -0
  103. package/components/SwitchIcon.js +89 -0
  104. package/components/SwitchIconAnimations.css +89 -0
  105. package/components/Tab.css +85 -0
  106. package/components/Tab.js +103 -0
  107. package/components/TabContent.js +151 -0
  108. package/components/TabList.css +129 -0
  109. package/components/TabList.js +309 -0
  110. package/components/TabPanel.js +37 -0
  111. package/components/TextArea.css +93 -0
  112. package/components/TextArea.js +229 -0
  113. package/components/Title.css +14 -0
  114. package/components/Title.js +15 -0
  115. package/components/Tooltip.css +40 -0
  116. package/components/Tooltip.js +22 -0
  117. package/components/TopAppBar.css +209 -0
  118. package/components/TopAppBar.js +201 -0
  119. package/core/Composition.js +988 -0
  120. package/core/CustomElement.js +844 -0
  121. package/core/ICustomElement.d.ts +288 -0
  122. package/core/ICustomElement.js +1 -0
  123. package/core/css.js +51 -0
  124. package/core/customTypes.js +125 -0
  125. package/core/dom.js +56 -154
  126. package/core/identify.js +40 -0
  127. package/core/observe.js +410 -0
  128. package/core/template.js +121 -0
  129. package/core/typings.d.ts +135 -0
  130. package/core/typings.js +1 -0
  131. package/mixins/AriaReflectorMixin.js +42 -0
  132. package/mixins/AriaToolbarMixin.js +13 -0
  133. package/mixins/ControlMixin.css +57 -0
  134. package/mixins/ControlMixin.js +212 -0
  135. package/mixins/DensityMixin.css +40 -0
  136. package/mixins/DensityMixin.js +11 -0
  137. package/mixins/FlexableMixin.css +79 -0
  138. package/mixins/FlexableMixin.js +32 -0
  139. package/mixins/FormAssociatedMixin.js +170 -0
  140. package/mixins/InputMixin.js +335 -0
  141. package/mixins/KeyboardNavMixin.js +244 -0
  142. package/mixins/RTLObserverMixin.js +35 -0
  143. package/mixins/ResizeObserverMixin.js +38 -0
  144. package/mixins/RippleMixin.css +12 -0
  145. package/mixins/RippleMixin.js +115 -0
  146. package/mixins/ScrollListenerMixin.js +100 -0
  147. package/mixins/ShapeMixin.css +135 -0
  148. package/mixins/ShapeMixin.js +31 -0
  149. package/mixins/StateMixin.css +82 -0
  150. package/mixins/StateMixin.js +114 -0
  151. package/mixins/SurfaceMixin.css +150 -0
  152. package/mixins/SurfaceMixin.js +32 -0
  153. package/mixins/TextFieldMixin.css +657 -0
  154. package/mixins/TextFieldMixin.js +121 -0
  155. package/mixins/ThemableMixin.css +204 -0
  156. package/mixins/ThemableMixin.js +16 -0
  157. package/mixins/TooltipTriggerMixin.css +27 -0
  158. package/mixins/TooltipTriggerMixin.js +366 -0
  159. package/mixins/TouchTargetMixin.css +26 -0
  160. package/mixins/TouchTargetMixin.js +9 -0
  161. package/package.json +54 -49
  162. package/theming/index.js +594 -0
  163. package/theming/loader.js +24 -0
  164. package/utils/cli.js +11 -0
  165. package/utils/color_keywords.js +151 -0
  166. package/utils/hct/Cam16.js +298 -0
  167. package/utils/hct/CorePalette.js +84 -0
  168. package/utils/hct/Hct.js +172 -0
  169. package/utils/hct/Scheme.js +587 -0
  170. package/utils/hct/TonalPalette.js +68 -0
  171. package/utils/hct/ViewingConditions.js +136 -0
  172. package/utils/hct/blend.js +93 -0
  173. package/utils/hct/colorUtils.js +302 -0
  174. package/utils/hct/hctSolver.js +559 -0
  175. package/utils/hct/helper.js +182 -0
  176. package/utils/hct/mathUtils.js +153 -0
  177. package/utils/jsonMergePatch.js +100 -0
  178. package/utils/jsx-runtime.js +101 -0
  179. package/utils/popup.js +117 -0
  180. package/utils/svg.js +129 -0
  181. package/.browserslistrc +0 -4
  182. package/.eslintrc.json +0 -204
  183. package/.stylelintrc.json +0 -645
  184. package/.vscode/launch.json +0 -31
  185. package/.vscode/settings.json +0 -3
  186. package/.vscode/tasks.json +0 -32
  187. package/CHANGELOG.md +0 -36
  188. package/CODE_OF_CONDUCT.md +0 -46
  189. package/adapters/datatable/column.js +0 -176
  190. package/adapters/datatable/index.js +0 -960
  191. package/adapters/dom/index.js +0 -586
  192. package/adapters/list/index.js +0 -69
  193. package/adapters/search/index.js +0 -495
  194. package/components/appbar/_spec.scss +0 -165
  195. package/components/appbar/_theme.scss +0 -0
  196. package/components/appbar/index.scss +0 -2
  197. package/components/banner/_spec.scss +0 -83
  198. package/components/banner/_theme.scss +0 -0
  199. package/components/banner/index.scss +0 -2
  200. package/components/bottomnav/README.md +0 -85
  201. package/components/bottomnav/_spec.scss +0 -149
  202. package/components/bottomnav/_theme.scss +0 -0
  203. package/components/bottomnav/index.js +0 -117
  204. package/components/bottomnav/index.scss +0 -2
  205. package/components/bottomnav/item.js +0 -88
  206. package/components/button/README.md +0 -61
  207. package/components/button/_spec.scss +0 -162
  208. package/components/button/_theme.scss +0 -42
  209. package/components/button/index.eta +0 -32
  210. package/components/button/index.js +0 -43
  211. package/components/button/index.pug +0 -18
  212. package/components/button/index.scss +0 -2
  213. package/components/card/_spec.scss +0 -241
  214. package/components/card/_theme.scss +0 -0
  215. package/components/card/index.scss +0 -2
  216. package/components/chip/_spec.scss +0 -111
  217. package/components/chip/_theme.scss +0 -105
  218. package/components/chip/index.js +0 -23
  219. package/components/chip/index.scss +0 -2
  220. package/components/chip/item.js +0 -20
  221. package/components/datatable/_spec.scss +0 -225
  222. package/components/datatable/_theme.scss +0 -128
  223. package/components/datatable/cell.js +0 -44
  224. package/components/datatable/columnheader.js +0 -46
  225. package/components/datatable/index.js +0 -374
  226. package/components/datatable/index.scss +0 -2
  227. package/components/datatable/row.js +0 -48
  228. package/components/datatable/rowheader.js +0 -18
  229. package/components/dialog/_spec.scss +0 -203
  230. package/components/dialog/_theme.scss +0 -7
  231. package/components/dialog/index.js +0 -601
  232. package/components/dialog/index.scss +0 -2
  233. package/components/divider/_spec.scss +0 -11
  234. package/components/divider/_theme.scss +0 -0
  235. package/components/divider/index.scss +0 -2
  236. package/components/elevation/_spec.scss +0 -9
  237. package/components/elevation/_theme.scss +0 -0
  238. package/components/elevation/index.scss +0 -2
  239. package/components/fab/_spec.scss +0 -210
  240. package/components/fab/_theme.scss +0 -0
  241. package/components/fab/index.js +0 -99
  242. package/components/fab/index.scss +0 -2
  243. package/components/grid/_spec.scss +0 -169
  244. package/components/grid/_theme.scss +0 -0
  245. package/components/grid/index.scss +0 -2
  246. package/components/layout/_mixins.scss +0 -11
  247. package/components/layout/_spec.scss +0 -916
  248. package/components/layout/_theme.scss +0 -19
  249. package/components/layout/index.js +0 -454
  250. package/components/layout/index.scss +0 -2
  251. package/components/list/_spec.scss +0 -363
  252. package/components/list/_theme.scss +0 -102
  253. package/components/list/content.js +0 -106
  254. package/components/list/index.js +0 -256
  255. package/components/list/index.scss +0 -2
  256. package/components/list/item.js +0 -167
  257. package/components/list/secondary.js +0 -45
  258. package/components/menu/_spec.scss +0 -329
  259. package/components/menu/_theme.scss +0 -0
  260. package/components/menu/index.js +0 -705
  261. package/components/menu/index.scss +0 -2
  262. package/components/menu/item.js +0 -231
  263. package/components/progress/_spec.scss +0 -156
  264. package/components/progress/_theme.scss +0 -0
  265. package/components/progress/index.js +0 -36
  266. package/components/progress/index.scss +0 -2
  267. package/components/selection/_spec.scss +0 -376
  268. package/components/selection/_theme.scss +0 -134
  269. package/components/selection/index.eta +0 -60
  270. package/components/selection/index.js +0 -70
  271. package/components/selection/index.pug +0 -30
  272. package/components/selection/index.scss +0 -2
  273. package/components/selection/input.js +0 -54
  274. package/components/selection/radiogroup.js +0 -40
  275. package/components/slider/_spec.scss +0 -59
  276. package/components/slider/_theme.scss +0 -0
  277. package/components/slider/index.scss +0 -2
  278. package/components/snackbar/_spec.scss +0 -150
  279. package/components/snackbar/_theme.scss +0 -0
  280. package/components/snackbar/index.js +0 -338
  281. package/components/snackbar/index.scss +0 -2
  282. package/components/tab/_spec.scss +0 -220
  283. package/components/tab/_theme.scss +0 -0
  284. package/components/tab/content.js +0 -210
  285. package/components/tab/index.js +0 -257
  286. package/components/tab/index.scss +0 -2
  287. package/components/tab/item.js +0 -88
  288. package/components/tab/list.js +0 -196
  289. package/components/tab/panel.js +0 -54
  290. package/components/textfield/README.md +0 -179
  291. package/components/textfield/_spec.scss +0 -763
  292. package/components/textfield/_theme.scss +0 -264
  293. package/components/textfield/index.eta +0 -74
  294. package/components/textfield/index.js +0 -160
  295. package/components/textfield/index.pug +0 -30
  296. package/components/textfield/index.scss +0 -2
  297. package/components/tooltip/_spec.scss +0 -185
  298. package/components/tooltip/_theme.scss +0 -0
  299. package/components/tooltip/index.scss +0 -2
  300. package/components/type/_spec.scss +0 -227
  301. package/components/type/_theme.scss +0 -0
  302. package/components/type/index.scss +0 -2
  303. package/core/_breakpoint.scss +0 -189
  304. package/core/_elevation.scss +0 -78
  305. package/core/_length.scss +0 -8
  306. package/core/_motion.scss +0 -31
  307. package/core/_platform.scss +0 -12
  308. package/core/_type.scss +0 -128
  309. package/core/aria/attributes.js +0 -141
  310. package/core/aria/button.js +0 -49
  311. package/core/aria/keyboard.js +0 -92
  312. package/core/aria/rovingtabindex.js +0 -175
  313. package/core/aria/tab.js +0 -59
  314. package/core/document/index.js +0 -39
  315. package/core/overlay/_spec.scss +0 -28
  316. package/core/overlay/_theme.scss +0 -147
  317. package/core/overlay/index.js +0 -95
  318. package/core/overlay/index.scss +0 -2
  319. package/core/ripple/_spec.scss +0 -196
  320. package/core/ripple/_theme.scss +0 -20
  321. package/core/ripple/index.js +0 -286
  322. package/core/ripple/index.scss +0 -2
  323. package/core/theme/_aliases.scss +0 -15
  324. package/core/theme/_config.scss +0 -8
  325. package/core/theme/_functions.scss +0 -22
  326. package/core/theme/_palettes.scss +0 -405
  327. package/core/theme/_spec.scss +0 -0
  328. package/core/theme/_theme.scss +0 -268
  329. package/core/theme/index.js +0 -50
  330. package/core/theme/index.scss +0 -4
  331. package/core/throttler.js +0 -42
  332. package/core/transition/index.js +0 -465
  333. package/docs/_flex.scss +0 -28
  334. package/docs/_menuoptions.js +0 -183
  335. package/docs/_partials/_androidnavbar.eta +0 -5
  336. package/docs/_partials/_androidstatusbar.eta +0 -13
  337. package/docs/_partials/_appbar.eta +0 -27
  338. package/docs/_partials/_buttontest.eta +0 -31
  339. package/docs/_partials/_header.eta +0 -146
  340. package/docs/_partials/_navlistitem.eta +0 -16
  341. package/docs/_partials/_target.eta +0 -1
  342. package/docs/_sample-utils.js +0 -88
  343. package/docs/_storage.js +0 -33
  344. package/docs/docs.scss +0 -331
  345. package/docs/framework.scss +0 -26
  346. package/docs/index.eta +0 -12
  347. package/docs/index.js +0 -7
  348. package/docs/pages/appbar.eta +0 -108
  349. package/docs/pages/appbar.js +0 -0
  350. package/docs/pages/bottomnav.eta +0 -188
  351. package/docs/pages/bottomnav.js +0 -118
  352. package/docs/pages/button.eta +0 -124
  353. package/docs/pages/button.js +0 -224
  354. package/docs/pages/card.eta +0 -90
  355. package/docs/pages/card.js +0 -175
  356. package/docs/pages/chip.eta +0 -122
  357. package/docs/pages/chip.js +0 -80
  358. package/docs/pages/color.eta +0 -143
  359. package/docs/pages/color.js +0 -261
  360. package/docs/pages/datatable.eta +0 -323
  361. package/docs/pages/datatable.js +0 -160
  362. package/docs/pages/dialog.eta +0 -184
  363. package/docs/pages/dialog.js +0 -174
  364. package/docs/pages/dom.eta +0 -26
  365. package/docs/pages/dom.js +0 -140
  366. package/docs/pages/elevation.eta +0 -35
  367. package/docs/pages/elevation.js +0 -0
  368. package/docs/pages/fab.eta +0 -99
  369. package/docs/pages/fab.js +0 -43
  370. package/docs/pages/grid.eta +0 -135
  371. package/docs/pages/grid.js +0 -128
  372. package/docs/pages/layout.eta +0 -8
  373. package/docs/pages/layout.js +0 -0
  374. package/docs/pages/list.eta +0 -465
  375. package/docs/pages/list.js +0 -8
  376. package/docs/pages/menu.eta +0 -274
  377. package/docs/pages/menu.js +0 -213
  378. package/docs/pages/overlay.eta +0 -69
  379. package/docs/pages/overlay.js +0 -3
  380. package/docs/pages/progress.eta +0 -23
  381. package/docs/pages/progress.js +0 -12
  382. package/docs/pages/ripple.eta +0 -27
  383. package/docs/pages/ripple.js +0 -3
  384. package/docs/pages/search.eta +0 -242
  385. package/docs/pages/search.js +0 -226
  386. package/docs/pages/selection.eta +0 -107
  387. package/docs/pages/selection.js +0 -12
  388. package/docs/pages/slider.eta +0 -23
  389. package/docs/pages/slider.js +0 -0
  390. package/docs/pages/snackbar.eta +0 -83
  391. package/docs/pages/snackbar.js +0 -157
  392. package/docs/pages/tab.eta +0 -407
  393. package/docs/pages/tab.js +0 -152
  394. package/docs/pages/textfield.eta +0 -487
  395. package/docs/pages/textfield.js +0 -257
  396. package/docs/pages/tooltip.eta +0 -92
  397. package/docs/pages/tooltip.js +0 -0
  398. package/docs/pages/transition.eta +0 -117
  399. package/docs/pages/transition.js +0 -52
  400. package/docs/pages/type.eta +0 -31
  401. package/docs/pages/type.js +0 -0
  402. package/docs/postrender.js +0 -41
  403. package/docs/prerender.js +0 -16
  404. package/docs/pwa/_dialogs.eta +0 -143
  405. package/docs/pwa/_menus.eta +0 -16
  406. package/docs/pwa/pwa-prerender.js +0 -3
  407. package/docs/pwa/pwa.eta +0 -478
  408. package/docs/pwa/pwa.js +0 -298
  409. package/docs/pwa/pwa.scss +0 -31
  410. package/docs/themes/theme-colored.scss +0 -15
  411. package/docs/themes/theme-default.scss +0 -3
  412. package/index.scss +0 -27
  413. package/jsconfig.json +0 -16
  414. package/scripts/deploy-docs.sh +0 -9
  415. package/templates/index.eta +0 -2
  416. package/templates/index.pug +0 -3
  417. package/tsconfig.json +0 -16
  418. package/webpack.config.js +0 -304
@@ -0,0 +1,288 @@
1
+ /* eslint-disable no-use-before-define */
2
+
3
+ import Composition from './Composition.js';
4
+ import {
5
+ CompositionEventListener,
6
+ CompositionEventListenerObject,
7
+ HTMLTemplater,
8
+ ObserverOptions,
9
+ ObserverPropertyType,
10
+ ParsedObserverPropertyType,
11
+ ParsedProps,
12
+ } from './typings.js';
13
+
14
+ type ClassOf<T extends { prototype: unknown; } > = T;
15
+
16
+ type CallbackArguments<T1 = any, T2 = T1> = {
17
+ composition: Composition<T1>;
18
+ html: HTMLTemplater<T1, Partial<T2>>;
19
+ inline: (fn: (this:T1, data: {[K in keyof T2]?: T2[K]}) => any) => string;
20
+ template: DocumentFragment;
21
+ element: T1;
22
+ }
23
+
24
+ type IDLParameter<C extends object> = {
25
+ [P in string] :
26
+ ObserverPropertyType
27
+ | ObserverOptions<ObserverPropertyType, unknown, C>
28
+ | ((this:C, data:Partial<C>, fn?: () => any) => any)
29
+ };
30
+
31
+ type ExtendedClass<T1 extends typeof ICustomElement, T2 extends abstract new (...args: any) => any> =
32
+ Omit<T1, 'prototype'> & T2;
33
+
34
+ type ConstructorLess<T1 extends object, T2 extends abstract new (...args: any) => any> = T1 & T2;
35
+
36
+ declare type DefinedPropertiesOf<T extends ({ prototype: unknown; } & (new (...args: any) => any)), P> =
37
+ {[K in keyof T]: T[K]}
38
+ & { new(): (...args: ConstructorParameters<T>) => InstanceType<T> & P}
39
+ & { prototype: T['prototype'] & P };
40
+
41
+ type CompositionCallback<T1, T2=T1> = {
42
+ composed?: (this: T1, options: CallbackArguments<T1, T2>) => any,
43
+ constructed?: (this: T1, options: CallbackArguments<T1, T2>) => any,
44
+ connected?: (this: T1, options: CallbackArguments<T1, T2>) => any,
45
+ disconnected?: (this: T1, options: CallbackArguments<T1, T2>) => any,
46
+ props?: {
47
+ [P in keyof T1] : (
48
+ this: T1,
49
+ oldValue: T1[P],
50
+ newValue: T1[P],
51
+ changes:any,
52
+ element: T1
53
+ ) => any
54
+ },
55
+ attrs?: {[K in keyof any]: (
56
+ this: T1,
57
+ oldValue: string,
58
+ newValue: string,
59
+ element: T1
60
+ ) => unknown
61
+ },
62
+ } & {
63
+ [P in keyof T1 & string as `${P}Changed`]?: (
64
+ this: T1,
65
+ oldValue: T1[P],
66
+ newValue: T1[P],
67
+ changes:any,
68
+ element: T1
69
+ ) => any
70
+ }
71
+
72
+ declare interface ICustomElementInstance extends HTMLElement {
73
+ ariaActiveDescendantElement: Element
74
+ propChangedCallback<
75
+ T extends ICustomElementInstance,
76
+ K extends string = string,
77
+ >(this:T,
78
+ name: K,
79
+ oldValue: K extends keyof T ? T[K] : unknown,
80
+ newValue: K extends keyof T ? T[K] : unknown,
81
+ changes?: K extends keyof T ? T[K] extends object ? Partial<T[K]> : T[K] : unknown): void;
82
+
83
+ }
84
+
85
+ interface ConstructorOf<T> {
86
+ new(): T;
87
+ }
88
+
89
+ export declare const ICustomElement: {
90
+ new(): ICustomElementInstance;
91
+ prototype: ICustomElementInstance;
92
+
93
+ _onComposeCallbacks: ((callback: CallbackArguments) => any)[];
94
+
95
+ _onConnectedCallbacks: ((callback: CallbackArguments) => any)[];
96
+
97
+ _onDisconnectedCallbacks: ((callback: CallbackArguments) => any)[];
98
+
99
+ _onConstructedCallbacks: ((callback: CallbackArguments) => any)[];
100
+
101
+ schema: Record<string, unknown>;
102
+
103
+ extend<T extends typeof ICustomElement>(this: T): T;
104
+
105
+ tsClassFix<T extends typeof ICustomElement>(this:T): T & (new (...args:any[]) => InstanceType<T>)
106
+
107
+ html<T extends typeof ICustomElement>(
108
+ this: T,
109
+ string: TemplateStringsArray,
110
+ // eslint-disable-next-line no-shadow
111
+ ...substitutions: (string|Element|((this:InstanceType<T>, data:InstanceType<T> & T['schema']) => any))[]
112
+ ): T
113
+
114
+ css<
115
+ T1 extends typeof ICustomElement,
116
+ T2 extends TemplateStringsArray|HTMLStyleElement|CSSStyleSheet>(
117
+ this: T1,
118
+ array: T2,
119
+ ...rest: T2 extends TemplateStringsArray ? string[] : (HTMLStyleElement|CSSStyleSheet)[]
120
+ ): T1
121
+
122
+ define<
123
+ CLASS extends typeof ICustomElement,
124
+ ARGS extends ConstructorParameters<CLASS>,
125
+ INSTANCE extends InstanceType<CLASS>,
126
+ PROPS extends {
127
+ [P in keyof any] :
128
+ {
129
+ enumerable?: boolean;
130
+ configurable?: boolean;
131
+ writable?: boolean;
132
+ value?: any;
133
+ get?: ((this: INSTANCE) => any);
134
+ set?: (this: INSTANCE, value: any) => void;
135
+ } | ((this: INSTANCE, ...args:any[]) => any)
136
+ },
137
+ VALUE extends {
138
+ [KEY in keyof PROPS]: PROPS[KEY] extends (...args2:any[]) => infer R ? R
139
+ : PROPS[KEY] extends TypedPropertyDescriptor<infer R> ? R : never
140
+ }>
141
+ (this: CLASS, props: PROPS & ThisType<PROPS & INSTANCE>): CLASS
142
+ & (new (...args: ARGS) => INSTANCE & VALUE)
143
+
144
+ observe<
145
+ CLASS extends typeof ICustomElement,
146
+ ARGS extends ConstructorParameters<CLASS>,
147
+ INSTANCE extends InstanceType<CLASS>,
148
+ PROPS extends IDLParameter<INSTANCE>,
149
+ VALUE extends {
150
+ [KEY in keyof PROPS]:
151
+ PROPS[KEY] extends (...args2:any[]) => infer R ? R
152
+ : PROPS[KEY] extends ObserverPropertyType ? ParsedObserverPropertyType<PROPS[KEY]>
153
+ : PROPS[KEY] extends {type: 'object'} & ObserverOptions<any, infer R> ? (unknown extends R ? object : R)
154
+ : PROPS[KEY] extends {type: ObserverPropertyType} ? ParsedObserverPropertyType<PROPS[KEY]['type']>
155
+ : PROPS[KEY] extends ObserverOptions<any, infer R> ? (unknown extends R ? string : R)
156
+ : never
157
+ },
158
+ > (this: CLASS, props: PROPS)
159
+ : CLASS & (new (...args: ARGS) => INSTANCE & VALUE)
160
+
161
+ props: typeof ICustomElement.observe;
162
+
163
+ set<
164
+ CLASS extends typeof ICustomElement,
165
+ ARGS extends ConstructorParameters<CLASS>,
166
+ INSTANCE extends InstanceType<CLASS>,
167
+ PROPS extends object>
168
+ (this: CLASS, source: PROPS & ThisType<PROPS & INSTANCE>, options?: Partial<PropertyDescriptor>)
169
+ : CLASS & (new(...args: ARGS) => INSTANCE & PROPS)
170
+
171
+ methods: typeof ICustomElement.set;
172
+
173
+ overrides<
174
+ CLASS extends typeof ICustomElement,
175
+ ARGS extends ConstructorParameters<CLASS>,
176
+ INSTANCE extends InstanceType<CLASS>,
177
+ PROPS extends Partial<INSTANCE>>
178
+ (this: CLASS, source: PROPS & ThisType<PROPS & INSTANCE>, options?: Partial<PropertyDescriptor>)
179
+ : CLASS & (new(...args: ARGS) => INSTANCE & PROPS)
180
+
181
+ expressions<
182
+ CLASS extends typeof ICustomElement,
183
+ ARGS extends ConstructorParameters<CLASS>,
184
+ INSTANCE extends InstanceType<CLASS>,
185
+ PROPS extends {
186
+ [K in keyof any]: ((this: INSTANCE, data?: INSTANCE & CLASS['schema']) => string|boolean|null)
187
+ }
188
+ >(this: CLASS, expressions: PROPS & ThisType<INSTANCE & PROPS>):
189
+ CLASS & (new (...args: ARGS) => INSTANCE & PROPS)
190
+
191
+ defineStatic<
192
+ T1 extends typeof ICustomElement,
193
+ T2 extends IDLParameter<T1>>
194
+ (this: T1, props: T2):T1 & ParsedProps<T2>;
195
+
196
+ setStatic<
197
+ T1 extends typeof ICustomElement,
198
+ T2 extends {
199
+ [K in keyof any]: (
200
+ ((this:T1, ...args:any[]) => any)
201
+ |string|number|boolean|any[]|object)}
202
+ >
203
+ (this: T1, source: T2 & ThisType<T1 & T2>):T1 & T2;
204
+
205
+ autoRegister<T extends typeof ICustomElement>
206
+ (this: T, elementName: string): T;
207
+
208
+ setSchema<
209
+ T1 extends typeof ICustomElement,
210
+ T2 extends {[K in keyof any]: unknown}
211
+ >
212
+ (this: T1, schema: T2): T1 & {schema: T2};
213
+
214
+ register<T extends typeof ICustomElement>
215
+ (this: T, elementName?: string, force?: boolean): T;
216
+
217
+ append<
218
+ T extends typeof ICustomElement,
219
+ >
220
+ (this: T, ...parts: ConstructorParameters<typeof Composition<InstanceType<T>>>): T;
221
+
222
+ mixin<
223
+ BASE extends typeof ICustomElement,
224
+ FN extends (...args:any[]) => any,
225
+ RETURN extends ReturnType<FN>,
226
+ SUBCLASS extends ClassOf<RETURN>,
227
+ ARGS extends ConstructorParameters<SUBCLASS>,
228
+ BASE_INSTANCE extends InstanceType<BASE>,
229
+ SUBCLASS_INSTANCE extends InstanceType<SUBCLASS>>
230
+ (this: BASE, mixin: FN): SUBCLASS & BASE
231
+ & (new (...args: ARGS) => SUBCLASS_INSTANCE & BASE_INSTANCE)
232
+
233
+ events<T extends typeof ICustomElement>
234
+ (
235
+ this: T,
236
+ listeners?: CompositionEventListenerObject<InstanceType<T>>,
237
+ options?: Partial<CompositionEventListener<InstanceType<T>>>,
238
+ ): T;
239
+
240
+ childEvents<T extends typeof ICustomElement>
241
+ (
242
+ this: T,
243
+ listenerMap: {
244
+ [P in keyof any]: CompositionEventListenerObject<InstanceType<T>>
245
+ },
246
+ options?: Partial<CompositionEventListener<InstanceType<T>>>,
247
+ ): T;
248
+
249
+ on<
250
+ T1 extends typeof ICustomElement,
251
+ T2 extends InstanceType<T1>,
252
+ T3 extends CompositionCallback<T2, T2 & T1['schema']>,
253
+ T4 extends keyof T3,
254
+ >
255
+ (this: T1, name: T3|T4, callbacks?: T3[T4] & ThisType<T2>): T1
256
+
257
+ onPropChanged<
258
+ T1 extends typeof ICustomElement,
259
+ T2 extends InstanceType<T1>
260
+ >
261
+ (
262
+ this: T1,
263
+ options: {
264
+ [P in keyof T2]? : (
265
+ // eslint-disable-next-line no-shadow
266
+ this: T2,
267
+ oldValue: T2[P],
268
+ newValue: T2[P],
269
+ changes:any,
270
+ element: T2
271
+ ) => void
272
+ },
273
+ ): T1;
274
+
275
+ onAttributeChanged<T extends typeof ICustomElement>
276
+ (
277
+ this: T,
278
+ options: {
279
+ [x:string]: (
280
+ // eslint-disable-next-line no-shadow
281
+ this: InstanceType<T>,
282
+ oldValue: string,
283
+ newValue: string,
284
+ element: InstanceType<T>
285
+ ) => void
286
+ },
287
+ ): T;
288
+ };
@@ -0,0 +1 @@
1
+ export class ICustomElement extends HTMLElement {}
package/core/css.js ADDED
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @param {Iterable<HTMLStyleElement|CSSStyleSheet>} styles
3
+ * @yields composed CSSStyleSheet
4
+ * @return {Generator<CSSStyleSheet>} composed CSSStyleSheet
5
+ */
6
+ export function* generateCSSStyleSheets(styles) {
7
+ for (const style of styles) {
8
+ if (style instanceof HTMLStyleElement) {
9
+ const sheet = new CSSStyleSheet();
10
+ sheet.replaceSync(style.textContent);
11
+ yield sheet;
12
+ } else if (style.ownerNode) {
13
+ console.warn('Stylesheet is part of style');
14
+ const sheet = new CSSStyleSheet();
15
+ sheet.replaceSync([...style.cssRules].map((r) => r.cssText).join(''));
16
+ yield sheet;
17
+ } else {
18
+ yield style;
19
+ }
20
+ }
21
+ }
22
+
23
+ /** @type {WeakMap<CSSStyleSheet, HTMLStyleElement>} */
24
+ const styleElementWrappers = new WeakMap();
25
+
26
+ /**
27
+ * @param {Iterable<HTMLStyleElement|CSSStyleSheet>} styles
28
+ * @yields composed HTMLStyleElement
29
+ * @return {Generator<HTMLStyleElement>} composed CSSStyleSheet
30
+ */
31
+ export function* generateHTMLStyleElements(styles) {
32
+ for (const style of styles) {
33
+ if (style instanceof HTMLStyleElement) {
34
+ yield style;
35
+ } else if (style.ownerNode instanceof HTMLStyleElement) {
36
+ // console.log('Cloning parent HTMLStyleElement instead');
37
+ // @ts-ignore Skip cast
38
+ yield style.ownerNode.cloneNode(true);
39
+ } else {
40
+ let styleElement = styleElementWrappers.get(style);
41
+ if (!styleElement) {
42
+ console.warn('Manually constructing HTMLStyleElement', [...style.cssRules].map((r) => r.cssText).join('\n'));
43
+ styleElement = document.createElement('style');
44
+ styleElement.textContent = [...style.cssRules].map((r) => r.cssText).join('');
45
+ styleElementWrappers.set(style, styleElement);
46
+ }
47
+ // @ts-ignore Skip cast
48
+ yield styleElement.cloneNode(true);
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,125 @@
1
+ /** @typedef {import('./CustomElement').default} CustomElement */
2
+
3
+ /** @type {WeakMap<HTMLElement, EventListener>} */
4
+ const eventHandlerValues = new Map();
5
+
6
+ /**
7
+ * @see https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-attributes
8
+ * @type {import('./typings.js').ObserverOptions<'function',EventListener, unknown>}
9
+ */
10
+ export const EVENT_HANDLER_TYPE = {
11
+ type: 'function',
12
+ reflect: 'read',
13
+ value: null,
14
+ values: eventHandlerValues,
15
+ parser(v) { return v; },
16
+ attributeChangedCallback(name, oldValue, newValue) {
17
+ if (oldValue == null && newValue == null) return;
18
+ // Must continue if oldValue === newValue;
19
+ if (newValue == null) {
20
+ this[name] = null;
21
+ return;
22
+ }
23
+ // Assign to temp element, allow it to parse and then copy result.
24
+ // Let browser parse instead of using eval()
25
+ // CSP Violations will be thrown by browser on failure and result in `null`
26
+ const button = document.createElement('button');
27
+ button.setAttribute('onclick', newValue);
28
+ const fn = button.onclick;
29
+ button.remove();
30
+ this[name] = fn;
31
+ },
32
+ propChangedCallback(name, oldValue, newValue) {
33
+ const eventName = name.slice(2);
34
+ if (oldValue) {
35
+ this.removeEventListener(eventName, oldValue);
36
+ }
37
+ if (newValue) {
38
+ this.addEventListener(eventName, newValue);
39
+ }
40
+ },
41
+ };
42
+
43
+ const weakRefValues = new WeakMap();
44
+
45
+ /**
46
+ * @type {import('./typings.js').ObserverOptions<'object',HTMLElement>}
47
+ */
48
+ export const WEAKREF_TYPE = {
49
+ type: 'object',
50
+ reflect: false,
51
+ value: null,
52
+ values: weakRefValues,
53
+ parser(v) { return new WeakRef(v); },
54
+ get() {
55
+ return weakRefValues.get(this)?.deref();
56
+ },
57
+ };
58
+
59
+ /** @type {WeakMap<any, Animation>} */
60
+ const elementStylerLastAnimation = new WeakMap();
61
+ /** @type {WeakMap<CustomElement, ElementStylerOptions>} */
62
+ const elementStylerValues = new WeakMap();
63
+ /** @type {WeakSet<any>} */
64
+ const elementStylerHasQueue = new WeakSet();
65
+
66
+ /**
67
+ * @typedef {Object} ElementStylerOptions
68
+ * @prop {string} target Target ID
69
+ * @prop {Keyframe} styles
70
+ * @prop {EffectTiming} [timing]
71
+ */
72
+
73
+ /** @this {CustomElement} */
74
+ function elementStylerRAFCallback() {
75
+ let previousAnimation = elementStylerLastAnimation.get(this);
76
+ const value = elementStylerValues.get(this);
77
+ if (!value) {
78
+ previousAnimation?.cancel();
79
+ return;
80
+ }
81
+ /** @type {HTMLElement} */
82
+ const el = value.target ? this.composition.getElement(this.shadowRoot, value.target) : this;
83
+ const currentAnimation = el.animate(value.styles, {
84
+ ...value.timing,
85
+ fill: 'forwards',
86
+ });
87
+ currentAnimation.onremove = () => {
88
+ previousAnimation?.effect.updateTiming({
89
+ fill: 'none',
90
+ });
91
+ // Destroy previous manually to avoid leak
92
+ previousAnimation?.finish();
93
+ previousAnimation?.cancel();
94
+ previousAnimation = null;
95
+ };
96
+ elementStylerLastAnimation.set(this, currentAnimation);
97
+ elementStylerHasQueue.delete(this);
98
+ }
99
+
100
+ /** @type {import('./typings.js').ObserverOptions<'object',ElementStylerOptions, CustomElement>} */
101
+ export const ELEMENT_STYLER_TYPE = {
102
+ type: 'object',
103
+ reflect: false,
104
+ values: elementStylerValues,
105
+ diff: null, // Skip computing entire change
106
+ changedCallback(oldValue, newValue) {
107
+ const hasQueue = elementStylerHasQueue.has(this);
108
+ if (!newValue) {
109
+ if (!hasQueue) return;
110
+ console.warn('debug needed of cancel needed');
111
+ elementStylerHasQueue.delete(this);
112
+ return;
113
+ }
114
+
115
+ if (hasQueue) {
116
+ // Already scheduled
117
+ return;
118
+ }
119
+
120
+ // Animation styles may trickle in steps, so queue a microtask before doing any work.
121
+ // Using requestAnimationFrame would fire one frame too late for CSS animations already scheduled
122
+ queueMicrotask(elementStylerRAFCallback.bind(this));
123
+ elementStylerHasQueue.add(this);
124
+ },
125
+ };