@owlmeans/web-panel 0.1.18-rc.9 → 0.1.18
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 +510 -143
- package/THIRD-PARTY-NOTICES.txt +24 -0
- package/agent-meta/manifest.json +163 -4
- package/agent-meta/skills/web-panel/SKILL.md +136 -83
- package/agent-meta/skills/web-panel/parts/consent.md +114 -0
- package/agent-meta/skills/web-panel/parts/editor.md +47 -0
- package/agent-meta/skills/web-panel/parts/forms.md +85 -0
- package/agent-meta/skills/web-panel/parts/navigation.md +203 -0
- package/agent-meta/skills/web-panel/parts/picker.md +164 -0
- package/agent-meta/skills/web-panel/parts/reload.md +46 -0
- package/agent-meta/skills/web-panel/parts/sign-in.md +65 -0
- package/agent-meta/skills/web-panel/parts/theme.md +74 -0
- package/build/@/components/ui/alert-dialog.d.ts +15 -0
- package/build/@/components/ui/alert-dialog.d.ts.map +1 -0
- package/build/@/components/ui/alert-dialog.js +39 -0
- package/build/@/components/ui/alert-dialog.js.map +1 -0
- package/build/@/components/ui/alert.js +1 -1
- package/build/@/components/ui/alert.js.map +1 -1
- package/build/@/components/ui/button.js +1 -1
- package/build/@/components/ui/button.js.map +1 -1
- package/build/@/components/ui/card.js +1 -1
- package/build/@/components/ui/card.js.map +1 -1
- package/build/@/components/ui/input.js +1 -1
- package/build/@/components/ui/input.js.map +1 -1
- package/build/@/components/ui/label.js +1 -1
- package/build/@/components/ui/label.js.map +1 -1
- package/build/@/components/ui/navigation-menu.js +1 -1
- package/build/@/components/ui/navigation-menu.js.map +1 -1
- package/build/@/components/ui/popover.d.ts +8 -0
- package/build/@/components/ui/popover.d.ts.map +1 -0
- package/build/@/components/ui/popover.js +17 -0
- package/build/@/components/ui/popover.js.map +1 -0
- package/build/@/components/ui/progress.js +1 -1
- package/build/@/components/ui/progress.js.map +1 -1
- package/build/@/components/ui/separator.js +1 -1
- package/build/@/components/ui/separator.js.map +1 -1
- package/build/@/components/ui/sheet.d.ts +15 -0
- package/build/@/components/ui/sheet.d.ts.map +1 -0
- package/build/@/components/ui/sheet.js +40 -0
- package/build/@/components/ui/sheet.js.map +1 -0
- package/build/auth/context.d.ts.map +1 -1
- package/build/auth/context.js +0 -1
- package/build/auth/context.js.map +1 -1
- package/build/auth/entrypoints.d.ts +10 -0
- package/build/auth/entrypoints.d.ts.map +1 -0
- package/build/auth/entrypoints.js +4 -0
- package/build/auth/entrypoints.js.map +1 -0
- package/build/auth/exports.d.ts +4 -4
- package/build/auth/exports.d.ts.map +1 -1
- package/build/auth/exports.js +3 -3
- package/build/auth/exports.js.map +1 -1
- package/build/auth/modules.d.ts +1 -1
- package/build/auth/modules.d.ts.map +1 -1
- package/build/auth/plugins/basic-ed25519.js +4 -4
- package/build/auth/plugins/basic-ed25519.js.map +1 -1
- package/build/auth/plugins/re-captcha.js +3 -3
- package/build/auth/plugins/re-captcha.js.map +1 -1
- package/build/auth/plugins/tunnel-consumer.js +1 -1
- package/build/auth/plugins/tunnel-consumer.js.map +1 -1
- package/build/components/block.js +2 -2
- package/build/components/block.js.map +1 -1
- package/build/components/consts.local.d.ts +14 -0
- package/build/components/consts.local.d.ts.map +1 -0
- package/build/components/consts.local.js +26 -0
- package/build/components/consts.local.js.map +1 -0
- package/build/components/footer/component.d.ts +19 -1
- package/build/components/footer/component.d.ts.map +1 -1
- package/build/components/footer/component.js +38 -11
- package/build/components/footer/component.js.map +1 -1
- package/build/components/footer/credit.d.ts +27 -0
- package/build/components/footer/credit.d.ts.map +1 -0
- package/build/components/footer/credit.js +42 -0
- package/build/components/footer/credit.js.map +1 -0
- package/build/components/footer/index.d.ts +1 -0
- package/build/components/footer/index.d.ts.map +1 -1
- package/build/components/footer/index.js +1 -0
- package/build/components/footer/index.js.map +1 -1
- package/build/components/footer/types.d.ts +22 -1
- package/build/components/footer/types.d.ts.map +1 -1
- package/build/components/form/button/component.d.ts.map +1 -1
- package/build/components/form/button/component.js +5 -3
- package/build/components/form/button/component.js.map +1 -1
- package/build/components/form/component.js +2 -2
- package/build/components/form/component.js.map +1 -1
- package/build/components/form/text/component.js +2 -2
- package/build/components/form/text/component.js.map +1 -1
- package/build/components/helper.d.ts.map +1 -1
- package/build/components/helper.js +1 -12
- package/build/components/helper.js.map +1 -1
- package/build/components/index.d.ts +4 -0
- package/build/components/index.d.ts.map +1 -1
- package/build/components/index.js +4 -0
- package/build/components/index.js.map +1 -1
- package/build/components/link.js +3 -3
- package/build/components/link.js.map +1 -1
- package/build/components/login/append.d.ts +15 -0
- package/build/components/login/append.d.ts.map +1 -0
- package/build/components/login/append.js +26 -0
- package/build/components/login/append.js.map +1 -0
- package/build/components/login/consts.d.ts +3 -0
- package/build/components/login/consts.d.ts.map +1 -0
- package/build/components/login/consts.js +3 -0
- package/build/components/login/consts.js.map +1 -0
- package/build/components/login/consts.local.d.ts +4 -0
- package/build/components/login/consts.local.d.ts.map +1 -0
- package/build/components/login/consts.local.js +8 -0
- package/build/components/login/consts.local.js.map +1 -0
- package/build/components/login/credit.d.ts +12 -0
- package/build/components/login/credit.d.ts.map +1 -0
- package/build/components/login/credit.js +18 -0
- package/build/components/login/credit.js.map +1 -0
- package/build/components/login/i18n/be.json +10 -0
- package/build/components/login/i18n/de.json +10 -0
- package/build/components/login/i18n/en.json +10 -0
- package/build/components/login/i18n/es.json +10 -0
- package/build/components/login/i18n/fr.json +10 -0
- package/build/components/login/i18n/pl.json +10 -0
- package/build/components/login/i18n/ru.json +10 -0
- package/build/components/login/i18n/uk.json +10 -0
- package/build/components/login/i18n.d.ts +2 -0
- package/build/components/login/i18n.d.ts.map +1 -0
- package/build/components/login/i18n.js +28 -0
- package/build/components/login/i18n.js.map +1 -0
- package/build/components/login/icons.d.ts +14 -0
- package/build/components/login/icons.d.ts.map +1 -0
- package/build/components/login/icons.js +29 -0
- package/build/components/login/icons.js.map +1 -0
- package/build/components/login/index.d.ts +11 -0
- package/build/components/login/index.d.ts.map +1 -0
- package/build/components/login/index.js +10 -0
- package/build/components/login/index.js.map +1 -0
- package/build/components/login/notify.d.ts +18 -0
- package/build/components/login/notify.d.ts.map +1 -0
- package/build/components/login/notify.js +41 -0
- package/build/components/login/notify.js.map +1 -0
- package/build/components/login/provider.d.ts +20 -0
- package/build/components/login/provider.d.ts.map +1 -0
- package/build/components/login/provider.js +31 -0
- package/build/components/login/provider.js.map +1 -0
- package/build/components/login/screen.d.ts +24 -0
- package/build/components/login/screen.d.ts.map +1 -0
- package/build/components/login/screen.js +92 -0
- package/build/components/login/screen.js.map +1 -0
- package/build/components/login/terms.d.ts +19 -0
- package/build/components/login/terms.d.ts.map +1 -0
- package/build/components/login/terms.js +32 -0
- package/build/components/login/terms.js.map +1 -0
- package/build/components/login/types.d.ts +28 -0
- package/build/components/login/types.d.ts.map +1 -0
- package/build/components/login/types.js +2 -0
- package/build/components/login/types.js.map +1 -0
- package/build/components/nav/consts.local.d.ts +41 -0
- package/build/components/nav/consts.local.d.ts.map +1 -0
- package/build/components/nav/consts.local.js +60 -0
- package/build/components/nav/consts.local.js.map +1 -0
- package/build/components/nav/index.d.ts +1 -0
- package/build/components/nav/index.d.ts.map +1 -1
- package/build/components/nav/index.js +1 -0
- package/build/components/nav/index.js.map +1 -1
- package/build/components/nav/layout.d.ts +9 -2
- package/build/components/nav/layout.d.ts.map +1 -1
- package/build/components/nav/layout.js +48 -7
- package/build/components/nav/layout.js.map +1 -1
- package/build/components/nav/mobile.d.ts +21 -0
- package/build/components/nav/mobile.d.ts.map +1 -0
- package/build/components/nav/mobile.js +55 -0
- package/build/components/nav/mobile.js.map +1 -0
- package/build/components/nav/side.d.ts.map +1 -1
- package/build/components/nav/side.js +10 -10
- package/build/components/nav/side.js.map +1 -1
- package/build/components/nav/top.d.ts.map +1 -1
- package/build/components/nav/top.js +12 -8
- package/build/components/nav/top.js.map +1 -1
- package/build/components/nav/types.d.ts +64 -1
- package/build/components/nav/types.d.ts.map +1 -1
- package/build/components/nav/viewport.d.ts +3 -0
- package/build/components/nav/viewport.d.ts.map +1 -0
- package/build/components/nav/viewport.js +14 -0
- package/build/components/nav/viewport.js.map +1 -0
- package/build/components/panel-app/component.d.ts.map +1 -1
- package/build/components/panel-app/component.js +4 -3
- package/build/components/panel-app/component.js.map +1 -1
- package/build/components/picker/color-picker.d.ts +9 -0
- package/build/components/picker/color-picker.d.ts.map +1 -0
- package/build/components/picker/color-picker.js +9 -0
- package/build/components/picker/color-picker.js.map +1 -0
- package/build/components/picker/consts.local.d.ts +76 -0
- package/build/components/picker/consts.local.d.ts.map +1 -0
- package/build/components/picker/consts.local.js +214 -0
- package/build/components/picker/consts.local.js.map +1 -0
- package/build/components/picker/dot.d.ts +8 -0
- package/build/components/picker/dot.d.ts.map +1 -0
- package/build/components/picker/dot.js +10 -0
- package/build/components/picker/dot.js.map +1 -0
- package/build/components/picker/grid.d.ts +17 -0
- package/build/components/picker/grid.d.ts.map +1 -0
- package/build/components/picker/grid.js +73 -0
- package/build/components/picker/grid.js.map +1 -0
- package/build/components/picker/i18n/be.json +60 -0
- package/build/components/picker/i18n/de.json +60 -0
- package/build/components/picker/i18n/en.json +60 -0
- package/build/components/picker/i18n/es.json +60 -0
- package/build/components/picker/i18n/fr.json +60 -0
- package/build/components/picker/i18n/pl.json +60 -0
- package/build/components/picker/i18n/ru.json +60 -0
- package/build/components/picker/i18n/uk.json +60 -0
- package/build/components/picker/i18n.d.ts +2 -0
- package/build/components/picker/i18n.d.ts.map +1 -0
- package/build/components/picker/i18n.js +18 -0
- package/build/components/picker/i18n.js.map +1 -0
- package/build/components/picker/icon-color-picker.d.ts +14 -0
- package/build/components/picker/icon-color-picker.d.ts.map +1 -0
- package/build/components/picker/icon-color-picker.js +15 -0
- package/build/components/picker/icon-color-picker.js.map +1 -0
- package/build/components/picker/icon-picker.d.ts +8 -0
- package/build/components/picker/icon-picker.d.ts.map +1 -0
- package/build/components/picker/icon-picker.js +8 -0
- package/build/components/picker/icon-picker.js.map +1 -0
- package/build/components/picker/index.d.ts +11 -0
- package/build/components/picker/index.d.ts.map +1 -0
- package/build/components/picker/index.js +10 -0
- package/build/components/picker/index.js.map +1 -0
- package/build/components/picker/panel.d.ts +9 -0
- package/build/components/picker/panel.d.ts.map +1 -0
- package/build/components/picker/panel.js +23 -0
- package/build/components/picker/panel.js.map +1 -0
- package/build/components/picker/root.d.ts +13 -0
- package/build/components/picker/root.d.ts.map +1 -0
- package/build/components/picker/root.js +55 -0
- package/build/components/picker/root.js.map +1 -0
- package/build/components/picker/roving.d.ts +8 -0
- package/build/components/picker/roving.d.ts.map +1 -0
- package/build/components/picker/roving.js +62 -0
- package/build/components/picker/roving.js.map +1 -0
- package/build/components/picker/surface.d.ts +18 -0
- package/build/components/picker/surface.d.ts.map +1 -0
- package/build/components/picker/surface.js +36 -0
- package/build/components/picker/surface.js.map +1 -0
- package/build/components/picker/swatches/custom.d.ts +10 -0
- package/build/components/picker/swatches/custom.d.ts.map +1 -0
- package/build/components/picker/swatches/custom.js +65 -0
- package/build/components/picker/swatches/custom.js.map +1 -0
- package/build/components/picker/swatches.d.ts +16 -0
- package/build/components/picker/swatches.d.ts.map +1 -0
- package/build/components/picker/swatches.js +35 -0
- package/build/components/picker/swatches.js.map +1 -0
- package/build/components/picker/text.d.ts +5 -0
- package/build/components/picker/text.d.ts.map +1 -0
- package/build/components/picker/text.js +29 -0
- package/build/components/picker/text.js.map +1 -0
- package/build/components/picker/tile.d.ts +11 -0
- package/build/components/picker/tile.d.ts.map +1 -0
- package/build/components/picker/tile.js +19 -0
- package/build/components/picker/tile.js.map +1 -0
- package/build/components/picker/translate.d.ts +9 -0
- package/build/components/picker/translate.d.ts.map +1 -0
- package/build/components/picker/translate.js +13 -0
- package/build/components/picker/translate.js.map +1 -0
- package/build/components/picker/trigger.d.ts +12 -0
- package/build/components/picker/trigger.d.ts.map +1 -0
- package/build/components/picker/trigger.js +29 -0
- package/build/components/picker/trigger.js.map +1 -0
- package/build/components/picker/types.d.ts +114 -0
- package/build/components/picker/types.d.ts.map +1 -0
- package/build/components/picker/types.js +2 -0
- package/build/components/picker/types.js.map +1 -0
- package/build/components/picker/types.local.d.ts +143 -0
- package/build/components/picker/types.local.d.ts.map +1 -0
- package/build/components/picker/types.local.js +2 -0
- package/build/components/picker/types.local.js.map +1 -0
- package/build/components/scheme/consts.local.d.ts +8 -0
- package/build/components/scheme/consts.local.d.ts.map +1 -0
- package/build/components/scheme/consts.local.js +13 -0
- package/build/components/scheme/consts.local.js.map +1 -0
- package/build/components/scheme/hook.d.ts +16 -0
- package/build/components/scheme/hook.d.ts.map +1 -0
- package/build/components/scheme/hook.js +52 -0
- package/build/components/scheme/hook.js.map +1 -0
- package/build/components/scheme/index.d.ts +4 -0
- package/build/components/scheme/index.d.ts.map +1 -0
- package/build/components/scheme/index.js +3 -0
- package/build/components/scheme/index.js.map +1 -0
- package/build/components/scheme/toggle.d.ts +14 -0
- package/build/components/scheme/toggle.d.ts.map +1 -0
- package/build/components/scheme/toggle.js +24 -0
- package/build/components/scheme/toggle.js.map +1 -0
- package/build/components/scheme/types.d.ts +21 -0
- package/build/components/scheme/types.d.ts.map +1 -0
- package/build/components/scheme/types.js +2 -0
- package/build/components/scheme/types.js.map +1 -0
- package/build/components/socket/i18n/be.json +9 -0
- package/build/components/socket/i18n/de.json +9 -0
- package/build/components/socket/i18n/en.json +9 -0
- package/build/components/socket/i18n/es.json +9 -0
- package/build/components/socket/i18n/fr.json +9 -0
- package/build/components/socket/i18n/pl.json +9 -0
- package/build/components/socket/i18n/ru.json +9 -0
- package/build/components/socket/i18n/uk.json +9 -0
- package/build/components/socket/i18n.d.ts +2 -0
- package/build/components/socket/i18n.d.ts.map +1 -0
- package/build/components/socket/i18n.js +18 -0
- package/build/components/socket/i18n.js.map +1 -0
- package/build/components/socket/index.d.ts +3 -0
- package/build/components/socket/index.d.ts.map +1 -0
- package/build/components/socket/index.js +3 -0
- package/build/components/socket/index.js.map +1 -0
- package/build/components/socket/reload-dialog.d.ts +22 -0
- package/build/components/socket/reload-dialog.d.ts.map +1 -0
- package/build/components/socket/reload-dialog.js +34 -0
- package/build/components/socket/reload-dialog.js.map +1 -0
- package/build/components/status.js +1 -1
- package/build/components/status.js.map +1 -1
- package/build/components/text.d.ts.map +1 -1
- package/build/components/text.js +2 -13
- package/build/components/text.js.map +1 -1
- package/build/components/toaster.d.ts +16 -0
- package/build/components/toaster.d.ts.map +1 -0
- package/build/components/toaster.js +52 -0
- package/build/components/toaster.js.map +1 -0
- package/build/components/uploader/consts.local.d.ts +4 -0
- package/build/components/uploader/consts.local.d.ts.map +1 -0
- package/build/components/uploader/consts.local.js +6 -0
- package/build/components/uploader/consts.local.js.map +1 -0
- package/build/components/uploader/image.d.ts.map +1 -1
- package/build/components/uploader/image.js +2 -6
- package/build/components/uploader/image.js.map +1 -1
- package/build/consent/component.d.ts +27 -0
- package/build/consent/component.d.ts.map +1 -0
- package/build/consent/component.js +60 -0
- package/build/consent/component.js.map +1 -0
- package/build/consent/consts.d.ts +2 -0
- package/build/consent/consts.d.ts.map +1 -0
- package/build/consent/consts.js +2 -0
- package/build/consent/consts.js.map +1 -0
- package/build/consent/consts.local.d.ts +9 -0
- package/build/consent/consts.local.d.ts.map +1 -0
- package/build/consent/consts.local.js +9 -0
- package/build/consent/consts.local.js.map +1 -0
- package/build/consent/geo.d.ts +17 -0
- package/build/consent/geo.d.ts.map +1 -0
- package/build/consent/geo.js +19 -0
- package/build/consent/geo.js.map +1 -0
- package/build/consent/index.d.ts +11 -0
- package/build/consent/index.d.ts.map +1 -0
- package/build/consent/index.js +9 -0
- package/build/consent/index.js.map +1 -0
- package/build/consent/language.d.ts +12 -0
- package/build/consent/language.d.ts.map +1 -0
- package/build/consent/language.js +11 -0
- package/build/consent/language.js.map +1 -0
- package/build/consent/menu-widget.d.ts +13 -0
- package/build/consent/menu-widget.d.ts.map +1 -0
- package/build/consent/menu-widget.js +20 -0
- package/build/consent/menu-widget.js.map +1 -0
- package/build/consent/presence.d.ts +30 -0
- package/build/consent/presence.d.ts.map +1 -0
- package/build/consent/presence.js +40 -0
- package/build/consent/presence.js.map +1 -0
- package/build/consent/service.d.ts +18 -0
- package/build/consent/service.d.ts.map +1 -0
- package/build/consent/service.js +53 -0
- package/build/consent/service.js.map +1 -0
- package/build/consent/translate.d.ts +14 -0
- package/build/consent/translate.d.ts.map +1 -0
- package/build/consent/translate.js +28 -0
- package/build/consent/translate.js.map +1 -0
- package/build/consent/types.d.ts +39 -0
- package/build/consent/types.d.ts.map +1 -0
- package/build/consent/types.js +2 -0
- package/build/consent/types.js.map +1 -0
- package/build/consent/types.local.d.ts +6 -0
- package/build/consent/types.local.d.ts.map +1 -0
- package/build/consent/types.local.js +2 -0
- package/build/consent/types.local.js.map +1 -0
- package/build/context.d.ts.map +1 -1
- package/build/context.js +10 -0
- package/build/context.js.map +1 -1
- package/build/editor/component.d.ts +4 -0
- package/build/editor/component.d.ts.map +1 -0
- package/build/editor/component.js +103 -0
- package/build/editor/component.js.map +1 -0
- package/build/editor/consts.local.d.ts +6 -0
- package/build/editor/consts.local.d.ts.map +1 -0
- package/build/editor/consts.local.js +58 -0
- package/build/editor/consts.local.js.map +1 -0
- package/build/editor/index.d.ts +3 -0
- package/build/editor/index.d.ts.map +1 -0
- package/build/editor/index.js +2 -0
- package/build/editor/index.js.map +1 -0
- package/build/editor/types.d.ts +24 -0
- package/build/editor/types.d.ts.map +1 -0
- package/build/editor/types.js +2 -0
- package/build/editor/types.js.map +1 -0
- package/build/entrypoints.d.ts +8 -0
- package/build/entrypoints.d.ts.map +1 -0
- package/build/entrypoints.js +4 -0
- package/build/entrypoints.js.map +1 -0
- package/build/exports.d.ts +6 -5
- package/build/exports.d.ts.map +1 -1
- package/build/exports.js +5 -5
- package/build/exports.js.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -1
- package/build/index.js.map +1 -1
- package/build/main.d.ts +1 -4
- package/build/main.d.ts.map +1 -1
- package/build/main.js.map +1 -1
- package/build/modules.d.ts +1 -1
- package/build/modules.d.ts.map +1 -1
- package/build/permission/i18n/be.json +13 -0
- package/build/permission/i18n/de.json +13 -0
- package/build/permission/i18n/en.json +13 -0
- package/build/permission/i18n/es.json +13 -0
- package/build/permission/i18n/fr.json +13 -0
- package/build/permission/i18n/pl.json +13 -0
- package/build/permission/i18n/ru.json +13 -0
- package/build/permission/i18n/uk.json +13 -0
- package/build/permission/i18n.d.ts +2 -0
- package/build/permission/i18n.d.ts.map +1 -0
- package/build/permission/i18n.js +13 -0
- package/build/permission/i18n.js.map +1 -0
- package/build/permission/index.d.ts +6 -0
- package/build/permission/index.d.ts.map +1 -0
- package/build/permission/index.js +27 -0
- package/build/permission/index.js.map +1 -0
- package/build/permission/toast.d.ts +5 -0
- package/build/permission/toast.d.ts.map +1 -0
- package/build/permission/toast.js +8 -0
- package/build/permission/toast.js.map +1 -0
- package/build/permission/types.d.ts +6 -0
- package/build/permission/types.d.ts.map +1 -0
- package/build/permission/types.js +2 -0
- package/build/permission/types.js.map +1 -0
- package/build/picker/icons/consts.d.ts +9 -0
- package/build/picker/icons/consts.d.ts.map +1 -0
- package/build/picker/icons/consts.js +264 -0
- package/build/picker/icons/consts.js.map +1 -0
- package/build/picker/icons/types.d.ts +18 -0
- package/build/picker/icons/types.d.ts.map +1 -0
- package/build/picker/icons/types.js +2 -0
- package/build/picker/icons/types.js.map +1 -0
- package/build/picker/icons.d.ts +4 -0
- package/build/picker/icons.d.ts.map +1 -0
- package/build/picker/icons.js +54 -0
- package/build/picker/icons.js.map +1 -0
- package/build/picker/index.d.ts +11 -0
- package/build/picker/index.d.ts.map +1 -0
- package/build/picker/index.js +10 -0
- package/build/picker/index.js.map +1 -0
- package/build/picker/utils/color/types.d.ts +35 -0
- package/build/picker/utils/color/types.d.ts.map +1 -0
- package/build/picker/utils/color/types.js +2 -0
- package/build/picker/utils/color/types.js.map +1 -0
- package/build/picker/utils/color.d.ts +4 -0
- package/build/picker/utils/color.d.ts.map +1 -0
- package/build/picker/utils/color.js +96 -0
- package/build/picker/utils/color.js.map +1 -0
- package/build/picker/vocabulary/consts.d.ts +26 -0
- package/build/picker/vocabulary/consts.d.ts.map +1 -0
- package/build/picker/vocabulary/consts.js +336 -0
- package/build/picker/vocabulary/consts.js.map +1 -0
- package/build/picker/vocabulary/types.d.ts +67 -0
- package/build/picker/vocabulary/types.d.ts.map +1 -0
- package/build/picker/vocabulary/types.js +2 -0
- package/build/picker/vocabulary/types.js.map +1 -0
- package/build/picker/vocabulary.d.ts +11 -0
- package/build/picker/vocabulary.d.ts.map +1 -0
- package/build/picker/vocabulary.js +83 -0
- package/build/picker/vocabulary.js.map +1 -0
- package/build/scheme/consts.d.ts +8 -0
- package/build/scheme/consts.d.ts.map +1 -0
- package/build/scheme/consts.js +8 -0
- package/build/scheme/consts.js.map +1 -0
- package/build/scheme/index.d.ts +4 -0
- package/build/scheme/index.d.ts.map +1 -0
- package/build/scheme/index.js +3 -0
- package/build/scheme/index.js.map +1 -0
- package/build/scheme/scheme.d.ts +16 -0
- package/build/scheme/scheme.d.ts.map +1 -0
- package/build/scheme/scheme.js +58 -0
- package/build/scheme/scheme.js.map +1 -0
- package/build/scheme/types.d.ts +30 -0
- package/build/scheme/types.d.ts.map +1 -0
- package/build/scheme/types.js +2 -0
- package/build/scheme/types.js.map +1 -0
- package/build/types.d.ts +18 -2
- package/build/types.d.ts.map +1 -1
- package/package.json +107 -52
- package/src/@/components/ui/alert-dialog.tsx +156 -0
- package/src/@/components/ui/alert.tsx +1 -1
- package/src/@/components/ui/button.tsx +1 -1
- package/src/@/components/ui/card.tsx +1 -1
- package/src/@/components/ui/input.tsx +1 -1
- package/src/@/components/ui/label.tsx +1 -1
- package/src/@/components/ui/navigation-menu.tsx +1 -1
- package/src/@/components/ui/popover.tsx +47 -0
- package/src/@/components/ui/progress.tsx +1 -1
- package/src/@/components/ui/separator.tsx +1 -1
- package/src/@/components/ui/sheet.tsx +142 -0
- package/src/auth/context.ts +0 -2
- package/src/auth/entrypoints.ts +5 -0
- package/src/auth/exports.ts +4 -4
- package/src/auth/plugins/basic-ed25519.tsx +4 -4
- package/src/auth/plugins/re-captcha.tsx +3 -3
- package/src/auth/plugins/tunnel-consumer.tsx +1 -1
- package/src/components/block.tsx +2 -2
- package/src/components/consts.local.ts +29 -0
- package/src/components/footer/component.tsx +58 -16
- package/src/components/footer/credit.tsx +61 -0
- package/src/components/footer/index.ts +1 -0
- package/src/components/footer/types.ts +22 -1
- package/src/components/form/button/component.tsx +7 -4
- package/src/components/form/component.tsx +2 -2
- package/src/components/form/text/component.tsx +2 -2
- package/src/components/helper.ts +1 -13
- package/src/components/index.ts +4 -0
- package/src/components/link.tsx +3 -3
- package/src/components/login/append.ts +34 -0
- package/src/components/login/consts.local.ts +10 -0
- package/src/components/login/consts.ts +2 -0
- package/src/components/login/credit.tsx +33 -0
- package/src/components/login/i18n/be.json +10 -0
- package/src/components/login/i18n/de.json +10 -0
- package/src/components/login/i18n/en.json +10 -0
- package/src/components/login/i18n/es.json +10 -0
- package/src/components/login/i18n/fr.json +10 -0
- package/src/components/login/i18n/pl.json +10 -0
- package/src/components/login/i18n/ru.json +10 -0
- package/src/components/login/i18n/uk.json +10 -0
- package/src/components/login/i18n.ts +29 -0
- package/src/components/login/icons.tsx +39 -0
- package/src/components/login/index.ts +11 -0
- package/src/components/login/notify.ts +48 -0
- package/src/components/login/provider.tsx +57 -0
- package/src/components/login/screen.tsx +178 -0
- package/src/components/login/terms.tsx +75 -0
- package/src/components/login/types.ts +30 -0
- package/src/components/nav/consts.local.ts +64 -0
- package/src/components/nav/index.ts +1 -0
- package/src/components/nav/layout.tsx +184 -26
- package/src/components/nav/mobile.tsx +165 -0
- package/src/components/nav/side.tsx +43 -27
- package/src/components/nav/top.tsx +44 -22
- package/src/components/nav/types.ts +65 -2
- package/src/components/nav/viewport.ts +16 -0
- package/src/components/panel-app/component.tsx +9 -1
- package/src/components/picker/color-picker.tsx +15 -0
- package/src/components/picker/consts.local.ts +267 -0
- package/src/components/picker/dot.tsx +21 -0
- package/src/components/picker/grid.tsx +138 -0
- package/src/components/picker/i18n/be.json +60 -0
- package/src/components/picker/i18n/de.json +60 -0
- package/src/components/picker/i18n/en.json +60 -0
- package/src/components/picker/i18n/es.json +60 -0
- package/src/components/picker/i18n/fr.json +60 -0
- package/src/components/picker/i18n/pl.json +60 -0
- package/src/components/picker/i18n/ru.json +60 -0
- package/src/components/picker/i18n/uk.json +60 -0
- package/src/components/picker/i18n.ts +19 -0
- package/src/components/picker/icon-color-picker.tsx +25 -0
- package/src/components/picker/icon-picker.tsx +13 -0
- package/src/components/picker/index.ts +11 -0
- package/src/components/picker/panel.tsx +61 -0
- package/src/components/picker/root.tsx +81 -0
- package/src/components/picker/roving.ts +70 -0
- package/src/components/picker/surface.tsx +62 -0
- package/src/components/picker/swatches/custom.tsx +110 -0
- package/src/components/picker/swatches.tsx +67 -0
- package/src/components/picker/text.ts +46 -0
- package/src/components/picker/tile.tsx +35 -0
- package/src/components/picker/translate.ts +15 -0
- package/src/components/picker/trigger.tsx +54 -0
- package/src/components/picker/types.local.ts +154 -0
- package/src/components/picker/types.ts +125 -0
- package/src/components/scheme/consts.local.ts +13 -0
- package/src/components/scheme/hook.ts +62 -0
- package/src/components/scheme/index.ts +4 -0
- package/src/components/scheme/toggle.tsx +32 -0
- package/src/components/scheme/types.ts +23 -0
- package/src/components/socket/i18n/be.json +9 -0
- package/src/components/socket/i18n/de.json +9 -0
- package/src/components/socket/i18n/en.json +9 -0
- package/src/components/socket/i18n/es.json +9 -0
- package/src/components/socket/i18n/fr.json +9 -0
- package/src/components/socket/i18n/pl.json +9 -0
- package/src/components/socket/i18n/ru.json +9 -0
- package/src/components/socket/i18n/uk.json +9 -0
- package/src/components/socket/i18n.ts +19 -0
- package/src/components/socket/index.ts +2 -0
- package/src/components/socket/reload-dialog.tsx +61 -0
- package/src/components/status.tsx +1 -1
- package/src/components/text.tsx +2 -14
- package/src/components/toaster.tsx +65 -0
- package/src/components/uploader/consts.local.ts +7 -0
- package/src/components/uploader/image.tsx +2 -6
- package/src/consent/component.tsx +84 -0
- package/src/consent/consts.local.ts +10 -0
- package/src/consent/consts.ts +1 -0
- package/src/consent/geo.ts +26 -0
- package/src/consent/index.ts +24 -0
- package/src/consent/language.ts +12 -0
- package/src/consent/menu-widget.tsx +22 -0
- package/src/consent/presence.ts +45 -0
- package/src/consent/service.ts +75 -0
- package/src/consent/translate.ts +31 -0
- package/src/consent/types.local.ts +6 -0
- package/src/consent/types.ts +43 -0
- package/src/context.ts +12 -0
- package/src/editor/component.tsx +172 -0
- package/src/editor/consts.local.ts +62 -0
- package/src/editor/index.ts +2 -0
- package/src/editor/types.ts +24 -0
- package/src/entrypoints.ts +5 -0
- package/src/exports.ts +6 -5
- package/src/index.ts +1 -1
- package/src/main.tsx +2 -6
- package/src/permission/i18n/be.json +13 -0
- package/src/permission/i18n/de.json +13 -0
- package/src/permission/i18n/en.json +13 -0
- package/src/permission/i18n/es.json +13 -0
- package/src/permission/i18n/fr.json +13 -0
- package/src/permission/i18n/pl.json +13 -0
- package/src/permission/i18n/ru.json +13 -0
- package/src/permission/i18n/uk.json +13 -0
- package/src/permission/i18n.ts +13 -0
- package/src/permission/index.ts +27 -0
- package/src/permission/toast.tsx +20 -0
- package/src/permission/types.ts +5 -0
- package/src/picker/icons/consts.ts +309 -0
- package/src/picker/icons/types.ts +18 -0
- package/src/picker/icons.ts +70 -0
- package/src/picker/index.ts +11 -0
- package/src/picker/utils/color/types.ts +37 -0
- package/src/picker/utils/color.ts +119 -0
- package/src/picker/vocabulary/consts.ts +347 -0
- package/src/picker/vocabulary/types.ts +72 -0
- package/src/picker/vocabulary.ts +111 -0
- package/src/scheme/consts.ts +8 -0
- package/src/scheme/index.ts +3 -0
- package/src/scheme/scheme.ts +66 -0
- package/src/scheme/types.ts +30 -0
- package/src/types.ts +19 -2
- package/tests/consent-language.spec.ts +31 -0
- package/tests/consent.spec.ts +112 -0
- package/tests/context.ts +4 -0
- package/tests/editor.spec.ts +58 -0
- package/tests/harness/editor.tsx +32 -0
- package/tests/harness/index.html +1 -0
- package/tests/harness/lazy-screen.tsx +9 -0
- package/tests/harness/mount.tsx +370 -29
- package/tests/harness/picker.tsx +110 -0
- package/tests/lazy.spec.ts +104 -0
- package/tests/login-provider.spec.ts +114 -0
- package/tests/login.spec.ts +447 -0
- package/tests/nav.spec.ts +449 -3
- package/tests/package-boundary.spec.ts +19 -0
- package/tests/picker-shots.spec.ts +174 -0
- package/tests/picker-vocabulary.spec.ts +217 -0
- package/tests/picker.spec.ts +333 -0
- package/tests/scheme.spec.ts +149 -0
- package/tests/smoke.spec.ts +2 -2
- package/tests/socket-dialog.spec.ts +154 -0
- package/tests/toaster.spec.ts +59 -0
- package/zz-tw.d.mts +2 -0
- package/zz-tw.d.mts.map +1 -0
- package/build/.gitkeep +0 -0
- package/src/auth/modules.ts +0 -5
- package/src/modules.ts +0 -5
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The colour-scheme choice, with no React and no framework code: a build script running in Node
|
|
3
|
+
* imports this module to inline the head bootstrap, and it must not drag a component tree in.
|
|
4
|
+
*
|
|
5
|
+
* The contract is TWO classes on the document element. `dark` means the visitor chose dark,
|
|
6
|
+
* `light` that they chose light, and neither that they chose nothing — the page follows the
|
|
7
|
+
* operating system. `light` has to exist as a class of its own: without it, a visitor who picks
|
|
8
|
+
* light on a system that prefers dark has no way to say so to a stylesheet that paints dark under
|
|
9
|
+
* `prefers-color-scheme: dark`.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { COLOR_SCHEME_EVENT, COLOR_SCHEME_KEY } from './consts.js'
|
|
13
|
+
import type { ColorSchemeChoice, ColorSchemeHelper } from './types.js'
|
|
14
|
+
|
|
15
|
+
export const createColorSchemeHelper = (): ColorSchemeHelper => {
|
|
16
|
+
const isChoice = (value: unknown): value is ColorSchemeChoice => value === 'light' || value === 'dark'
|
|
17
|
+
|
|
18
|
+
const readColorScheme = (): ColorSchemeChoice | null => {
|
|
19
|
+
try {
|
|
20
|
+
const value = globalThis.localStorage?.getItem(COLOR_SCHEME_KEY)
|
|
21
|
+
|
|
22
|
+
return isChoice(value) ? value : null
|
|
23
|
+
} catch {
|
|
24
|
+
return null
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const setColorSchemeClass = (choice: ColorSchemeChoice | null): void => {
|
|
29
|
+
if (typeof document === 'undefined') {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
const root = document.documentElement
|
|
33
|
+
root.classList.remove('light', 'dark')
|
|
34
|
+
if (choice != null) {
|
|
35
|
+
root.classList.add(choice)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const applyColorScheme = (choice: ColorSchemeChoice | null): void => {
|
|
40
|
+
setColorSchemeClass(choice)
|
|
41
|
+
try {
|
|
42
|
+
if (choice == null) {
|
|
43
|
+
globalThis.localStorage?.removeItem(COLOR_SCHEME_KEY)
|
|
44
|
+
} else {
|
|
45
|
+
globalThis.localStorage?.setItem(COLOR_SCHEME_KEY, choice)
|
|
46
|
+
}
|
|
47
|
+
} catch {
|
|
48
|
+
// Storage is unavailable; the class above is still correct for this page view.
|
|
49
|
+
}
|
|
50
|
+
if (typeof window !== 'undefined') {
|
|
51
|
+
window.dispatchEvent(new Event(COLOR_SCHEME_EVENT))
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const colorSchemeBootstrapScript = (): string =>
|
|
56
|
+
`(function(){try{var c=localStorage.getItem(${JSON.stringify(COLOR_SCHEME_KEY)});`
|
|
57
|
+
+ `if(c==='light'||c==='dark'){var r=document.documentElement;`
|
|
58
|
+
+ `r.classList.remove('light','dark');r.classList.add(c);}}catch(e){}})();`
|
|
59
|
+
|
|
60
|
+
return { readColorScheme, setColorSchemeClass, applyColorScheme, colorSchemeBootstrapScript }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export const colorSchemeHelper = createColorSchemeHelper()
|
|
64
|
+
|
|
65
|
+
/** @deprecated compat:factory-refactor — use `colorSchemeHelper.colorSchemeBootstrapScript()` */
|
|
66
|
+
export const colorSchemeBootstrapScript = (): string => colorSchemeHelper.colorSchemeBootstrapScript()
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** An explicit choice. Absent (`null`) means "follow the operating system". */
|
|
2
|
+
export type ColorSchemeChoice = 'light' | 'dark'
|
|
3
|
+
|
|
4
|
+
/** The visitor's colour-scheme choice: read, applied to the document element, stored, and bootstrapped in the head. */
|
|
5
|
+
export interface ColorSchemeHelper {
|
|
6
|
+
/**
|
|
7
|
+
* The stored choice, or `null` when there is none, it is not a choice, or storage is unreachable
|
|
8
|
+
* (a private window, blocked site data, no `window` at all).
|
|
9
|
+
*/
|
|
10
|
+
readColorScheme: () => ColorSchemeChoice | null
|
|
11
|
+
/** Put exactly the class for `choice` on the document element — none for `null`. Stores nothing. */
|
|
12
|
+
setColorSchemeClass: (choice: ColorSchemeChoice | null) => void
|
|
13
|
+
/**
|
|
14
|
+
* Apply a choice now and remember it: the class on the document element, the stored key (cleared
|
|
15
|
+
* for `null`), and one `COLOR_SCHEME_EVENT` for everything in this document that renders from it.
|
|
16
|
+
* Storage failures are swallowed — the page still switches, it just forgets on the next load.
|
|
17
|
+
*/
|
|
18
|
+
applyColorScheme: (choice: ColorSchemeChoice | null) => void
|
|
19
|
+
/**
|
|
20
|
+
* The inline script for the document head, placed before any stylesheet paints.
|
|
21
|
+
*
|
|
22
|
+
* It reads the stored choice and puts its class on the document element before the first paint —
|
|
23
|
+
* the only moment it can: a component that did the same after mounting shows every visitor who
|
|
24
|
+
* chose dark one frame of the light page first. Self-contained on purpose (it inlines the key
|
|
25
|
+
* rather than importing it) and wrapped in `try`, because storage can throw and a head script
|
|
26
|
+
* that throws stops nothing but itself. No stored choice adds no class, and the stylesheet's own
|
|
27
|
+
* `prefers-color-scheme` rule decides.
|
|
28
|
+
*/
|
|
29
|
+
colorSchemeBootstrapScript: () => string
|
|
30
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -1,11 +1,28 @@
|
|
|
1
1
|
|
|
2
2
|
import type { WithFlowConfig } from '@owlmeans/flow'
|
|
3
|
-
import type { AppConfig as Config, AppContext as Context } from '@owlmeans/web-client'
|
|
3
|
+
import type { AppConfig as Config, AppContext as Context, RenderOptions } from '@owlmeans/web-client'
|
|
4
4
|
import type { FlowService } from '@owlmeans/web-flow'
|
|
5
|
+
import type { SocketClientSettings, SocketStatusServiceAppend } from '@owlmeans/client-socket'
|
|
6
|
+
import type { PanelCookieConsentConfig } from './consent/types.js'
|
|
5
7
|
|
|
6
8
|
export interface AppConfig extends Config, WithFlowConfig {
|
|
9
|
+
socket?: SocketClientSettings & {
|
|
10
|
+
/**
|
|
11
|
+
* Show `SocketReloadDialog` — a global, blocking "try again / reload the page" prompt — once every
|
|
12
|
+
* socket in the app has given up reconnecting (`useSocketStatus() === 'lost'`). Off by
|
|
13
|
+
* default: an app opts in once it has decided that outcome deserves a full-page prompt
|
|
14
|
+
* rather than the caller's own fallback UI.
|
|
15
|
+
*/
|
|
16
|
+
reloadDialog?: boolean
|
|
17
|
+
}
|
|
18
|
+
/** How the cookie consent asks — the bar or the window, and where (`geo`). See `./consent`. */
|
|
19
|
+
cookieConsent?: PanelCookieConsentConfig
|
|
7
20
|
}
|
|
8
21
|
|
|
9
|
-
export interface AppContext<C extends AppConfig = AppConfig> extends Context<C
|
|
22
|
+
export interface AppContext<C extends AppConfig = AppConfig> extends Context<C>, SocketStatusServiceAppend {
|
|
10
23
|
flow: () => FlowService
|
|
11
24
|
}
|
|
25
|
+
|
|
26
|
+
export interface WebRenderOptions extends RenderOptions {
|
|
27
|
+
rootClassName?: string
|
|
28
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test } from 'bun:test'
|
|
2
|
+
import { i18nInstanceHelper } from '@owlmeans/client-i18n'
|
|
3
|
+
import { installConsentLanguage } from '../src/consent/language.js'
|
|
4
|
+
|
|
5
|
+
describe('installConsentLanguage — a deprecated no-op', () => {
|
|
6
|
+
const store = new Map<string, string>()
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
store.clear()
|
|
10
|
+
;(globalThis as any).localStorage = {
|
|
11
|
+
getItem: (k: string) => store.get(k) ?? null,
|
|
12
|
+
setItem: (k: string, v: string) => { store.set(k, v) },
|
|
13
|
+
removeItem: (k: string) => { store.delete(k) },
|
|
14
|
+
}
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
test('returns a cleanup that can be called, more than once', () => {
|
|
18
|
+
const off = installConsentLanguage()
|
|
19
|
+
|
|
20
|
+
expect(typeof off).toBe('function')
|
|
21
|
+
expect(off()).toBeUndefined()
|
|
22
|
+
expect(off()).toBeUndefined()
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test('changes nothing about the language: a choice is stored either way, whatever the decision', async () => {
|
|
26
|
+
installConsentLanguage()
|
|
27
|
+
await i18nInstanceHelper.setLanguage('pl')
|
|
28
|
+
|
|
29
|
+
expect(store.get('owlmeans-lng')).toBe('pl')
|
|
30
|
+
})
|
|
31
|
+
})
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { afterAll, describe, expect, test } from 'bun:test'
|
|
2
|
+
import { mountComponent, browserHelper } from '@owlmeans/test-ui'
|
|
3
|
+
import { HARNESS_URL } from './context.js'
|
|
4
|
+
|
|
5
|
+
const TIMEOUT = 30_000
|
|
6
|
+
|
|
7
|
+
afterAll(async () => {
|
|
8
|
+
await browserHelper.closeBrowser()
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
const open = async (path: string) => mountComponent({ url: `${HARNESS_URL.replace(/\/$/, '')}${path}` })
|
|
12
|
+
|
|
13
|
+
describe('@owlmeans/web-panel/consent — the dialog and the menu widget', () => {
|
|
14
|
+
test('the dialog works on a context without the presence service and keeps its floating button', async () => {
|
|
15
|
+
// `?consent=bare` never appends `appendConsentWidgetService` — an application using the
|
|
16
|
+
// dialog on its own. The footer still renders the "Cookie settings" control, whose presence
|
|
17
|
+
// hook has nothing to claim. Neither may throw: a throw in render blanks the application.
|
|
18
|
+
const { page, close } = await open('/prefs?consent=bare&footer=node')
|
|
19
|
+
try {
|
|
20
|
+
await page.waitForSelector('#prefs')
|
|
21
|
+
await page.locator('[data-consent-dialog]').waitFor()
|
|
22
|
+
await page.locator('[data-consent-accept-all]').click()
|
|
23
|
+
await page.locator('[data-consent-reopen]').waitFor()
|
|
24
|
+
expect(await page.locator('[data-consent-dialog]').count()).toBe(0)
|
|
25
|
+
} finally {
|
|
26
|
+
await close()
|
|
27
|
+
}
|
|
28
|
+
}, TIMEOUT)
|
|
29
|
+
|
|
30
|
+
test('a mounted footer control hides the floating button and reopens the dialog', async () => {
|
|
31
|
+
// `?consent=menu` appends the presence service; the footer's control declares itself with
|
|
32
|
+
// `useConsentMenuPresence()` for as long as it is mounted, so the floating button stays away.
|
|
33
|
+
const { page, close } = await open('/prefs?consent=menu&footer=node')
|
|
34
|
+
try {
|
|
35
|
+
await page.waitForSelector('#prefs')
|
|
36
|
+
await page.locator('[data-consent-dialog]').waitFor()
|
|
37
|
+
await page.locator('[data-consent-accept-all]').click()
|
|
38
|
+
await page.locator('[data-consent-dialog]').waitFor({ state: 'detached' })
|
|
39
|
+
expect(await page.locator('[data-consent-reopen]').count()).toBe(0)
|
|
40
|
+
|
|
41
|
+
await page.locator('footer').getByRole('button', { name: 'Cookie settings' }).click()
|
|
42
|
+
await page.locator('[data-consent-dialog]').waitFor()
|
|
43
|
+
} finally {
|
|
44
|
+
await close()
|
|
45
|
+
}
|
|
46
|
+
}, TIMEOUT)
|
|
47
|
+
|
|
48
|
+
test('linker passes through to the underlying dialog unchanged', async () => {
|
|
49
|
+
// `?domains=1` hands `PanelCookieConsent` a `linker` — nothing here re-derives it, so seeing
|
|
50
|
+
// the domain line pins that `{...props}` still carries it all the way to `CookieConsent`.
|
|
51
|
+
const { page, close } = await open('/prefs?consent=bare&footer=node&domains=1')
|
|
52
|
+
try {
|
|
53
|
+
await page.waitForSelector('#prefs')
|
|
54
|
+
await page.locator('[data-consent-dialog]').waitFor()
|
|
55
|
+
const domains = page.locator('[data-consent-domains]')
|
|
56
|
+
await domains.waitFor()
|
|
57
|
+
expect(await domains.textContent()).toContain('harness-partner.test')
|
|
58
|
+
} finally {
|
|
59
|
+
await close()
|
|
60
|
+
}
|
|
61
|
+
}, TIMEOUT)
|
|
62
|
+
|
|
63
|
+
test('a first-time visitor meets the bar by default', async () => {
|
|
64
|
+
const { page, close } = await open('/prefs?consent=bare')
|
|
65
|
+
try {
|
|
66
|
+
await page.locator('[data-consent-bar]').waitFor()
|
|
67
|
+
expect(await page.locator('[data-consent-dialog]').getAttribute('data-consent-mode')).toBe('bar')
|
|
68
|
+
} finally {
|
|
69
|
+
await close()
|
|
70
|
+
}
|
|
71
|
+
}, TIMEOUT)
|
|
72
|
+
|
|
73
|
+
test('cfg.cookieConsent.mode picks the window, and a mode prop wins over it', async () => {
|
|
74
|
+
const configured = await open('/prefs?consent=bare&consentCfg=window')
|
|
75
|
+
try {
|
|
76
|
+
await configured.page.locator('[data-consent-dialog][data-consent-mode="window"]').waitFor()
|
|
77
|
+
} finally {
|
|
78
|
+
await configured.close()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const overridden = await open('/prefs?consent=bare&consentCfg=window&modeProp=bar')
|
|
82
|
+
try {
|
|
83
|
+
await overridden.page.locator('[data-consent-bar]').waitFor()
|
|
84
|
+
} finally {
|
|
85
|
+
await overridden.close()
|
|
86
|
+
}
|
|
87
|
+
}, TIMEOUT)
|
|
88
|
+
|
|
89
|
+
test('a locator appended to the context turns the geo gate on by itself', async () => {
|
|
90
|
+
const outside = await open('/prefs?consent=bare&consentGeo=US')
|
|
91
|
+
try {
|
|
92
|
+
await outside.page.waitForFunction(() => document.documentElement.getAttribute('data-consent') === 'decided')
|
|
93
|
+
expect(await outside.page.locator('[data-consent-dialog]').count()).toBe(0)
|
|
94
|
+
} finally {
|
|
95
|
+
await outside.close()
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const inside = await open('/prefs?consent=bare&consentGeo=DE')
|
|
99
|
+
try {
|
|
100
|
+
await inside.page.locator('[data-consent-bar]').waitFor()
|
|
101
|
+
} finally {
|
|
102
|
+
await inside.close()
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const unknown = await open('/prefs?consent=bare&consentGeo=fail')
|
|
106
|
+
try {
|
|
107
|
+
await unknown.page.locator('[data-consent-bar]').waitFor()
|
|
108
|
+
} finally {
|
|
109
|
+
await unknown.close()
|
|
110
|
+
}
|
|
111
|
+
}, TIMEOUT)
|
|
112
|
+
})
|
package/tests/context.ts
CHANGED
|
@@ -25,6 +25,10 @@ export const getHarnessUrl = async (): Promise<string> => {
|
|
|
25
25
|
alias: { '@': resolve(here, '../src/@') },
|
|
26
26
|
dedupe: ['react', 'react-dom'],
|
|
27
27
|
},
|
|
28
|
+
// Pre-bundled at server start rather than discovered while the first request is being
|
|
29
|
+
// served: a dependency found mid-transform re-optimizes and reloads the page underneath
|
|
30
|
+
// the navigation, which the first `goto` of a cold run pays for as a timeout.
|
|
31
|
+
optimizeDeps: { include: ['sonner', 'react-colorful', '@radix-ui/react-popover'] },
|
|
28
32
|
server: { port: 0 },
|
|
29
33
|
logLevel: 'warn'
|
|
30
34
|
})
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { afterAll, describe, expect, test } from 'bun:test'
|
|
2
|
+
import { browserHelper, mountComponent } from '@owlmeans/test-ui'
|
|
3
|
+
import { HARNESS_URL } from './context.js'
|
|
4
|
+
|
|
5
|
+
afterAll(async () => {
|
|
6
|
+
await browserHelper.closeBrowser()
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
describe('web-panel JSON editor', () => {
|
|
10
|
+
test('highlights JSON, formats without changing values, and preserves undo', async () => {
|
|
11
|
+
const { page, close } = await mountComponent({ url: `${HARNESS_URL}?editor=1` })
|
|
12
|
+
try {
|
|
13
|
+
await page.getByTestId('json-input').waitFor()
|
|
14
|
+
const original = await page.getByTestId('draft').textContent()
|
|
15
|
+
expect(await page.locator('.cm-line span').count()).toBeGreaterThan(2)
|
|
16
|
+
await page.getByRole('button', { name: 'Format', exact: true }).click()
|
|
17
|
+
await page.waitForFunction(() => document.querySelector('[data-testid=draft]')?.textContent?.includes('\n'))
|
|
18
|
+
expect(JSON.parse((await page.getByTestId('draft').textContent())!)).toEqual(JSON.parse(original!))
|
|
19
|
+
await page.getByTestId('json-input').fill('{"next":3}')
|
|
20
|
+
await page.getByTestId('json-input').press('ControlOrMeta+z')
|
|
21
|
+
expect(await page.getByTestId('draft').textContent()).not.toBe('{"next":3}')
|
|
22
|
+
} finally {
|
|
23
|
+
await close()
|
|
24
|
+
}
|
|
25
|
+
}, 60_000)
|
|
26
|
+
|
|
27
|
+
test('retains invalid drafts and prevents saving until JSON is valid', async () => {
|
|
28
|
+
const { page, close } = await mountComponent({ url: `${HARNESS_URL}?editor=1` })
|
|
29
|
+
try {
|
|
30
|
+
await page.getByTestId('json-input').fill('{"broken":')
|
|
31
|
+
await page.waitForSelector('[data-json-editor][data-valid=false]')
|
|
32
|
+
expect(await page.getByTestId('draft').textContent()).toBe('{"broken":')
|
|
33
|
+
expect(await page.getByRole('button', { name: 'Save document' }).isDisabled()).toBe(true)
|
|
34
|
+
expect(await page.getByRole('button', { name: 'Format', exact: true }).isDisabled()).toBe(true)
|
|
35
|
+
await page.getByTestId('json-input').fill('{"fixed":true}')
|
|
36
|
+
await page.waitForSelector('[data-json-editor][data-valid=true]')
|
|
37
|
+
await page.getByRole('button', { name: 'Save document' }).click()
|
|
38
|
+
expect(await page.getByTestId('saved').textContent()).toBe('{"fixed":true}')
|
|
39
|
+
} finally {
|
|
40
|
+
await close()
|
|
41
|
+
}
|
|
42
|
+
}, 60_000)
|
|
43
|
+
|
|
44
|
+
test('accepts external documents and enforces read only mode', async () => {
|
|
45
|
+
const { page, close } = await mountComponent({ url: `${HARNESS_URL}?editor=1` })
|
|
46
|
+
try {
|
|
47
|
+
await page.getByTestId('json-input').waitFor()
|
|
48
|
+
await page.getByRole('button', { name: 'Load another document' }).click()
|
|
49
|
+
await page.waitForFunction(() => document.querySelector('.cm-content')?.textContent === '{"loaded":true}')
|
|
50
|
+
await page.getByRole('button', { name: 'Toggle read only' }).click()
|
|
51
|
+
expect(await page.getByTestId('json-input').getAttribute('contenteditable')).toBe('false')
|
|
52
|
+
expect(await page.getByRole('button', { name: 'Format', exact: true }).count()).toBe(0)
|
|
53
|
+
expect(await page.getByRole('button', { name: 'Copy', exact: true }).isEnabled()).toBe(true)
|
|
54
|
+
} finally {
|
|
55
|
+
await close()
|
|
56
|
+
}
|
|
57
|
+
}, 60_000)
|
|
58
|
+
})
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { useState } from 'react'
|
|
2
|
+
import { JsonEditor } from '../../src/editor/index.js'
|
|
3
|
+
|
|
4
|
+
export const EditorHarness = () => {
|
|
5
|
+
const [value, setValue] = useState('{"title":"Sample","count":2,"enabled":true,"empty":null}')
|
|
6
|
+
const [valid, setValid] = useState(true)
|
|
7
|
+
const [readOnly, setReadOnly] = useState(false)
|
|
8
|
+
const [saved, setSaved] = useState('')
|
|
9
|
+
return (
|
|
10
|
+
<div className="bg-background p-6 text-foreground">
|
|
11
|
+
<JsonEditor
|
|
12
|
+
value={value}
|
|
13
|
+
onChange={setValue}
|
|
14
|
+
onValidityChange={setValid}
|
|
15
|
+
readOnly={readOnly}
|
|
16
|
+
testId="json-input"
|
|
17
|
+
ariaLabel="Document JSON"
|
|
18
|
+
/>
|
|
19
|
+
<button type="button" disabled={!valid || readOnly} onClick={() => setSaved(value)}>
|
|
20
|
+
Save document
|
|
21
|
+
</button>
|
|
22
|
+
<button type="button" onClick={() => setValue('{"loaded":true}')}>
|
|
23
|
+
Load another document
|
|
24
|
+
</button>
|
|
25
|
+
<button type="button" onClick={() => setReadOnly((current) => !current)}>
|
|
26
|
+
Toggle read only
|
|
27
|
+
</button>
|
|
28
|
+
<output data-testid="draft">{value}</output>
|
|
29
|
+
<output data-testid="saved">{saved}</output>
|
|
30
|
+
</div>
|
|
31
|
+
)
|
|
32
|
+
}
|
package/tests/harness/index.html
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FC } from 'react'
|
|
2
|
+
import { useEntrypoint } from '@owlmeans/client'
|
|
3
|
+
|
|
4
|
+
/** The screen `mount.tsx` loads lazily — a separate module, so it is a separate request. */
|
|
5
|
+
export const LazyScreen: FC = () => {
|
|
6
|
+
const { alias } = useEntrypoint()
|
|
7
|
+
|
|
8
|
+
return <div id="lazy-screen" data-alias={alias}>lazy-screen</div>
|
|
9
|
+
}
|