@davidsouther/jiffies 1.0.0-beta.1 → 2.0.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/{build → lib/cjs}/assert.d.ts +0 -0
- package/lib/cjs/assert.js +40 -0
- package/{build → lib/cjs}/case.d.ts +0 -0
- package/lib/cjs/case.js +9 -0
- package/{build → lib/cjs}/components/button_bar.d.ts +1 -1
- package/lib/cjs/components/button_bar.js +29 -0
- package/{build → lib/cjs}/components/inline_edit.d.ts +1 -1
- package/lib/cjs/components/inline_edit.js +51 -0
- package/{build → lib/cjs}/components/logger.d.ts +2 -3
- package/lib/cjs/components/logger.js +27 -0
- package/lib/cjs/components/select.d.ts +10 -0
- package/lib/cjs/components/select.js +6 -0
- package/lib/cjs/components/test.d.ts +1 -0
- package/lib/cjs/components/test.js +7 -0
- package/{build → lib/cjs}/components/virtual_scroll.d.ts +3 -4
- package/lib/cjs/components/virtual_scroll.js +102 -0
- package/{build → lib/cjs}/components/virtual_scroll.test.d.ts +0 -0
- package/lib/cjs/components/virtual_scroll.test.js +22 -0
- package/{build → lib/cjs}/context.d.ts +0 -0
- package/lib/cjs/context.js +48 -0
- package/{build → lib/cjs}/context.test.d.ts +0 -0
- package/lib/cjs/context.test.js +48 -0
- package/{build → lib/cjs}/debounce.d.ts +0 -0
- package/lib/cjs/debounce.js +11 -0
- package/lib/cjs/diff.d.ts +15 -0
- package/lib/cjs/diff.js +58 -0
- package/{build/components/index.d.ts → lib/cjs/diff.test.d.ts} +0 -0
- package/lib/cjs/diff.test.js +41 -0
- package/{build → lib/cjs}/display.d.ts +0 -0
- package/lib/cjs/display.js +16 -0
- package/{build → lib/cjs}/dom/css/border.d.ts +0 -0
- package/lib/cjs/dom/css/border.js +33 -0
- package/{build → lib/cjs}/dom/css/constants.d.ts +0 -0
- package/lib/cjs/dom/css/constants.js +31 -0
- package/{build → lib/cjs}/dom/css/core.d.ts +0 -0
- package/lib/cjs/dom/css/core.js +31 -0
- package/{build → lib/cjs}/dom/css/fstyle.d.ts +0 -0
- package/lib/cjs/dom/css/fstyle.js +36 -0
- package/{build → lib/cjs}/dom/css/sizing.d.ts +0 -0
- package/lib/cjs/dom/css/sizing.js +14 -0
- package/lib/cjs/dom/dom.d.ts +27 -0
- package/lib/cjs/dom/dom.js +110 -0
- package/{build → lib/cjs}/dom/fc.d.ts +5 -5
- package/lib/cjs/dom/fc.js +39 -0
- package/{build → lib/cjs}/dom/fc.test.d.ts +0 -0
- package/lib/cjs/dom/fc.test.js +23 -0
- package/lib/cjs/dom/form/form.app.d.ts +1 -0
- package/lib/cjs/dom/form/form.app.js +27 -0
- package/lib/cjs/dom/form/form.d.ts +26 -0
- package/lib/cjs/dom/form/form.js +49 -0
- package/{build → lib/cjs}/dom/form/form.test.d.ts +0 -0
- package/{build → lib/cjs}/dom/form/form.test.js +0 -0
- package/lib/cjs/dom/html.d.ts +113 -0
- package/lib/cjs/dom/html.js +119 -0
- package/{build → lib/cjs}/dom/html.test.d.ts +0 -0
- package/lib/cjs/dom/html.test.js +60 -0
- package/lib/cjs/dom/observable.d.ts +2 -0
- package/lib/cjs/dom/observable.js +10 -0
- package/{build/components/index.js → lib/cjs/dom/observable.test.d.ts} +0 -0
- package/lib/cjs/dom/observable.test.js +35 -0
- package/lib/cjs/dom/provide.d.ts +3 -0
- package/lib/cjs/dom/provide.js +12 -0
- package/lib/cjs/dom/router/link.d.ts +6 -0
- package/lib/cjs/dom/router/link.js +7 -0
- package/{build → lib/cjs}/dom/router/router.d.ts +3 -3
- package/lib/cjs/dom/router/router.js +52 -0
- package/lib/cjs/dom/svg.d.ts +64 -0
- package/lib/cjs/dom/svg.js +69 -0
- package/lib/cjs/dom/test.d.ts +1 -0
- package/lib/cjs/dom/test.js +13 -0
- package/{build → lib/cjs}/dom/types/css.d.ts +0 -0
- package/lib/cjs/dom/types/css.js +24 -0
- package/{build → lib/cjs}/dom/types/dom.d.ts +0 -0
- package/{build → lib/cjs}/dom/types/dom.js +0 -0
- package/{build → lib/cjs}/dom/types/html.d.ts +1 -1
- package/lib/cjs/dom/types/html.js +2 -0
- package/{build → lib/cjs}/dom/xml.d.ts +0 -0
- package/lib/cjs/dom/xml.js +8 -0
- package/lib/cjs/equal.d.ts +5 -0
- package/lib/cjs/equal.js +43 -0
- package/{build → lib/cjs}/equal.test.d.ts +0 -0
- package/lib/cjs/equal.test.js +22 -0
- package/{build → lib/cjs}/flags.d.ts +0 -0
- package/lib/cjs/flags.js +52 -0
- package/{build → lib/cjs}/flags.test.d.ts +0 -0
- package/lib/cjs/flags.test.js +37 -0
- package/lib/cjs/fs.d.ts +48 -0
- package/lib/cjs/fs.js +151 -0
- package/{build/components/test.d.ts → lib/cjs/fs.test.d.ts} +0 -0
- package/lib/cjs/fs.test.js +45 -0
- package/{build → lib/cjs}/generator.d.ts +0 -0
- package/lib/cjs/generator.js +14 -0
- package/{build → lib/cjs}/generator.test.d.ts +0 -0
- package/lib/cjs/generator.test.js +26 -0
- package/{build → lib/cjs}/is_browser.d.ts +0 -0
- package/lib/cjs/is_browser.js +4 -0
- package/{build → lib/cjs}/loader.d.mts +0 -0
- package/lib/cjs/loader.mjs +40 -0
- package/{build → lib/cjs}/lock.d.ts +0 -0
- package/lib/cjs/lock.js +27 -0
- package/{build → lib/cjs}/lock.test.d.ts +0 -0
- package/lib/cjs/lock.test.js +18 -0
- package/{build → lib/cjs}/log.d.ts +0 -0
- package/lib/cjs/log.js +54 -0
- package/lib/cjs/observable/event.d.ts +35 -0
- package/lib/cjs/observable/event.js +61 -0
- package/lib/cjs/observable/observable.d.ts +132 -0
- package/lib/cjs/observable/observable.js +363 -0
- package/{build/dom/test.d.ts → lib/cjs/observable/observable.test.d.ts} +0 -0
- package/lib/cjs/observable/observable.test.js +65 -0
- package/{build → lib/cjs}/range.d.ts +0 -0
- package/lib/cjs/range.js +11 -0
- package/{build → lib/cjs}/result.d.ts +11 -11
- package/lib/cjs/result.js +80 -0
- package/{build → lib/cjs}/result.test.d.ts +0 -0
- package/lib/cjs/result.test.js +73 -0
- package/{build → lib/cjs}/safe.d.ts +0 -0
- package/lib/cjs/safe.js +14 -0
- package/{build → lib/cjs}/scope/describe.d.ts +4 -0
- package/lib/cjs/scope/describe.js +73 -0
- package/{build → lib/cjs}/scope/display/console.d.ts +0 -0
- package/lib/cjs/scope/display/console.js +25 -0
- package/{build → lib/cjs}/scope/display/dom.d.ts +2 -2
- package/lib/cjs/scope/display/dom.js +30 -0
- package/{build → lib/cjs}/scope/display/junit.d.ts +0 -0
- package/lib/cjs/scope/display/junit.js +21 -0
- package/{build → lib/cjs}/scope/execute.d.ts +1 -1
- package/lib/cjs/scope/execute.js +91 -0
- package/{build → lib/cjs}/scope/expect.d.ts +1 -1
- package/lib/cjs/scope/expect.js +114 -0
- package/{build → lib/cjs}/scope/fix.d.ts +0 -0
- package/lib/cjs/scope/fix.js +26 -0
- package/{build → lib/cjs}/scope/index.d.ts +0 -0
- package/lib/cjs/scope/index.js +15 -0
- package/{build → lib/cjs}/scope/scope.d.ts +0 -0
- package/lib/cjs/scope/scope.js +2 -0
- package/lib/cjs/scope/state.d.ts +1 -0
- package/lib/cjs/scope/state.js +11 -0
- package/{build → lib/cjs}/server/http/apps.d.ts +0 -0
- package/lib/cjs/server/http/apps.js +27 -0
- package/lib/cjs/server/http/css.d.ts +5 -0
- package/lib/cjs/server/http/css.js +54 -0
- package/{build → lib/cjs}/server/http/index.d.ts +0 -0
- package/lib/cjs/server/http/index.js +77 -0
- package/{build → lib/cjs}/server/http/response.d.ts +0 -0
- package/lib/cjs/server/http/response.js +45 -0
- package/{build → lib/cjs}/server/http/sitemap.d.ts +0 -0
- package/lib/cjs/server/http/sitemap.js +46 -0
- package/{build → lib/cjs}/server/http/static.d.ts +0 -0
- package/lib/cjs/server/http/static.js +25 -0
- package/{build → lib/cjs}/server/http/typescript.d.ts +0 -0
- package/lib/cjs/server/http/typescript.js +44 -0
- package/{build → lib/cjs}/server/main.d.ts +0 -0
- package/lib/cjs/server/main.js +14 -0
- package/{build → lib/cjs}/test.d.mts +0 -0
- package/lib/cjs/test.mjs +28 -0
- package/lib/cjs/test_all.d.ts +9 -0
- package/lib/cjs/test_all.js +30 -0
- package/{build → lib/cjs}/transpile.d.mts +0 -0
- package/lib/cjs/transpile.mjs +22 -0
- package/lib/cjs/tsconfig.tsbuildinfo +1 -0
- package/lib/esm/assert.d.ts +23 -0
- package/{build → lib/esm}/assert.js +1 -1
- package/lib/esm/case.d.ts +1 -0
- package/{build → lib/esm}/case.js +0 -0
- package/lib/esm/components/button_bar.d.ts +8 -0
- package/lib/esm/components/button_bar.js +27 -0
- package/lib/esm/components/inline_edit.d.ts +12 -0
- package/{build → lib/esm}/components/inline_edit.js +3 -3
- package/lib/esm/components/logger.d.ts +6 -0
- package/{build → lib/esm}/components/logger.js +3 -3
- package/lib/esm/components/select.d.ts +10 -0
- package/{build → lib/esm}/components/select.js +2 -2
- package/lib/esm/components/test.d.ts +1 -0
- package/lib/esm/components/test.js +3 -0
- package/lib/esm/components/virtual_scroll.d.ts +40 -0
- package/{build → lib/esm}/components/virtual_scroll.js +3 -3
- package/{build/dom/types/html.js → lib/esm/components/virtual_scroll.test.d.ts} +0 -0
- package/{build → lib/esm}/components/virtual_scroll.test.js +3 -4
- package/lib/esm/context.d.ts +15 -0
- package/{build → lib/esm}/context.js +3 -3
- package/{build/scope/scope.js → lib/esm/context.test.d.ts} +0 -0
- package/{build → lib/esm}/context.test.js +0 -0
- package/lib/esm/debounce.d.ts +1 -0
- package/{build → lib/esm}/debounce.js +0 -0
- package/lib/esm/diff.d.ts +15 -0
- package/lib/esm/diff.js +54 -0
- package/{build/test_all.d.ts → lib/esm/diff.test.d.ts} +0 -0
- package/lib/esm/diff.test.js +39 -0
- package/lib/esm/display.d.ts +5 -0
- package/lib/esm/display.js +11 -0
- package/lib/esm/dom/css/border.d.ts +11 -0
- package/{build → lib/esm}/dom/css/border.js +0 -0
- package/lib/esm/dom/css/constants.d.ts +31 -0
- package/{build → lib/esm}/dom/css/constants.js +0 -0
- package/lib/esm/dom/css/core.d.ts +5 -0
- package/{build → lib/esm}/dom/css/core.js +0 -0
- package/lib/esm/dom/css/fstyle.d.ts +5 -0
- package/{build → lib/esm}/dom/css/fstyle.js +0 -0
- package/lib/esm/dom/css/sizing.d.ts +5 -0
- package/{build → lib/esm}/dom/css/sizing.js +0 -0
- package/lib/esm/dom/dom.d.ts +27 -0
- package/{build → lib/esm}/dom/dom.js +44 -34
- package/lib/esm/dom/fc.d.ts +14 -0
- package/{build → lib/esm}/dom/fc.js +1 -1
- package/lib/esm/dom/fc.test.d.ts +1 -0
- package/{build → lib/esm}/dom/fc.test.js +0 -0
- package/lib/esm/dom/form/form.app.d.ts +1 -0
- package/{build → lib/esm}/dom/form/form.app.js +0 -0
- package/lib/esm/dom/form/form.d.ts +26 -0
- package/{build → lib/esm}/dom/form/form.js +14 -5
- package/lib/esm/dom/form/form.test.d.ts +0 -0
- package/lib/esm/dom/form/form.test.js +1 -0
- package/lib/esm/dom/html.d.ts +113 -0
- package/{build → lib/esm}/dom/html.js +0 -0
- package/lib/esm/dom/html.test.d.ts +1 -0
- package/{build → lib/esm}/dom/html.test.js +4 -4
- package/lib/esm/dom/observable.d.ts +2 -0
- package/lib/esm/dom/observable.js +6 -0
- package/lib/esm/dom/observable.test.d.ts +1 -0
- package/lib/esm/dom/observable.test.js +33 -0
- package/lib/esm/dom/provide.d.ts +3 -0
- package/lib/esm/dom/provide.js +7 -0
- package/lib/esm/dom/router/link.d.ts +6 -0
- package/{build → lib/esm}/dom/router/link.js +0 -0
- package/lib/esm/dom/router/router.d.ts +12 -0
- package/{build → lib/esm}/dom/router/router.js +0 -0
- package/lib/esm/dom/svg.d.ts +64 -0
- package/{build → lib/esm}/dom/svg.js +0 -0
- package/lib/esm/dom/test.d.ts +1 -0
- package/lib/esm/dom/test.js +9 -0
- package/lib/esm/dom/types/css.d.ts +6612 -0
- package/{build → lib/esm}/dom/types/css.js +0 -0
- package/lib/esm/dom/types/dom.d.ts +0 -0
- package/lib/esm/dom/types/dom.js +1 -0
- package/lib/esm/dom/types/html.d.ts +616 -0
- package/lib/esm/dom/types/html.js +1 -0
- package/lib/esm/dom/xml.d.ts +1 -0
- package/{build → lib/esm}/dom/xml.js +1 -2
- package/lib/esm/equal.d.ts +5 -0
- package/lib/esm/equal.js +37 -0
- package/lib/esm/equal.test.d.ts +1 -0
- package/{build → lib/esm}/equal.test.js +0 -0
- package/lib/esm/flags.d.ts +7 -0
- package/{build → lib/esm}/flags.js +1 -1
- package/lib/esm/flags.test.d.ts +1 -0
- package/{build → lib/esm}/flags.test.js +0 -0
- package/lib/esm/fs.d.ts +48 -0
- package/lib/esm/fs.js +144 -0
- package/lib/esm/fs.test.d.ts +1 -0
- package/lib/esm/fs.test.js +43 -0
- package/lib/esm/generator.d.ts +1 -0
- package/{build → lib/esm}/generator.js +0 -0
- package/lib/esm/generator.test.d.ts +1 -0
- package/{build → lib/esm}/generator.test.js +0 -0
- package/lib/esm/is_browser.d.ts +1 -0
- package/{build → lib/esm}/is_browser.js +0 -0
- package/lib/esm/loader.d.mts +22 -0
- package/{build → lib/esm}/loader.mjs +0 -0
- package/lib/esm/lock.d.ts +1 -0
- package/{build → lib/esm}/lock.js +0 -0
- package/lib/esm/lock.test.d.ts +1 -0
- package/{build → lib/esm}/lock.test.js +0 -0
- package/lib/esm/log.d.ts +26 -0
- package/{build → lib/esm}/log.js +16 -4
- package/lib/esm/observable/event.d.ts +35 -0
- package/lib/esm/observable/event.js +46 -0
- package/lib/esm/observable/observable.d.ts +132 -0
- package/lib/esm/observable/observable.js +343 -0
- package/lib/esm/observable/observable.test.d.ts +1 -0
- package/lib/esm/observable/observable.test.js +63 -0
- package/lib/esm/range.d.ts +1 -0
- package/{build → lib/esm}/range.js +0 -0
- package/lib/esm/result.d.ts +31 -0
- package/{build → lib/esm}/result.js +3 -3
- package/lib/esm/result.test.d.ts +1 -0
- package/{build → lib/esm}/result.test.js +0 -0
- package/lib/esm/safe.d.ts +1 -0
- package/{build → lib/esm}/safe.js +0 -0
- package/lib/esm/scope/describe.d.ts +18 -0
- package/{build → lib/esm}/scope/describe.js +14 -6
- package/lib/esm/scope/display/console.d.ts +2 -0
- package/{build → lib/esm}/scope/display/console.js +0 -0
- package/lib/esm/scope/display/dom.d.ts +3 -0
- package/{build → lib/esm}/scope/display/dom.js +0 -0
- package/lib/esm/scope/display/junit.d.ts +2 -0
- package/{build → lib/esm}/scope/display/junit.js +0 -0
- package/lib/esm/scope/execute.d.ts +12 -0
- package/{build → lib/esm}/scope/execute.js +3 -3
- package/lib/esm/scope/expect.d.ts +23 -0
- package/{build → lib/esm}/scope/expect.js +4 -3
- package/lib/esm/scope/fix.d.ts +4 -0
- package/{build → lib/esm}/scope/fix.js +0 -0
- package/{build/scope/index.js → lib/esm/scope/index.d.ts} +0 -0
- package/lib/esm/scope/index.js +3 -0
- package/lib/esm/scope/scope.d.ts +17 -0
- package/lib/esm/scope/scope.js +1 -0
- package/lib/esm/scope/state.d.ts +1 -0
- package/lib/esm/scope/state.js +7 -0
- package/lib/esm/server/http/apps.d.ts +5 -0
- package/{build → lib/esm}/server/http/apps.js +0 -0
- package/lib/esm/server/http/css.d.ts +5 -0
- package/lib/esm/server/http/css.js +50 -0
- package/lib/esm/server/http/index.d.ts +21 -0
- package/{build → lib/esm}/server/http/index.js +4 -2
- package/lib/esm/server/http/response.d.ts +4 -0
- package/{build → lib/esm}/server/http/response.js +6 -3
- package/lib/esm/server/http/sitemap.d.ts +2 -0
- package/{build → lib/esm}/server/http/sitemap.js +0 -0
- package/lib/esm/server/http/static.d.ts +2 -0
- package/{build → lib/esm}/server/http/static.js +0 -0
- package/lib/esm/server/http/typescript.d.ts +5 -0
- package/{build → lib/esm}/server/http/typescript.js +0 -0
- package/lib/esm/server/main.d.ts +2 -0
- package/{build → lib/esm}/server/main.js +5 -2
- package/lib/esm/test.d.mts +2 -0
- package/lib/esm/test.mjs +26 -0
- package/lib/esm/test_all.d.ts +9 -0
- package/lib/esm/test_all.js +28 -0
- package/lib/esm/transpile.d.mts +3 -0
- package/{build → lib/esm}/transpile.mjs +0 -0
- package/lib/esm/tsconfig.tsbuildinfo +1 -0
- package/package.json +18 -16
- package/src/assert.ts +1 -1
- package/src/components/button_bar.ts +33 -27
- package/src/components/inline_edit.ts +3 -3
- package/src/components/logger.ts +5 -6
- package/src/components/select.ts +3 -3
- package/src/components/test.js +3 -2
- package/src/components/virtual_scroll.test.ts +4 -4
- package/src/components/virtual_scroll.ts +8 -8
- package/src/context.ts +3 -3
- package/src/diff.test.ts +48 -0
- package/src/diff.ts +84 -0
- package/src/display.ts +8 -2
- package/src/dom/css/border.ts +3 -3
- package/src/dom/css/core.ts +1 -1
- package/src/dom/css/fstyle.ts +2 -2
- package/src/dom/css/sizing.ts +1 -1
- package/src/dom/dom.ts +73 -60
- package/src/dom/fc.test.ts +3 -3
- package/src/dom/fc.ts +11 -10
- package/src/dom/form/form.app.ts +2 -2
- package/src/dom/form/form.ts +33 -10
- package/src/dom/html.test.ts +8 -8
- package/src/dom/html.ts +7 -10
- package/src/dom/observable.test.ts +43 -0
- package/src/dom/observable.ts +11 -0
- package/src/dom/provide.ts +11 -0
- package/src/dom/router/link.ts +2 -2
- package/src/dom/router/router.ts +5 -5
- package/src/dom/svg.ts +1 -1
- package/src/dom/test.ts +8 -2
- package/src/dom/types/html.ts +1 -1
- package/src/dom/xml.ts +1 -2
- package/src/equal.ts +22 -11
- package/src/flags.ts +1 -1
- package/src/fs.test.ts +53 -0
- package/src/fs.ts +180 -0
- package/src/index.html +16 -13
- package/src/log.ts +8 -4
- package/src/observable/_notes +21 -8
- package/src/observable/event.ts +93 -0
- package/src/observable/observable.test.ts +73 -0
- package/src/observable/observable.ts +463 -0
- package/src/pico/_variables.scss +66 -0
- package/src/pico/components/_accordion.scss +112 -0
- package/src/pico/components/_button-group.scss +51 -0
- package/src/pico/components/_card.scss +47 -0
- package/src/pico/components/_dropdown.scss +203 -0
- package/src/pico/components/_modal.scss +181 -0
- package/src/pico/components/_nav.scss +79 -0
- package/src/pico/components/_progress.scss +70 -0
- package/src/pico/components/_property.scss +34 -0
- package/src/pico/content/_button.scss +152 -0
- package/src/pico/content/_code.scss +63 -0
- package/src/pico/content/_embedded.scss +0 -0
- package/src/pico/content/_form-alt.scss +276 -0
- package/src/pico/content/_form.scss +259 -0
- package/src/pico/content/_misc.scss +0 -0
- package/src/pico/content/_table.scss +28 -0
- package/src/pico/content/_toggle.scss +132 -0
- package/src/pico/content/_typography.scss +232 -0
- package/src/pico/layout/_container.scss +40 -0
- package/src/pico/layout/_document.scss +0 -0
- package/src/pico/layout/_flex.scss +46 -0
- package/src/pico/layout/_grid.scss +24 -0
- package/src/pico/layout/_scroller.scss +16 -0
- package/src/pico/layout/_section.scss +8 -0
- package/src/pico/layout/_sectioning.scss +55 -0
- package/src/pico/pico.scss +60 -0
- package/src/pico/reset/_accessibility.scss +34 -0
- package/src/pico/reset/_button.scss +17 -0
- package/src/pico/reset/_code.scss +15 -0
- package/src/pico/reset/_document.scss +48 -0
- package/src/pico/reset/_embedded.scss +39 -0
- package/src/pico/reset/_form.scss +97 -0
- package/src/pico/reset/_misc.scss +23 -0
- package/src/pico/reset/_nav.scss +5 -0
- package/src/pico/reset/_progress.scss +4 -0
- package/src/pico/reset/_table.scss +8 -0
- package/src/pico/reset/_typography.scss +25 -0
- package/src/pico/themes/default/_colors.scss +65 -0
- package/src/pico/themes/default/_dark.scss +148 -0
- package/src/pico/themes/default/_light.scss +149 -0
- package/src/pico/themes/default/_styles.scss +272 -0
- package/src/pico/themes/default.scss +34 -0
- package/src/pico/utilities/_accessibility.scss +3 -0
- package/src/pico/utilities/_loading.scss +52 -0
- package/src/pico/utilities/_reduce-motion.scss +27 -0
- package/src/pico/utilities/_tooltip.scss +101 -0
- package/src/result.ts +17 -21
- package/src/scope/describe.ts +16 -6
- package/src/scope/display/console.ts +4 -4
- package/src/scope/display/dom.ts +7 -7
- package/src/scope/display/junit.ts +3 -3
- package/src/scope/execute.ts +5 -8
- package/src/scope/expect.ts +12 -11
- package/src/scope/state.ts +10 -0
- package/src/server/http/css.ts +65 -0
- package/src/server/http/index.ts +4 -2
- package/src/server/http/response.ts +7 -4
- package/src/server/http/sitemap.ts +1 -1
- package/src/server/main.ts +9 -2
- package/src/test.mjs +22 -18
- package/src/test_all.ts +20 -9
- package/src/zip/spec.txt +3260 -0
- package/build/components/button_bar.js +0 -16
- package/build/components/select.d.ts +0 -13
- package/build/components/test.js +0 -2
- package/build/display.js +0 -3
- package/build/dom/dom.d.ts +0 -27
- package/build/dom/form/form.app.d.ts +0 -1
- package/build/dom/form/form.d.ts +0 -25
- package/build/dom/html.d.ts +0 -117
- package/build/dom/router/link.d.ts +0 -6
- package/build/dom/svg.d.ts +0 -64
- package/build/dom/test.js +0 -2
- package/build/equal.d.ts +0 -4
- package/build/equal.js +0 -22
- package/build/index.d.ts +0 -13
- package/build/index.js +0 -13
- package/build/parcel_resolver.d.ts +0 -3
- package/build/parcel_resolver.js +0 -19
- package/build/test.mjs +0 -23
- package/build/test_all.js +0 -19
- package/src/observable/observable._js +0 -175
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { describe, expect, it } from "../scope/index.js"
|
|
2
|
+
import { Observable, Subject, filter, map } from "./observable.js"
|
|
3
|
+
|
|
4
|
+
describe("Observables", () => {
|
|
5
|
+
describe("basics", () => {
|
|
6
|
+
it("can create and observe a scalar subject", async () => {
|
|
7
|
+
const subject = new Subject<number>();
|
|
8
|
+
|
|
9
|
+
let resolved = 42;
|
|
10
|
+
|
|
11
|
+
subject.subscribe({
|
|
12
|
+
next: (n) => {
|
|
13
|
+
resolved = n;
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
expect(resolved).toBe(42);
|
|
18
|
+
await subject.next(64);
|
|
19
|
+
expect(resolved).toBe(64);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
describe("creation", () => {
|
|
24
|
+
it("builds an observable of items", async () => {
|
|
25
|
+
const stream = Observable.of(2, 4, 8, 16);
|
|
26
|
+
let values: number[] = [];
|
|
27
|
+
await new Promise<void>((resolve) => {
|
|
28
|
+
stream.subscribe({
|
|
29
|
+
next: (n) => {
|
|
30
|
+
values.unshift(n);
|
|
31
|
+
},
|
|
32
|
+
complete: () => {
|
|
33
|
+
resolve();
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
expect(values).toEqual([16, 8, 4, 2]);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe("pipes", () => {
|
|
42
|
+
it("runs a pipe", async () => {
|
|
43
|
+
const subject = new Subject<number>();
|
|
44
|
+
|
|
45
|
+
let resolved = 0;
|
|
46
|
+
const inflate = (i: number) => (n: number) => n + i;
|
|
47
|
+
const biggerThan = (i: number) => (n: number) => n > i;
|
|
48
|
+
const assign = (n: number) => {
|
|
49
|
+
resolved = n;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
subject.pipe(map(inflate(22)), filter(biggerThan(70))).subscribe(assign);
|
|
53
|
+
|
|
54
|
+
expect(resolved).toBe(0);
|
|
55
|
+
await subject.next(42);
|
|
56
|
+
expect(resolved).toBe(0);
|
|
57
|
+
await subject.next(50);
|
|
58
|
+
expect(resolved).toBe(72);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
describe("Subject", () => {
|
|
63
|
+
it("is callable", async () => {
|
|
64
|
+
const subject = new Subject<number>();
|
|
65
|
+
let resolved = 0;
|
|
66
|
+
subject.subscribe((n) => {
|
|
67
|
+
resolved = n;
|
|
68
|
+
});
|
|
69
|
+
await subject.next(42);
|
|
70
|
+
expect(resolved).toBe(42);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import { DEFAULT_LOGGER, Logger } from "../log.js"
|
|
2
|
+
|
|
3
|
+
export interface FullSubscriber<T, E> {
|
|
4
|
+
// (t: T): void | Promise<undefined>;
|
|
5
|
+
next?: (t: T) => void | Promise<undefined>;
|
|
6
|
+
error?: (e: E) => void | Promise<undefined>;
|
|
7
|
+
complete?: () => void | Promise<undefined>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export type Subscriber<T, E> =
|
|
11
|
+
| FullSubscriber<T, E>
|
|
12
|
+
// | EventSubscriber<T, E>
|
|
13
|
+
| ((t: T) => void | Promise<undefined>);
|
|
14
|
+
|
|
15
|
+
export interface Subscription {
|
|
16
|
+
// (): void;
|
|
17
|
+
unsubscribe(): void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface Observable<T, E = unknown> {
|
|
21
|
+
// (subscriber: Subscriber<T, E>): Subscription;
|
|
22
|
+
subscribe(subscriber: Subscriber<T, E>): Subscription;
|
|
23
|
+
pipe<T1>(o1: Subscriber<T, E> & Observable<T1, E>): Observable<T1, E>;
|
|
24
|
+
pipe<T1, T2>(
|
|
25
|
+
o1: Subscriber<T, E> & Observable<T1, E>,
|
|
26
|
+
o2: Subscriber<T1, E> & Observable<T2, E>
|
|
27
|
+
): Observable<T2, E>;
|
|
28
|
+
filter(fn: (t: T) => boolean): Observable<T, E>;
|
|
29
|
+
distinct(fn?: (t1: T, t2: T) => boolean): Observable<T, E>;
|
|
30
|
+
map<U>(fn: (t: T) => U): Observable<U, E>;
|
|
31
|
+
reduce<A>(fn: (acc: A, t: T) => A, init: A): Observable<A, E>;
|
|
32
|
+
replay(n: number): Observable<T, E>;
|
|
33
|
+
tap(s: Subscriber<T, E>): Observable<T, E>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const Observable = {
|
|
37
|
+
of<T, E>(...ts: T[]): Observable<T, E> {
|
|
38
|
+
const subject = new Subject<T, E>();
|
|
39
|
+
(async function next() {
|
|
40
|
+
if (subject.cold) {
|
|
41
|
+
subject.onWarm(next);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (ts.length === 0) {
|
|
45
|
+
subject.complete();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const t = ts.shift()!;
|
|
49
|
+
await subject.next(t);
|
|
50
|
+
next();
|
|
51
|
+
})();
|
|
52
|
+
return subject;
|
|
53
|
+
},
|
|
54
|
+
combineLatest<T1, T2, E>(
|
|
55
|
+
o1: Observable<T1, E>,
|
|
56
|
+
o2: Observable<T2, E>
|
|
57
|
+
): Observable<[T1, T2], E> {
|
|
58
|
+
let latestSubject = new Subject<[T1, T2], E>();
|
|
59
|
+
let o1LatestSet = false;
|
|
60
|
+
let o1Latest: T1;
|
|
61
|
+
let o2LatestSet = false;
|
|
62
|
+
let o2Latest: T2;
|
|
63
|
+
|
|
64
|
+
function next() {
|
|
65
|
+
if (o1LatestSet && o2LatestSet) {
|
|
66
|
+
latestSubject.next([o1Latest, o2Latest]);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function error(e: E) {
|
|
71
|
+
latestSubject.error(e);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function complete() {
|
|
75
|
+
latestSubject.complete();
|
|
76
|
+
o1sub.unsubscribe();
|
|
77
|
+
o2sub.unsubscribe();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
let o1sub = o1.subscribe({
|
|
81
|
+
next(t: T1) {
|
|
82
|
+
o1Latest = t;
|
|
83
|
+
o1LatestSet = true;
|
|
84
|
+
next();
|
|
85
|
+
},
|
|
86
|
+
error,
|
|
87
|
+
complete,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
let o2sub = o2.subscribe({
|
|
91
|
+
next(t: T2) {
|
|
92
|
+
o2Latest = t;
|
|
93
|
+
o2LatestSet = true;
|
|
94
|
+
next();
|
|
95
|
+
},
|
|
96
|
+
error,
|
|
97
|
+
complete,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
return latestSubject;
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
interface Scheduler {
|
|
105
|
+
execute(fn: () => (void | Promise<undefined>)[]): void | Promise<undefined>;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export const AsyncScheduler: Scheduler = {
|
|
109
|
+
execute(fn: () => Promise<undefined>[]): Promise<undefined> {
|
|
110
|
+
return Promise.all(fn()).then(() => undefined);
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
export const SyncScheduler: Scheduler = {
|
|
115
|
+
execute(fn: () => void[]): void {
|
|
116
|
+
fn();
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
export class Subject<T, E = unknown, T2 = T>
|
|
121
|
+
implements FullSubscriber<T, E>, Observable<T, E>
|
|
122
|
+
{
|
|
123
|
+
#coldWaiters = new Set<Function>();
|
|
124
|
+
#subscribers = new Set<FullSubscriber<T, E>>();
|
|
125
|
+
#complete = false;
|
|
126
|
+
|
|
127
|
+
get $(): Observable<T, E> {
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
get hot(): boolean {
|
|
132
|
+
return this.#subscribers.size > 0;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
get cold(): boolean {
|
|
136
|
+
return !this.hot;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
constructor(private readonly scheduler: Scheduler = AsyncScheduler) {}
|
|
140
|
+
|
|
141
|
+
onWarm(fn: Function) {
|
|
142
|
+
if (this.cold) this.#coldWaiters.add(fn);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
next(t: T | T2): void | Promise<undefined> {
|
|
146
|
+
if (this.#complete)
|
|
147
|
+
throw new Error("Cannot call next on a completed subject");
|
|
148
|
+
return this.scheduler.execute(() =>
|
|
149
|
+
[...this.#subscribers].map((s) => s.next?.(t as T))
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
error(e: E): void | Promise<undefined> {
|
|
154
|
+
if (this.#complete)
|
|
155
|
+
throw new Error("Cannot call error on a completed subject");
|
|
156
|
+
return this.scheduler.execute(() =>
|
|
157
|
+
[...this.#subscribers].map((s) => s.error?.(e))
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
complete(): void | Promise<undefined> {
|
|
162
|
+
if (this.#complete)
|
|
163
|
+
throw new Error("Cannot call complete on a completed subject");
|
|
164
|
+
this.#complete = true;
|
|
165
|
+
const finished = this.scheduler.execute(() =>
|
|
166
|
+
[...this.#subscribers].map((s) => s.complete?.())
|
|
167
|
+
);
|
|
168
|
+
this.#subscribers.clear(); // Free subscribers for garbage collection
|
|
169
|
+
return finished;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
subscribe(subscriber: Subscriber<T, E>): Subscription {
|
|
173
|
+
if (this.#complete)
|
|
174
|
+
throw new Error("Cannot call subscribe on a completed subject");
|
|
175
|
+
|
|
176
|
+
if (subscriber instanceof Function) {
|
|
177
|
+
subscriber = { next: subscriber };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
this.#subscribers.add(subscriber);
|
|
181
|
+
|
|
182
|
+
[...this.#coldWaiters].forEach((w) => w());
|
|
183
|
+
this.#coldWaiters.clear();
|
|
184
|
+
|
|
185
|
+
return {
|
|
186
|
+
unsubscribe: () =>
|
|
187
|
+
this.#subscribers.delete(subscriber as FullSubscriber<T, E>),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
pipe<T1>(o1: Subscriber<T, E> & Observable<T1, E>): Observable<T1, E>;
|
|
192
|
+
pipe<T1, T2>(
|
|
193
|
+
o1: Subscriber<T, E> & Observable<T1, E>,
|
|
194
|
+
o2: Subscriber<T1, E> & Observable<T2, E>
|
|
195
|
+
): Observable<T2, E>;
|
|
196
|
+
pipe(
|
|
197
|
+
...os: (Subscriber<unknown, unknown> & Observable<unknown, unknown>)[]
|
|
198
|
+
): Observable<unknown, E> {
|
|
199
|
+
this.subscribe(os[0]);
|
|
200
|
+
for (let i = 1; i < os.length; i++) {
|
|
201
|
+
os[i - 1].subscribe(os[i]);
|
|
202
|
+
}
|
|
203
|
+
return os[os.length - 1];
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
filter(fn: (t: T) => boolean): Observable<T, E> {
|
|
207
|
+
return this.pipe(operator.filter(fn));
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
distinct(fn: (t1: T, t2: T) => boolean = Object.is): Observable<T, E> {
|
|
211
|
+
return this.pipe(operator.distinct(fn));
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
map<U>(fn: (t: T) => U): Observable<U, E> {
|
|
215
|
+
return this.pipe(operator.map(fn));
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
reduce<A>(fn: (acc: A, t: T) => A, init: A): Observable<A, E> {
|
|
219
|
+
return this.pipe(operator.reduce(fn, init));
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
replay(n: number): Observable<T, E> {
|
|
223
|
+
return this.pipe(operator.replay(n));
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
tap(s: Subscriber<T, E>): Observable<T, E> {
|
|
227
|
+
return this.pipe(operator.tap(s));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export class BehaviorSubject<T, E = unknown, T2 = T> extends Subject<T, E, T2> {
|
|
232
|
+
#current: T;
|
|
233
|
+
|
|
234
|
+
constructor(t: T, scheduler?: Scheduler) {
|
|
235
|
+
super(scheduler);
|
|
236
|
+
this.#current = t;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
next(t: T | T2) {
|
|
240
|
+
this.#current = t as T;
|
|
241
|
+
return super.next(t);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
subscribe(subscriber: Subscriber<T, E>): Subscription {
|
|
245
|
+
if (subscriber instanceof Function) {
|
|
246
|
+
subscriber = { next: subscriber };
|
|
247
|
+
}
|
|
248
|
+
subscriber.next?.(this.#current);
|
|
249
|
+
return super.subscribe(subscriber);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
get current(): T {
|
|
253
|
+
return this.#current;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export class ReplaySubject<T, E = unknown> extends Subject<T, E> {
|
|
258
|
+
#history: T[] = [];
|
|
259
|
+
|
|
260
|
+
constructor(private readonly n: number, scheduler?: Scheduler) {
|
|
261
|
+
super(scheduler);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
next(t: T) {
|
|
265
|
+
this.#history.push(t);
|
|
266
|
+
if (this.#history.length > this.n) {
|
|
267
|
+
this.#history.shift();
|
|
268
|
+
}
|
|
269
|
+
return super.next(t);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
subscribe(subscriber: Subscriber<T, E>): Subscription {
|
|
273
|
+
if (subscriber instanceof Function) {
|
|
274
|
+
subscriber = { next: subscriber };
|
|
275
|
+
}
|
|
276
|
+
const history = [...this.#history];
|
|
277
|
+
(function send() {
|
|
278
|
+
if (history.length == 0) return;
|
|
279
|
+
const t = history.shift()!;
|
|
280
|
+
subscriber.next?.(t);
|
|
281
|
+
new Promise(send);
|
|
282
|
+
})();
|
|
283
|
+
return super.subscribe(subscriber);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export function eventListener<E extends Event>() {
|
|
288
|
+
const observable = new Subject<E, unknown>();
|
|
289
|
+
function listener(e: E) {
|
|
290
|
+
e.preventDefault();
|
|
291
|
+
observable.next(e);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return [observable, listener];
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export class EventHandler<E extends Event> extends Subject<E> {
|
|
298
|
+
constructor(private readonly eventFn: (e: E) => void | Promise<undefined>) {
|
|
299
|
+
super();
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
next(e: E) {
|
|
303
|
+
e.preventDefault();
|
|
304
|
+
super.next(e);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
export const watch =
|
|
309
|
+
<T, E>(logger: Logger = DEFAULT_LOGGER) =>
|
|
310
|
+
(observable: Observable<T, E>) => {
|
|
311
|
+
observable.tap({
|
|
312
|
+
next(t: T) {
|
|
313
|
+
logger.info(t);
|
|
314
|
+
},
|
|
315
|
+
complete() {
|
|
316
|
+
logger.info("Observable completed");
|
|
317
|
+
},
|
|
318
|
+
error(e: E) {
|
|
319
|
+
logger.warn(e);
|
|
320
|
+
},
|
|
321
|
+
});
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
class MapOperator<T, U, E>
|
|
325
|
+
extends Subject<U, E, T>
|
|
326
|
+
implements FullSubscriber<T, E>, Observable<U, E>
|
|
327
|
+
{
|
|
328
|
+
constructor(private readonly mapFn: (t: T) => U) {
|
|
329
|
+
super();
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
next(t: T): void | Promise<undefined> {
|
|
333
|
+
return super.next(this.mapFn(t));
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
class FilterOperator<T, E>
|
|
338
|
+
extends Subject<T, E>
|
|
339
|
+
implements FullSubscriber<T, E>, Observable<T, E>
|
|
340
|
+
{
|
|
341
|
+
constructor(private readonly filterFn: (t: T) => boolean) {
|
|
342
|
+
super();
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
next(t: T): void | Promise<undefined> {
|
|
346
|
+
return this.filterFn(t) ? super.next(t) : undefined;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
class DistinctOperator<T, E>
|
|
351
|
+
extends Subject<T, E>
|
|
352
|
+
implements FullSubscriber<T, E>, Observable<T, E>
|
|
353
|
+
{
|
|
354
|
+
#prior: T | undefined = undefined;
|
|
355
|
+
|
|
356
|
+
constructor(
|
|
357
|
+
private readonly distinctFn: (t1: T, t2: T) => boolean = Object.is
|
|
358
|
+
) {
|
|
359
|
+
super();
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
next(t: T): void | Promise<undefined> {
|
|
363
|
+
if (this.#prior === undefined) {
|
|
364
|
+
this.#prior = t;
|
|
365
|
+
return super.next(t);
|
|
366
|
+
}
|
|
367
|
+
const same = this.distinctFn(this.#prior!, t);
|
|
368
|
+
if (!same) {
|
|
369
|
+
this.#prior = t;
|
|
370
|
+
return super.next(t);
|
|
371
|
+
}
|
|
372
|
+
return undefined;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
class ReduceOperator<A, T, E> extends BehaviorSubject<A, E, T> {
|
|
377
|
+
constructor(private readonly fn: (acc: A, t: T) => A, init: A) {
|
|
378
|
+
super(init);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
next(t: T) {
|
|
382
|
+
return super.next(this.fn(this.current, t));
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
export class TakeUntilOperator<T, E> extends Subject<T, E> {
|
|
387
|
+
constructor(o: Observable<unknown, unknown>) {
|
|
388
|
+
super();
|
|
389
|
+
o.subscribe(() => this.complete());
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
export class TapOperator<T, E> extends Subject<T, E> {
|
|
393
|
+
private readonly subscriber: FullSubscriber<T, E>;
|
|
394
|
+
constructor(fn: Subscriber<T, E>) {
|
|
395
|
+
super();
|
|
396
|
+
this.subscriber = fn instanceof Function ? { next: fn } : fn;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
next(t: T) {
|
|
400
|
+
this.subscriber.next?.(t);
|
|
401
|
+
return super.next(t);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
error(e: E) {
|
|
405
|
+
this.subscriber.error?.(e);
|
|
406
|
+
return super.error(e);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
complete() {
|
|
410
|
+
this.subscriber.complete?.();
|
|
411
|
+
return super.complete();
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
class FirstOperator<T, E> extends Subject<T, E> {
|
|
416
|
+
next(t: T): void | Promise<undefined> {
|
|
417
|
+
const next = super.next(t);
|
|
418
|
+
this.complete();
|
|
419
|
+
return next;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
class LastOperator<T, E = Error> extends Subject<T, E> {
|
|
424
|
+
#latest?: T;
|
|
425
|
+
|
|
426
|
+
next(t: T) {
|
|
427
|
+
this.#latest = t;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
complete(): void | Promise<undefined> {
|
|
431
|
+
if (this.#latest !== undefined) {
|
|
432
|
+
super.next(this.#latest);
|
|
433
|
+
}
|
|
434
|
+
return super.complete();
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
export const filter = <T, E>(fn: (t: T) => boolean) =>
|
|
439
|
+
new FilterOperator<T, E>(fn);
|
|
440
|
+
export const distinct = <T, E>(fn?: (t1: T, t2: T) => boolean) =>
|
|
441
|
+
new DistinctOperator<T, E>(fn ?? Object.is);
|
|
442
|
+
export const first = <T, E>() => new FirstOperator<T, E>();
|
|
443
|
+
export const last = <T, E>() => new LastOperator<T, E>();
|
|
444
|
+
export const map = <T1, T2, E>(fn: (t: T1) => T2) =>
|
|
445
|
+
new MapOperator<T1, T2, E>(fn);
|
|
446
|
+
export const replay = <T, E>(n: number) => new ReplaySubject<T, E>(n);
|
|
447
|
+
export const reduce = <A, T, E>(fn: (acc: A, t: T) => A, init: A) =>
|
|
448
|
+
new ReduceOperator<A, T, E>(fn, init);
|
|
449
|
+
export const takeUntil = <T, E>(o: Observable<unknown, unknown>) =>
|
|
450
|
+
new TakeUntilOperator<T, E>(o);
|
|
451
|
+
export const tap = <T, E>(fn: Subscriber<T, E>) => new TapOperator<T, E>(fn);
|
|
452
|
+
|
|
453
|
+
export const operator = {
|
|
454
|
+
filter,
|
|
455
|
+
distinct,
|
|
456
|
+
first,
|
|
457
|
+
last,
|
|
458
|
+
map,
|
|
459
|
+
replay,
|
|
460
|
+
reduce,
|
|
461
|
+
takeUntil,
|
|
462
|
+
tap,
|
|
463
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Config
|
|
2
|
+
// ––––––––––––––––––––
|
|
3
|
+
|
|
4
|
+
// Enable <header>, <main>, <footer> inside <body> as a container
|
|
5
|
+
$enable-semantic-container: true !default;
|
|
6
|
+
|
|
7
|
+
// Enable .container and .container-fluid
|
|
8
|
+
$enable-class-container: false !default;
|
|
9
|
+
|
|
10
|
+
// Enable a centered viewport for <header>, <main>, <footer> inside <body>
|
|
11
|
+
// Options are "all" to center all, "main" to only center main, and "none" to treat all as fluid.
|
|
12
|
+
$enable-viewport: "none" !default;
|
|
13
|
+
|
|
14
|
+
// Enable responsive spacings for <header>, <main>, <footer>, <section>, <article>
|
|
15
|
+
// Fixed spacings if disabled
|
|
16
|
+
$enable-responsive-spacings: true !default;
|
|
17
|
+
|
|
18
|
+
// Enable responsive typography
|
|
19
|
+
// Fixed root element size if disabled
|
|
20
|
+
$enable-responsive-typography: true !default;
|
|
21
|
+
|
|
22
|
+
// Enable .classes
|
|
23
|
+
// .classless version if disabled
|
|
24
|
+
$enable-classes: true !default;
|
|
25
|
+
|
|
26
|
+
// Enable .grid class
|
|
27
|
+
$enable-grid: true !default;
|
|
28
|
+
|
|
29
|
+
// Enable transitions
|
|
30
|
+
$enable-transitions: true !default;
|
|
31
|
+
|
|
32
|
+
// Enable overriding with !important
|
|
33
|
+
$enable-important: true !default;
|
|
34
|
+
|
|
35
|
+
// Responsive
|
|
36
|
+
// ––––––––––––––––––––
|
|
37
|
+
|
|
38
|
+
// xs: Extra small (portrait phones)
|
|
39
|
+
// sm: Small (landscape phones)
|
|
40
|
+
// md: Medium (tablets)
|
|
41
|
+
// lg: Large (desktops)
|
|
42
|
+
// xl: Extra large (large desktops, TVs)
|
|
43
|
+
|
|
44
|
+
// NOTE:
|
|
45
|
+
// To provide an easy and fine styling on each breakpoint
|
|
46
|
+
// we didn't use @each, @mixin or @include.
|
|
47
|
+
// That means you need to edit each CSS selector file to add a breakpoint
|
|
48
|
+
|
|
49
|
+
// Breakpoints
|
|
50
|
+
// 'null' disable the breakpoint
|
|
51
|
+
$breakpoints: (
|
|
52
|
+
xs: 0,
|
|
53
|
+
sm: 576px,
|
|
54
|
+
md: 768px,
|
|
55
|
+
lg: 992px,
|
|
56
|
+
xl: 1200px,
|
|
57
|
+
) !default;
|
|
58
|
+
|
|
59
|
+
// Viewports
|
|
60
|
+
$viewports: (
|
|
61
|
+
// 'null' disable the viewport on a breakpoint
|
|
62
|
+
sm: 510px,
|
|
63
|
+
md: 700px,
|
|
64
|
+
lg: 920px,
|
|
65
|
+
xl: 1130px
|
|
66
|
+
) !default;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
details {
|
|
2
|
+
display: block;
|
|
3
|
+
margin-bottom: var(--spacing);
|
|
4
|
+
padding-bottom: var(--spacing);
|
|
5
|
+
border-bottom: var(--border-width) solid var(--accordion-border-color);
|
|
6
|
+
|
|
7
|
+
summary {
|
|
8
|
+
line-height: 1rem;
|
|
9
|
+
list-style-type: none;
|
|
10
|
+
cursor: pointer;
|
|
11
|
+
|
|
12
|
+
&:not([role]) {
|
|
13
|
+
color: var(--accordion-close-summary-color);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@if $enable-transitions {
|
|
17
|
+
transition: color var(--transition);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Reset marker
|
|
21
|
+
&::-webkit-details-marker {
|
|
22
|
+
display: none;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
&::marker {
|
|
26
|
+
display: none;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
&::-moz-list-bullet {
|
|
30
|
+
list-style-type: none;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Marker
|
|
34
|
+
&::after {
|
|
35
|
+
display: block;
|
|
36
|
+
width: 1rem;
|
|
37
|
+
height: 1rem;
|
|
38
|
+
margin-inline-start: calc(var(--spacing, 1rem) * 0.5);
|
|
39
|
+
float: right;
|
|
40
|
+
transform: rotate(-90deg);
|
|
41
|
+
background-image: var(--icon-chevron);
|
|
42
|
+
background-position: right center;
|
|
43
|
+
background-size: 1rem auto;
|
|
44
|
+
background-repeat: no-repeat;
|
|
45
|
+
content: "";
|
|
46
|
+
|
|
47
|
+
@if $enable-transitions {
|
|
48
|
+
transition: transform var(--transition);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
&:focus {
|
|
53
|
+
outline: none;
|
|
54
|
+
|
|
55
|
+
&:not([role="button"]) {
|
|
56
|
+
color: var(--accordion-active-summary-color);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Type button
|
|
61
|
+
&[role="button"] {
|
|
62
|
+
width: 100%;
|
|
63
|
+
text-align: left;
|
|
64
|
+
|
|
65
|
+
// Marker
|
|
66
|
+
&::after {
|
|
67
|
+
height: calc(1rem * var(--line-height, 1.5));
|
|
68
|
+
background-image: var(--icon-chevron-button);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@if $enable-classes {
|
|
72
|
+
// .contrast
|
|
73
|
+
&:not(.outline).contrast {
|
|
74
|
+
// Marker
|
|
75
|
+
&::after {
|
|
76
|
+
background-image: var(--icon-chevron-button-inverse);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Open
|
|
84
|
+
&[open] {
|
|
85
|
+
> summary {
|
|
86
|
+
margin-bottom: calc(var(--spacing));
|
|
87
|
+
|
|
88
|
+
&:not([role]) {
|
|
89
|
+
&:not(:focus) {
|
|
90
|
+
color: var(--accordion-open-summary-color);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
&::after {
|
|
95
|
+
transform: rotate(0);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
[dir="rtl"] {
|
|
102
|
+
details {
|
|
103
|
+
summary {
|
|
104
|
+
text-align: right;
|
|
105
|
+
|
|
106
|
+
&::after {
|
|
107
|
+
float: left;
|
|
108
|
+
background-position: left center;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|