@shortfuse/materialdesignweb 0.4.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.
- package/README.md +155 -79
- package/bin/generate-css.js +12 -0
- package/components/Badge.css +30 -0
- package/components/Badge.js +15 -0
- package/components/Body.css +14 -0
- package/components/Body.js +7 -0
- package/components/BottomAppBar.css +23 -0
- package/components/BottomAppBar.js +25 -0
- package/components/Box.css +31 -0
- package/components/Box.js +24 -0
- package/components/Button.css +146 -0
- package/components/Button.js +95 -0
- package/components/Button.md +61 -0
- package/components/Card.css +109 -0
- package/components/Card.js +82 -0
- package/components/Checkbox.css +77 -0
- package/components/Checkbox.js +59 -0
- package/components/CheckboxIcon.css +89 -0
- package/components/CheckboxIcon.js +41 -0
- package/components/Chip.css +35 -0
- package/components/Chip.js +22 -0
- package/components/Dialog.css +235 -0
- package/components/Dialog.js +327 -0
- package/components/DialogActions.js +13 -0
- package/components/Divider.css +41 -0
- package/components/Divider.js +13 -0
- package/components/ExtendedFab.css +24 -0
- package/components/ExtendedFab.js +11 -0
- package/components/Fab.css +23 -0
- package/components/Fab.js +26 -0
- package/components/FilterChip.css +80 -0
- package/components/FilterChip.js +51 -0
- package/components/Headline.css +14 -0
- package/components/Headline.js +33 -0
- package/components/Icon.css +76 -0
- package/components/Icon.js +174 -0
- package/components/IconButton.css +151 -0
- package/components/IconButton.js +65 -0
- package/components/Input.js +16 -0
- package/components/Label.css +14 -0
- package/components/Label.js +7 -0
- package/components/Layout.css +19 -0
- package/components/Layout.js +12 -0
- package/components/List.css +12 -0
- package/components/List.js +17 -0
- package/components/ListItem.css +224 -0
- package/components/ListItem.js +112 -0
- package/components/ListOption.css +34 -0
- package/components/ListOption.js +122 -0
- package/components/ListSelect.css +9 -0
- package/components/ListSelect.js +206 -0
- package/components/Menu.css +171 -0
- package/components/Menu.js +470 -0
- package/components/MenuItem.css +53 -0
- package/components/MenuItem.js +215 -0
- package/components/Nav.css +17 -0
- package/components/Nav.js +23 -0
- package/components/NavBar.css +34 -0
- package/components/NavBar.js +88 -0
- package/components/NavBarItem.css +41 -0
- package/components/NavBarItem.js +7 -0
- package/components/NavDrawer.css +31 -0
- package/components/NavDrawer.js +13 -0
- package/components/NavDrawerItem.css +42 -0
- package/components/NavDrawerItem.js +12 -0
- package/components/NavItem.css +181 -0
- package/components/NavItem.js +83 -0
- package/components/NavRail.css +47 -0
- package/components/NavRail.js +17 -0
- package/components/NavRailItem.css +25 -0
- package/components/NavRailItem.js +7 -0
- package/components/Option.js +91 -0
- package/components/Outline.css +138 -0
- package/components/Pane.css +261 -0
- package/components/Pane.js +21 -0
- package/components/Progress.css +74 -0
- package/components/Progress.js +67 -0
- package/components/ProgressCircle.css +226 -0
- package/components/ProgressLine.css +155 -0
- package/components/Radio.css +83 -0
- package/components/Radio.js +42 -0
- package/components/RadioIcon.css +73 -0
- package/components/RadioIcon.js +37 -0
- package/components/Ripple.css +74 -0
- package/components/Ripple.js +114 -0
- package/components/SegmentedButton.css +94 -0
- package/components/SegmentedButton.js +49 -0
- package/components/SegmentedButtonGroup.css +12 -0
- package/components/SegmentedButtonGroup.js +44 -0
- package/components/Select.css +52 -0
- package/components/Select.js +71 -0
- package/components/Shape.css +132 -0
- package/components/Shape.js +25 -0
- package/components/Slider.css +306 -0
- package/components/Slider.js +206 -0
- package/components/Snackbar.css +80 -0
- package/components/Snackbar.js +75 -0
- package/components/Surface.css +10 -0
- package/components/Surface.js +23 -0
- package/components/Switch.css +63 -0
- package/components/Switch.js +127 -0
- package/components/SwitchIcon.css +177 -0
- package/components/SwitchIcon.js +89 -0
- package/components/SwitchIconAnimations.css +89 -0
- package/components/Tab.css +85 -0
- package/components/Tab.js +103 -0
- package/components/TabContent.js +151 -0
- package/components/TabList.css +129 -0
- package/components/TabList.js +309 -0
- package/components/TabPanel.js +37 -0
- package/components/TextArea.css +93 -0
- package/components/TextArea.js +229 -0
- package/components/Title.css +14 -0
- package/components/Title.js +15 -0
- package/components/Tooltip.css +40 -0
- package/components/Tooltip.js +22 -0
- package/components/TopAppBar.css +209 -0
- package/components/TopAppBar.js +201 -0
- package/core/Composition.js +988 -0
- package/core/CustomElement.js +844 -0
- package/core/ICustomElement.d.ts +288 -0
- package/core/ICustomElement.js +1 -0
- package/core/css.js +51 -0
- package/core/customTypes.js +125 -0
- package/core/dom.js +56 -245
- package/core/identify.js +40 -0
- package/core/observe.js +410 -0
- package/core/template.js +121 -0
- package/core/typings.d.ts +135 -0
- package/core/typings.js +1 -0
- package/mixins/AriaReflectorMixin.js +42 -0
- package/mixins/AriaToolbarMixin.js +13 -0
- package/mixins/ControlMixin.css +57 -0
- package/mixins/ControlMixin.js +212 -0
- package/mixins/DensityMixin.css +40 -0
- package/mixins/DensityMixin.js +11 -0
- package/mixins/FlexableMixin.css +79 -0
- package/mixins/FlexableMixin.js +32 -0
- package/mixins/FormAssociatedMixin.js +170 -0
- package/mixins/InputMixin.js +335 -0
- package/mixins/KeyboardNavMixin.js +244 -0
- package/mixins/RTLObserverMixin.js +35 -0
- package/mixins/ResizeObserverMixin.js +38 -0
- package/mixins/RippleMixin.css +12 -0
- package/mixins/RippleMixin.js +115 -0
- package/mixins/ScrollListenerMixin.js +100 -0
- package/mixins/ShapeMixin.css +135 -0
- package/mixins/ShapeMixin.js +31 -0
- package/mixins/StateMixin.css +82 -0
- package/mixins/StateMixin.js +114 -0
- package/mixins/SurfaceMixin.css +150 -0
- package/mixins/SurfaceMixin.js +32 -0
- package/mixins/TextFieldMixin.css +657 -0
- package/mixins/TextFieldMixin.js +121 -0
- package/mixins/ThemableMixin.css +204 -0
- package/mixins/ThemableMixin.js +16 -0
- package/mixins/TooltipTriggerMixin.css +27 -0
- package/mixins/TooltipTriggerMixin.js +366 -0
- package/mixins/TouchTargetMixin.css +26 -0
- package/mixins/TouchTargetMixin.js +9 -0
- package/package.json +57 -41
- package/theming/index.js +594 -0
- package/theming/loader.js +24 -0
- package/utils/cli.js +11 -0
- package/utils/color_keywords.js +151 -0
- package/utils/hct/Cam16.js +298 -0
- package/utils/hct/CorePalette.js +84 -0
- package/utils/hct/Hct.js +172 -0
- package/utils/hct/Scheme.js +587 -0
- package/utils/hct/TonalPalette.js +68 -0
- package/utils/hct/ViewingConditions.js +136 -0
- package/utils/hct/blend.js +93 -0
- package/utils/hct/colorUtils.js +302 -0
- package/utils/hct/hctSolver.js +559 -0
- package/utils/hct/helper.js +182 -0
- package/utils/hct/mathUtils.js +153 -0
- package/utils/jsonMergePatch.js +100 -0
- package/utils/jsx-runtime.js +101 -0
- package/utils/popup.js +117 -0
- package/utils/svg.js +129 -0
- package/.browserslistrc +0 -3
- package/.eslintrc.json +0 -153
- package/.stylelintrc.json +0 -600
- package/.vscode/launch.json +0 -31
- package/.vscode/settings.json +0 -3
- package/.vscode/tasks.json +0 -32
- package/CHANGELOG.md +0 -24
- package/CODE_OF_CONDUCT.md +0 -46
- package/adapters/datatable/column.js +0 -203
- package/adapters/datatable/index.js +0 -972
- package/adapters/dom/index.js +0 -601
- package/adapters/list/index.js +0 -69
- package/adapters/search/index.js +0 -521
- package/components/appbar/_spec.scss +0 -225
- package/components/appbar/_theme.scss +0 -0
- package/components/appbar/index.scss +0 -2
- package/components/banner/_spec.scss +0 -118
- package/components/banner/_theme.scss +0 -0
- package/components/banner/index.scss +0 -2
- package/components/bottomnav/README.md +0 -85
- package/components/bottomnav/_spec.scss +0 -157
- package/components/bottomnav/_theme.scss +0 -0
- package/components/bottomnav/index.js +0 -122
- package/components/bottomnav/index.scss +0 -2
- package/components/bottomnav/item.js +0 -89
- package/components/button/README.md +0 -61
- package/components/button/_spec.scss +0 -161
- package/components/button/_theme.scss +0 -65
- package/components/button/index.eta +0 -32
- package/components/button/index.js +0 -43
- package/components/button/index.pug +0 -18
- package/components/button/index.scss +0 -2
- package/components/card/_spec.scss +0 -249
- package/components/card/_theme.scss +0 -0
- package/components/card/index.scss +0 -2
- package/components/chip/_spec.scss +0 -134
- package/components/chip/_theme.scss +0 -177
- package/components/chip/index.js +0 -21
- package/components/chip/index.scss +0 -2
- package/components/chip/item.js +0 -20
- package/components/datatable/_spec.scss +0 -288
- package/components/datatable/_theme.scss +0 -154
- package/components/datatable/cell.js +0 -45
- package/components/datatable/columnheader.js +0 -47
- package/components/datatable/index.js +0 -388
- package/components/datatable/index.scss +0 -2
- package/components/datatable/row.js +0 -49
- package/components/datatable/rowheader.js +0 -18
- package/components/dialog/_spec.scss +0 -213
- package/components/dialog/_theme.scss +0 -0
- package/components/dialog/index.js +0 -627
- package/components/dialog/index.scss +0 -2
- package/components/divider/_spec.scss +0 -13
- package/components/divider/_theme.scss +0 -0
- package/components/divider/index.scss +0 -2
- package/components/elevation/_spec.scss +0 -9
- package/components/elevation/_theme.scss +0 -0
- package/components/elevation/index.scss +0 -2
- package/components/fab/_spec.scss +0 -222
- package/components/fab/_theme.scss +0 -0
- package/components/fab/index.js +0 -103
- package/components/fab/index.scss +0 -2
- package/components/grid/_spec.scss +0 -312
- package/components/grid/_theme.scss +0 -0
- package/components/grid/index.scss +0 -2
- package/components/layout/_mixins.scss +0 -33
- package/components/layout/_spec.scss +0 -1012
- package/components/layout/_theme.scss +0 -44
- package/components/layout/index.js +0 -464
- package/components/layout/index.scss +0 -2
- package/components/list/_spec.scss +0 -397
- package/components/list/_theme.scss +0 -111
- package/components/list/content.js +0 -110
- package/components/list/index.js +0 -260
- package/components/list/index.scss +0 -2
- package/components/list/item.js +0 -170
- package/components/list/secondary.js +0 -46
- package/components/menu/_spec.scss +0 -362
- package/components/menu/_theme.scss +0 -0
- package/components/menu/index.js +0 -721
- package/components/menu/index.scss +0 -2
- package/components/menu/item.js +0 -239
- package/components/progress/_spec.scss +0 -147
- package/components/progress/_theme.scss +0 -0
- package/components/progress/index.js +0 -36
- package/components/progress/index.scss +0 -2
- package/components/selection/_spec.scss +0 -386
- package/components/selection/_theme.scss +0 -166
- package/components/selection/index.eta +0 -60
- package/components/selection/index.js +0 -76
- package/components/selection/index.pug +0 -30
- package/components/selection/index.scss +0 -2
- package/components/selection/input.js +0 -56
- package/components/selection/radiogroup.js +0 -47
- package/components/slider/_spec.scss +0 -64
- package/components/slider/_theme.scss +0 -0
- package/components/slider/index.scss +0 -2
- package/components/snackbar/_spec.scss +0 -195
- package/components/snackbar/_theme.scss +0 -0
- package/components/snackbar/index.js +0 -344
- package/components/snackbar/index.scss +0 -2
- package/components/tab/_spec.scss +0 -235
- package/components/tab/_theme.scss +0 -0
- package/components/tab/content.js +0 -205
- package/components/tab/index.js +0 -260
- package/components/tab/index.scss +0 -2
- package/components/tab/item.js +0 -89
- package/components/tab/list.js +0 -210
- package/components/tab/panel.js +0 -54
- package/components/template/_theme.scss +0 -27
- package/components/textfield/README.md +0 -179
- package/components/textfield/_mixins.scss +0 -52
- package/components/textfield/_spec.scss +0 -809
- package/components/textfield/_theme.scss +0 -299
- package/components/textfield/index.eta +0 -74
- package/components/textfield/index.js +0 -168
- package/components/textfield/index.pug +0 -30
- package/components/textfield/index.scss +0 -2
- package/components/tooltip/_spec.scss +0 -188
- package/components/tooltip/_theme.scss +0 -0
- package/components/tooltip/index.scss +0 -2
- package/components/type/_spec.scss +0 -224
- package/components/type/_theme.scss +0 -0
- package/components/type/index.scss +0 -2
- package/core/_breakpoint.scss +0 -189
- package/core/_elevation.scss +0 -38
- package/core/_length.scss +0 -9
- package/core/_motion.scss +0 -31
- package/core/_platform.scss +0 -34
- package/core/_type.scss +0 -127
- package/core/aria/attributes.js +0 -141
- package/core/aria/button.js +0 -50
- package/core/aria/keyboard.js +0 -93
- package/core/aria/rovingtabindex.js +0 -178
- package/core/aria/tab.js +0 -60
- package/core/color/_spec.scss +0 -0
- package/core/color/_theme.scss +0 -390
- package/core/color/index.scss +0 -2
- package/core/document/index.js +0 -39
- package/core/overlay/_spec.scss +0 -31
- package/core/overlay/_theme.scss +0 -171
- package/core/overlay/index.js +0 -108
- package/core/overlay/index.scss +0 -2
- package/core/ripple/_spec.scss +0 -197
- package/core/ripple/_theme.scss +0 -40
- package/core/ripple/index.js +0 -294
- package/core/ripple/index.scss +0 -2
- package/core/theme/_config.scss +0 -2
- package/core/theme/_mixins.scss +0 -172
- package/core/theme/_palettes.scss +0 -406
- package/core/theme/_variables.scss +0 -24
- package/core/theme/index.js +0 -50
- package/core/throttler.js +0 -42
- package/core/transition/index.js +0 -468
- package/docs/_flex.scss +0 -22
- package/docs/_menuoptions.js +0 -183
- package/docs/_mixins.pug +0 -155
- package/docs/_partials/_androidnavbar.eta +0 -5
- package/docs/_partials/_androidstatusbar.eta +0 -13
- package/docs/_partials/_appbar.eta +0 -29
- package/docs/_partials/_buttontest.eta +0 -31
- package/docs/_partials/_header.eta +0 -149
- package/docs/_partials/_navlistitem.eta +0 -16
- package/docs/_partials/_target.eta +0 -1
- package/docs/_sample-utils.js +0 -93
- package/docs/_storage.js +0 -33
- package/docs/docs.scss +0 -295
- package/docs/index.eta +0 -16
- package/docs/index.js +0 -0
- package/docs/pages/appbar.eta +0 -114
- package/docs/pages/appbar.js +0 -0
- package/docs/pages/appbar.pug +0 -78
- package/docs/pages/bottomnav.eta +0 -188
- package/docs/pages/bottomnav.js +0 -115
- package/docs/pages/bottomnav.pug +0 -137
- package/docs/pages/button.eta +0 -124
- package/docs/pages/button.js +0 -224
- package/docs/pages/button.pug +0 -121
- package/docs/pages/card.eta +0 -90
- package/docs/pages/card.js +0 -177
- package/docs/pages/card.pug +0 -74
- package/docs/pages/chip.eta +0 -122
- package/docs/pages/chip.js +0 -82
- package/docs/pages/chip.pug +0 -91
- package/docs/pages/color.eta +0 -143
- package/docs/pages/color.js +0 -262
- package/docs/pages/color.pug +0 -121
- package/docs/pages/datatable.eta +0 -323
- package/docs/pages/datatable.js +0 -164
- package/docs/pages/datatable.pug +0 -283
- package/docs/pages/dialog.eta +0 -186
- package/docs/pages/dialog.js +0 -177
- package/docs/pages/dialog.pug +0 -132
- package/docs/pages/dom.eta +0 -26
- package/docs/pages/dom.js +0 -143
- package/docs/pages/dom.pug +0 -22
- package/docs/pages/elevation.eta +0 -35
- package/docs/pages/elevation.js +0 -0
- package/docs/pages/elevation.pug +0 -25
- package/docs/pages/fab.eta +0 -99
- package/docs/pages/fab.js +0 -44
- package/docs/pages/fab.pug +0 -66
- package/docs/pages/grid.eta +0 -135
- package/docs/pages/grid.js +0 -128
- package/docs/pages/grid.pug +0 -95
- package/docs/pages/layout.eta +0 -8
- package/docs/pages/layout.js +0 -0
- package/docs/pages/layout.pug +0 -7
- package/docs/pages/list.eta +0 -465
- package/docs/pages/list.js +0 -9
- package/docs/pages/list.pug +0 -326
- package/docs/pages/menu.eta +0 -276
- package/docs/pages/menu.js +0 -217
- package/docs/pages/menu.pug +0 -205
- package/docs/pages/overlay.eta +0 -69
- package/docs/pages/overlay.js +0 -4
- package/docs/pages/overlay.pug +0 -55
- package/docs/pages/progress.eta +0 -23
- package/docs/pages/progress.js +0 -12
- package/docs/pages/progress.pug +0 -16
- package/docs/pages/ripple.eta +0 -27
- package/docs/pages/ripple.js +0 -4
- package/docs/pages/ripple.pug +0 -21
- package/docs/pages/search.eta +0 -246
- package/docs/pages/search.js +0 -243
- package/docs/pages/search.pug +0 -165
- package/docs/pages/selection.eta +0 -111
- package/docs/pages/selection.js +0 -13
- package/docs/pages/selection.pug +0 -74
- package/docs/pages/slider.eta +0 -23
- package/docs/pages/slider.js +0 -0
- package/docs/pages/slider.pug +0 -17
- package/docs/pages/snackbar.eta +0 -83
- package/docs/pages/snackbar.js +0 -158
- package/docs/pages/snackbar.pug +0 -60
- package/docs/pages/tab.eta +0 -421
- package/docs/pages/tab.js +0 -151
- package/docs/pages/tab.pug +0 -304
- package/docs/pages/textfield.eta +0 -486
- package/docs/pages/textfield.js +0 -254
- package/docs/pages/textfield.pug +0 -360
- package/docs/pages/tooltip.eta +0 -94
- package/docs/pages/tooltip.js +0 -0
- package/docs/pages/tooltip.pug +0 -78
- package/docs/pages/transition.eta +0 -117
- package/docs/pages/transition.js +0 -54
- package/docs/pages/transition.pug +0 -76
- package/docs/pages/type.eta +0 -31
- package/docs/pages/type.js +0 -0
- package/docs/pages/type.pug +0 -29
- package/docs/postrender.js +0 -39
- package/docs/prerender.js +0 -16
- package/docs/pwa/_dialogs.eta +0 -143
- package/docs/pwa/_dialogs.pug +0 -96
- package/docs/pwa/_menus.eta +0 -16
- package/docs/pwa/_menus.pug +0 -11
- package/docs/pwa/pwa-prerender.js +0 -3
- package/docs/pwa/pwa.eta +0 -480
- package/docs/pwa/pwa.js +0 -306
- package/docs/pwa/pwa.pug +0 -325
- package/docs/pwa/pwa.scss +0 -26
- package/docs/spec.scss +0 -26
- package/docs/themes/_component-themes.scss +0 -26
- package/docs/themes/theme-colored-fallbacks.scss +0 -17
- package/docs/themes/theme-colored.scss +0 -17
- package/docs/themes/theme-default-fallbacks.scss +0 -17
- package/docs/themes/theme-default.scss +0 -17
- package/jsconfig.json +0 -12
- package/scripts/deploy-docs.sh +0 -9
- package/templates/index.eta +0 -2
- package/templates/index.pug +0 -3
- package/webpack.config.cjs +0 -257
|
@@ -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
|
+
};
|