@greypan/web-ui 1.4.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/README.CN.md +675 -233
- package/README.md +684 -238
- package/dist/_virtual/{_@oxc-project_runtime@0.138.0 → _@oxc-project_runtime@0.140.0}/helpers/esm/decorate.js +1 -1
- package/dist/assets/glass.js +6 -0
- package/dist/assets/glass.js.map +1 -0
- package/dist/assets/menu-portal.js +6 -0
- package/dist/assets/menu-portal.js.map +1 -0
- package/dist/assets/overlay-motion.js +6 -0
- package/dist/assets/overlay-motion.js.map +1 -0
- package/dist/assets/toast-containers.js +6 -0
- package/dist/assets/toast-containers.js.map +1 -0
- package/dist/components/avatar/index.d.ts +30 -0
- package/dist/components/avatar/index.js +112 -0
- package/dist/components/avatar/index.js.map +1 -0
- package/dist/components/avatar/style.js +6 -0
- package/dist/components/avatar/style.js.map +1 -0
- package/dist/components/back-top/index.d.ts +8 -7
- package/dist/components/back-top/index.js +37 -32
- package/dist/components/back-top/index.js.map +1 -1
- package/dist/components/back-top/style.js +1 -1
- package/dist/components/back-top/style.js.map +1 -1
- package/dist/components/badge/index.d.ts +27 -0
- package/dist/components/badge/index.js +121 -0
- package/dist/components/badge/index.js.map +1 -0
- package/dist/components/badge/style.js +6 -0
- package/dist/components/badge/style.js.map +1 -0
- package/dist/components/button/index.d.ts +16 -3
- package/dist/components/button/index.js +56 -17
- package/dist/components/button/index.js.map +1 -1
- package/dist/components/button/style.js +1 -1
- package/dist/components/button/style.js.map +1 -1
- package/dist/components/button-group/index.d.ts +16 -0
- package/dist/components/button-group/index.js +49 -0
- package/dist/components/button-group/index.js.map +1 -0
- package/dist/components/button-group/style.js +6 -0
- package/dist/components/button-group/style.js.map +1 -0
- package/dist/components/checkbox/index.d.ts +39 -0
- package/dist/components/checkbox/index.js +111 -0
- package/dist/components/checkbox/index.js.map +1 -0
- package/dist/components/checkbox/style.js +6 -0
- package/dist/components/checkbox/style.js.map +1 -0
- package/dist/components/checkbox-group/index.d.ts +35 -0
- package/dist/components/checkbox-group/index.js +99 -0
- package/dist/components/checkbox-group/index.js.map +1 -0
- package/dist/components/checkbox-group/style.js +6 -0
- package/dist/components/checkbox-group/style.js.map +1 -0
- package/dist/components/context-menu/index.d.ts +84 -0
- package/dist/components/context-menu/index.js +294 -0
- package/dist/components/context-menu/index.js.map +1 -0
- package/dist/components/context-menu/style.js +6 -0
- package/dist/components/context-menu/style.js.map +1 -0
- package/dist/components/dialog/index.d.ts +41 -0
- package/dist/components/dialog/index.js +118 -0
- package/dist/components/dialog/index.js.map +1 -0
- package/dist/components/dialog/style.js +6 -0
- package/dist/components/dialog/style.js.map +1 -0
- package/dist/components/drawer/index.d.ts +57 -0
- package/dist/components/drawer/index.js +172 -0
- package/dist/components/drawer/index.js.map +1 -0
- package/dist/components/drawer/style.js +6 -0
- package/dist/components/drawer/style.js.map +1 -0
- package/dist/components/dropdown-divider/index.d.ts +11 -0
- package/dist/components/dropdown-divider/index.js +18 -0
- package/dist/components/dropdown-divider/index.js.map +1 -0
- package/dist/components/dropdown-divider/style.js +6 -0
- package/dist/components/dropdown-divider/style.js.map +1 -0
- package/dist/components/dropdown-header/index.d.ts +11 -0
- package/dist/components/dropdown-header/index.js +18 -0
- package/dist/components/dropdown-header/index.js.map +1 -0
- package/dist/components/dropdown-header/style.js +6 -0
- package/dist/components/dropdown-header/style.js.map +1 -0
- package/dist/components/dropdown-item/index.d.ts +17 -0
- package/dist/components/dropdown-item/index.js +44 -0
- package/dist/components/dropdown-item/index.js.map +1 -0
- package/dist/components/dropdown-item/style.js +6 -0
- package/dist/components/dropdown-item/style.js.map +1 -0
- package/dist/components/dropdown-menu/index.d.ts +87 -0
- package/dist/components/dropdown-menu/index.js +324 -0
- package/dist/components/dropdown-menu/index.js.map +1 -0
- package/dist/components/dropdown-menu/style.js +6 -0
- package/dist/components/dropdown-menu/style.js.map +1 -0
- package/dist/components/empty/index.d.ts +23 -0
- package/dist/components/empty/index.js +83 -0
- package/dist/components/empty/index.js.map +1 -0
- package/dist/components/empty/style.js +6 -0
- package/dist/components/empty/style.js.map +1 -0
- package/dist/components/icon/index.d.ts +16 -0
- package/dist/components/icon/index.js +45 -0
- package/dist/components/icon/index.js.map +1 -0
- package/dist/components/icon/style.js +6 -0
- package/dist/components/icon/style.js.map +1 -0
- package/dist/components/index.d.ts +34 -0
- package/dist/components/index.js +37 -0
- package/dist/components/input/index.d.ts +47 -0
- package/dist/components/input/index.js +140 -0
- package/dist/components/input/index.js.map +1 -0
- package/dist/components/input/style.js +6 -0
- package/dist/components/input/style.js.map +1 -0
- package/dist/components/input-number/index.d.ts +52 -0
- package/dist/components/input-number/index.js +178 -0
- package/dist/components/input-number/index.js.map +1 -0
- package/dist/components/input-number/style.js +6 -0
- package/dist/components/input-number/style.js.map +1 -0
- package/dist/components/layout/index.d.ts +7 -1
- package/dist/components/layout/index.js +24 -21
- package/dist/components/layout/index.js.map +1 -1
- package/dist/components/layout/style.js +1 -1
- package/dist/components/layout/style.js.map +1 -1
- package/dist/components/option/index.d.ts +33 -0
- package/dist/components/option/index.js +78 -0
- package/dist/components/option/index.js.map +1 -0
- package/dist/components/option/style.js +6 -0
- package/dist/components/option/style.js.map +1 -0
- package/dist/components/popover/index.d.ts +69 -0
- package/dist/components/popover/index.js +231 -0
- package/dist/components/popover/index.js.map +1 -0
- package/dist/components/popover/style.js +6 -0
- package/dist/components/popover/style.js.map +1 -0
- package/dist/components/radio/index.d.ts +39 -0
- package/dist/components/radio/index.js +105 -0
- package/dist/components/radio/index.js.map +1 -0
- package/dist/components/radio/style.js +6 -0
- package/dist/components/radio/style.js.map +1 -0
- package/dist/components/radio-group/index.d.ts +35 -0
- package/dist/components/radio-group/index.js +87 -0
- package/dist/components/radio-group/index.js.map +1 -0
- package/dist/components/radio-group/style.js +6 -0
- package/dist/components/radio-group/style.js.map +1 -0
- package/dist/components/segmented/index.d.ts +33 -0
- package/dist/components/segmented/index.js +95 -0
- package/dist/components/segmented/index.js.map +1 -0
- package/dist/components/segmented/style.js +6 -0
- package/dist/components/segmented/style.js.map +1 -0
- package/dist/components/segmented-trigger/index.d.ts +18 -0
- package/dist/components/segmented-trigger/index.js +52 -0
- package/dist/components/segmented-trigger/index.js.map +1 -0
- package/dist/components/segmented-trigger/style.js +6 -0
- package/dist/components/segmented-trigger/style.js.map +1 -0
- package/dist/components/select/index.d.ts +80 -0
- package/dist/components/select/index.js +291 -0
- package/dist/components/select/index.js.map +1 -0
- package/dist/components/select/style.js +6 -0
- package/dist/components/select/style.js.map +1 -0
- package/dist/components/slider/index.d.ts +61 -0
- package/dist/components/slider/index.js +219 -0
- package/dist/components/slider/index.js.map +1 -0
- package/dist/components/slider/style.js +6 -0
- package/dist/components/slider/style.js.map +1 -0
- package/dist/components/spinner/index.d.ts +32 -0
- package/dist/components/spinner/index.js +52 -0
- package/dist/components/spinner/index.js.map +1 -0
- package/dist/components/spinner/style.js +6 -0
- package/dist/components/spinner/style.js.map +1 -0
- package/dist/components/svg-draw-lines/index.d.ts +30 -9
- package/dist/components/svg-draw-lines/index.js +87 -62
- package/dist/components/svg-draw-lines/index.js.map +1 -1
- package/dist/components/svg-draw-lines/style.js +1 -1
- package/dist/components/svg-draw-lines/style.js.map +1 -1
- package/dist/components/switch/index.d.ts +37 -0
- package/dist/components/switch/index.js +117 -0
- package/dist/components/switch/index.js.map +1 -0
- package/dist/components/switch/style.js +6 -0
- package/dist/components/switch/style.js.map +1 -0
- package/dist/components/textarea/index.d.ts +65 -0
- package/dist/components/textarea/index.js +204 -0
- package/dist/components/textarea/index.js.map +1 -0
- package/dist/components/textarea/style.js +6 -0
- package/dist/components/textarea/style.js.map +1 -0
- package/dist/components/theme/index.d.ts +29 -0
- package/dist/components/theme/index.js +78 -0
- package/dist/components/theme/index.js.map +1 -0
- package/dist/components/theme/style.js +6 -0
- package/dist/components/theme/style.js.map +1 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toast/index.js +3 -0
- package/dist/components/toast/manager.d.ts +15 -0
- package/dist/components/toast/manager.js +98 -0
- package/dist/components/toast/manager.js.map +1 -0
- package/dist/components/toast/style.js +6 -0
- package/dist/components/toast/style.js.map +1 -0
- package/dist/components/toast/toast.d.ts +42 -0
- package/dist/components/toast/toast.js +122 -0
- package/dist/components/toast/toast.js.map +1 -0
- package/dist/components/toast/types.d.ts +23 -0
- package/dist/components/tooltip/index.d.ts +59 -0
- package/dist/components/tooltip/index.js +190 -0
- package/dist/components/tooltip/index.js.map +1 -0
- package/dist/components/tooltip/style.js +6 -0
- package/dist/components/tooltip/style.js.map +1 -0
- package/dist/icons/generated/heroicons-check-16-solid.d.ts +6 -0
- package/dist/icons/generated/heroicons-check-16-solid.js +10 -0
- package/dist/icons/generated/heroicons-check-16-solid.js.map +1 -0
- package/dist/icons/generated/heroicons-x-mark-16-solid.d.ts +6 -0
- package/dist/icons/generated/heroicons-x-mark-16-solid.js +10 -0
- package/dist/icons/generated/heroicons-x-mark-16-solid.js.map +1 -0
- package/dist/icons/generated/jam-close-circle-f.d.ts +8 -0
- package/dist/icons/generated/jam-close-circle-f.js +12 -0
- package/dist/icons/generated/jam-close-circle-f.js.map +1 -0
- package/dist/icons/generated/jam-volume.d.ts +8 -0
- package/dist/icons/generated/jam-watch-f.d.ts +8 -0
- package/dist/icons/generated/lucide-arrow-down-to-line.d.ts +6 -0
- package/dist/icons/generated/lucide-arrow-down-to-line.js +10 -0
- package/dist/icons/generated/lucide-arrow-down-to-line.js.map +1 -0
- package/dist/icons/generated/lucide-arrow-up-to-line.d.ts +6 -0
- package/dist/icons/generated/lucide-arrow-up-to-line.js +10 -0
- package/dist/icons/generated/lucide-arrow-up-to-line.js.map +1 -0
- package/dist/icons/generated/lucide-bell.d.ts +6 -0
- package/dist/icons/generated/lucide-bell.js +10 -0
- package/dist/icons/generated/lucide-bell.js.map +1 -0
- package/dist/icons/generated/lucide-check.d.ts +6 -0
- package/dist/icons/generated/lucide-check.js +10 -0
- package/dist/icons/generated/lucide-check.js.map +1 -0
- package/dist/icons/generated/lucide-chevron-down.d.ts +6 -0
- package/dist/icons/generated/lucide-chevron-down.js +10 -0
- package/dist/icons/generated/lucide-chevron-down.js.map +1 -0
- package/dist/icons/generated/lucide-chevron-left.d.ts +6 -0
- package/dist/icons/generated/lucide-chevron-left.js +10 -0
- package/dist/icons/generated/lucide-chevron-left.js.map +1 -0
- package/dist/icons/generated/lucide-chevron-right.d.ts +6 -0
- package/dist/icons/generated/lucide-chevron-right.js +10 -0
- package/dist/icons/generated/lucide-chevron-right.js.map +1 -0
- package/dist/icons/generated/lucide-chevron-up.d.ts +6 -0
- package/dist/icons/generated/lucide-chevron-up.js +10 -0
- package/dist/icons/generated/lucide-chevron-up.js.map +1 -0
- package/dist/icons/generated/lucide-circle-alert.d.ts +6 -0
- package/dist/icons/generated/lucide-circle-alert.js +10 -0
- package/dist/icons/generated/lucide-circle-alert.js.map +1 -0
- package/dist/icons/generated/lucide-clipboard-paste.d.ts +6 -0
- package/dist/icons/generated/lucide-clipboard-paste.js +10 -0
- package/dist/icons/generated/lucide-clipboard-paste.js.map +1 -0
- package/dist/icons/generated/lucide-copy.d.ts +6 -0
- package/dist/icons/generated/lucide-copy.js +10 -0
- package/dist/icons/generated/lucide-copy.js.map +1 -0
- package/dist/icons/generated/lucide-download.d.ts +6 -0
- package/dist/icons/generated/lucide-download.js +10 -0
- package/dist/icons/generated/lucide-download.js.map +1 -0
- package/dist/icons/generated/lucide-file.d.ts +6 -0
- package/dist/icons/generated/lucide-file.js +10 -0
- package/dist/icons/generated/lucide-file.js.map +1 -0
- package/dist/icons/generated/lucide-folder.d.ts +6 -0
- package/dist/icons/generated/lucide-folder.js +10 -0
- package/dist/icons/generated/lucide-folder.js.map +1 -0
- package/dist/icons/generated/lucide-globe.d.ts +6 -0
- package/dist/icons/generated/lucide-globe.js +10 -0
- package/dist/icons/generated/lucide-globe.js.map +1 -0
- package/dist/icons/generated/lucide-heart.d.ts +6 -0
- package/dist/icons/generated/lucide-heart.js +10 -0
- package/dist/icons/generated/lucide-heart.js.map +1 -0
- package/dist/icons/generated/lucide-image.d.ts +6 -0
- package/dist/icons/generated/lucide-image.js +10 -0
- package/dist/icons/generated/lucide-image.js.map +1 -0
- package/dist/icons/generated/lucide-inbox.d.ts +6 -0
- package/dist/icons/generated/lucide-inbox.js +10 -0
- package/dist/icons/generated/lucide-inbox.js.map +1 -0
- package/dist/icons/generated/lucide-info.d.ts +6 -0
- package/dist/icons/generated/lucide-info.js +10 -0
- package/dist/icons/generated/lucide-info.js.map +1 -0
- package/dist/icons/generated/lucide-loader-circle.d.ts +6 -0
- package/dist/icons/generated/lucide-loader-circle.js +10 -0
- package/dist/icons/generated/lucide-loader-circle.js.map +1 -0
- package/dist/icons/generated/lucide-mail.d.ts +6 -0
- package/dist/icons/generated/lucide-mail.js +10 -0
- package/dist/icons/generated/lucide-mail.js.map +1 -0
- package/dist/icons/generated/lucide-minus.d.ts +6 -0
- package/dist/icons/generated/lucide-minus.js +10 -0
- package/dist/icons/generated/lucide-minus.js.map +1 -0
- package/dist/icons/generated/lucide-plus.d.ts +6 -0
- package/dist/icons/generated/lucide-plus.js +10 -0
- package/dist/icons/generated/lucide-plus.js.map +1 -0
- package/dist/icons/generated/lucide-printer.d.ts +6 -0
- package/dist/icons/generated/lucide-printer.js +10 -0
- package/dist/icons/generated/lucide-printer.js.map +1 -0
- package/dist/icons/generated/lucide-redo-2.d.ts +6 -0
- package/dist/icons/generated/lucide-redo-2.js +10 -0
- package/dist/icons/generated/lucide-redo-2.js.map +1 -0
- package/dist/icons/generated/lucide-scissors.d.ts +6 -0
- package/dist/icons/generated/lucide-scissors.js +10 -0
- package/dist/icons/generated/lucide-scissors.js.map +1 -0
- package/dist/icons/generated/lucide-search.d.ts +6 -0
- package/dist/icons/generated/lucide-search.js +10 -0
- package/dist/icons/generated/lucide-search.js.map +1 -0
- package/dist/icons/generated/lucide-settings.d.ts +6 -0
- package/dist/icons/generated/lucide-settings.js +10 -0
- package/dist/icons/generated/lucide-settings.js.map +1 -0
- package/dist/icons/generated/lucide-star.d.ts +6 -0
- package/dist/icons/generated/lucide-star.js +10 -0
- package/dist/icons/generated/lucide-star.js.map +1 -0
- package/dist/icons/generated/lucide-trash-2.d.ts +6 -0
- package/dist/icons/generated/lucide-trash-2.js +10 -0
- package/dist/icons/generated/lucide-trash-2.js.map +1 -0
- package/dist/icons/generated/lucide-triangle-alert.d.ts +6 -0
- package/dist/icons/generated/lucide-triangle-alert.js +10 -0
- package/dist/icons/generated/lucide-triangle-alert.js.map +1 -0
- package/dist/icons/generated/lucide-undo-2.d.ts +6 -0
- package/dist/icons/generated/lucide-undo-2.js +10 -0
- package/dist/icons/generated/lucide-undo-2.js.map +1 -0
- package/dist/icons/generated/lucide-upload.d.ts +6 -0
- package/dist/icons/generated/lucide-upload.js +10 -0
- package/dist/icons/generated/lucide-upload.js.map +1 -0
- package/dist/icons/generated/lucide-user.d.ts +6 -0
- package/dist/icons/generated/lucide-user.js +10 -0
- package/dist/icons/generated/lucide-user.js.map +1 -0
- package/dist/icons/generated/lucide-x.d.ts +6 -0
- package/dist/icons/generated/lucide-x.js +10 -0
- package/dist/icons/generated/lucide-x.js.map +1 -0
- package/dist/icons/generated/ooui-check.d.ts +6 -0
- package/dist/icons/generated/radix-icons-check.d.ts +6 -0
- package/dist/icons/generated/si-check-alt-fill.d.ts +6 -0
- package/dist/icons/index.d.ts +38 -0
- package/dist/icons/index.js +39 -0
- package/dist/node_modules/.pnpm/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js +248 -0
- package/dist/node_modules/.pnpm/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js.map +1 -0
- package/dist/node_modules/.pnpm/@floating-ui_dom@1.8.0/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +324 -0
- package/dist/node_modules/.pnpm/@floating-ui_dom@1.8.0/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +99 -0
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +102 -0
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
- package/dist/shared/menu-portal/menu-portal.js +11 -0
- package/dist/shared/menu-portal/menu-portal.js.map +1 -0
- package/dist/shared/normalize/index.js +11 -0
- package/dist/shared/normalize/index.js.map +1 -0
- package/dist/shared/overlay/overlay.js +68 -0
- package/dist/shared/overlay/overlay.js.map +1 -0
- package/dist/shared/overlay/portal.js +29 -0
- package/dist/shared/overlay/portal.js.map +1 -0
- package/dist/shared/overlay/presence.js +34 -0
- package/dist/shared/overlay/presence.js.map +1 -0
- package/dist/shared/property-converters/boolean-with-false-string.js +9 -0
- package/dist/shared/property-converters/boolean-with-false-string.js.map +1 -0
- package/dist/shared/scroll-lock/scroll-lock.js +12 -0
- package/dist/shared/scroll-lock/scroll-lock.js.map +1 -0
- package/dist/shared/theme/overlay-root.js +28 -0
- package/dist/shared/theme/overlay-root.js.map +1 -0
- package/dist/shared/theme/theme-scope.js +27 -0
- package/dist/shared/theme/theme-scope.js.map +1 -0
- package/dist/types/iconify.d.ts +1 -0
- package/dist/types/react.d.ts +35 -9
- package/dist/types/utils.d.ts +14 -0
- package/dist/types/vue.d.ts +47 -7
- package/package.json +30 -14
- package/dist/index.d.ts +0 -4
- package/dist/index.js +0 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/switch/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\n\nimport '@/components/icon'\nimport glass from '@/assets/glass.css?inline'\nimport { lucideLoaderCircle } from '@/icons'\n\nimport style from './style.css?inline'\n\n@customElement('web-ui-switch')\nexport class WebUiSwitch extends LitElement {\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n static formAssociated = true\n\n private _internals?: ElementInternals\n @state() private _formDisabled = false\n\n @state() private _checked = false\n\n get checked(): boolean {\n return this._checked\n }\n\n set checked(v: boolean) {\n const old = this._checked\n this._checked = v\n this._syncFormValue()\n this.requestUpdate('checked', old)\n }\n\n @property({ type: String, reflect: true }) name = ''\n @property({ type: String }) value = ''\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true }) required = false\n @property({ type: Boolean, reflect: true }) loading = false\n @state() private pressed = false\n\n private get _isDisabled(): boolean {\n return this.disabled || this._formDisabled\n }\n\n override connectedCallback() {\n super.connectedCallback()\n if (this._internals) return\n this._internals = this.attachInternals()\n if (this.hasAttribute('checked')) {\n this._checked = true\n }\n this._syncFormValue()\n }\n\n formResetCallback() {\n this.checked = this.hasAttribute('checked')\n }\n\n formDisabledCallback(disabled: boolean) {\n this._formDisabled = disabled\n }\n\n override updated() {\n this._syncFormValue()\n if (!this._internals || typeof this._internals.setValidity !== 'function') return\n if (this._isDisabled || !this.required || this._checked) this._internals.setValidity({})\n else this._internals.setValidity({ valueMissing: true }, '请启用此项')\n }\n\n private _syncFormValue() {\n this._internals?.setFormValue?.(this._checked ? this.value || 'on' : null)\n }\n\n /** 用户点击切换开关状态,阻止 label 默认行为避免原生 checkbox 重复触发 */\n private handleClick(e: Event) {\n e.preventDefault()\n if (this._isDisabled || this.loading) return\n const old = this._checked\n this._checked = !old\n this._syncFormValue()\n this.requestUpdate('checked', old)\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }))\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n }\n\n private handlePointerDown() {\n if (this._isDisabled || this.loading) return\n this.pressed = true\n }\n\n private handlePointerUp() {\n this.pressed = false\n }\n\n private handlePointerLeave() {\n this.pressed = false\n }\n\n override render() {\n const trackCls = {\n 'wui-switch-track': true,\n 'is-open': this._checked,\n 'is-disabled': this._isDisabled || this.loading\n }\n const thumbCls = {\n 'wui-switch-thumb': true,\n 'wui-glass': this.pressed,\n 'is-pressed': this.pressed\n }\n\n return html`\n <label\n class=${classMap(trackCls)}\n role=\"switch\"\n aria-checked=${String(this._checked)}\n @click=${this.handleClick}\n @pointerdown=${this.handlePointerDown}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerUp}\n @pointerleave=${this.handlePointerLeave}\n >\n <input\n type=\"checkbox\"\n .checked=${this._checked}\n ?disabled=${this._isDisabled || this.loading}\n class=\"sr-only\"\n />\n <div class=${classMap(thumbCls)}>\n ${this.loading\n ? html`<div class=\"wui-switch-loading\">\n <web-ui-icon .icon=${lucideLoaderCircle} size=\"14\" color=\"#08f\" spin></web-ui-icon>\n </div>`\n : ''}\n </div>\n </label>\n `\n }\n\n declare readonly $events: {\n input: Event\n change: Event\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-switch': WebUiSwitch\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region src/components/switch/style.css?inline
|
|
2
|
+
var e = "*,:before,:after{box-sizing:border-box}:host{display:inline-block}:host([disabled]){cursor:not-allowed}.sr-only{white-space:nowrap;clip-path:inset(50%);border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.wui-switch-track{cursor:pointer;-webkit-user-select:none;user-select:none;background-color:var(--wui-color-surface-raised-deep,#e5e5ea);outline-offset:2px;border-radius:2147483647px;outline:3px solid #0000;justify-content:space-between;align-items:center;width:48px;height:24px;transition:background-color .25s;display:flex;position:relative}.wui-switch-track:focus-visible{outline-color:var(--wui-focus-ring,#08f6)}.wui-switch-track.is-open{background-color:var(--wui-color-accent,#08f)}.wui-switch-track.is-disabled{cursor:not-allowed;opacity:.4}.wui-switch-thumb{border-radius:2147483647px;width:20px;height:20px;transition:width .15s cubic-bezier(.4,0,.2,1),transform .25s cubic-bezier(.4,0,.2,1),border-radius .15s cubic-bezier(.4,0,.2,1),background-color .15s;position:absolute;top:2px;left:2px;overflow:hidden}.wui-switch-thumb.is-pressed{background-color:#0000;border-radius:2147483647px;width:32px}.wui-switch-thumb:not(.is-pressed){background-color:var(--wui-color-surface,#fff);box-shadow:1px 2px 6px #0003}.wui-switch-track.is-open .wui-switch-thumb{transform:translate(24px)}.wui-switch-track.is-open .wui-switch-thumb.is-pressed{transform:translate(12px)}.wui-switch-loading{pointer-events:none;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}";
|
|
3
|
+
//#endregion
|
|
4
|
+
export { e as default };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/switch/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: inline-block;\n}\n\n:host([disabled]) {\n cursor: not-allowed;\n}\n\n/*\n标准视觉隐藏技术(sr-only):\n业内标准的“屏幕阅读器专用”隐藏方案。\n把复选框缩放到 1x1 像素,但保留在 dom 中,\n既让肉眼看不见,又能让读屏软件识别,并允许键盘用户通过空格键切换状态。\n*/\n.sr-only {\n position: absolute;\n\n overflow: hidden;\n\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n\n white-space: nowrap;\n\n clip-path: inset(50%);\n}\n\n.wui-switch-track {\n cursor: pointer;\n user-select: none;\n\n position: relative;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n width: 48px;\n height: 24px;\n border-radius: calc(infinity * 1px);\n\n background-color: var(--wui-color-surface-raised-deep, #e5e5ea);\n outline: 3px solid transparent;\n outline-offset: 2px;\n\n transition: background-color 0.25s ease;\n\n &:focus-visible {\n outline-color: var(--wui-focus-ring, rgb(0 136 255 / 0.4));\n }\n\n &.is-open {\n background-color: var(--wui-color-accent, #08f);\n }\n\n &.is-disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n}\n\n.wui-switch-thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n\n overflow: hidden;\n\n width: 20px;\n height: 20px;\n border-radius: calc(infinity * 1px);\n\n transition:\n width 0.15s cubic-bezier(0.4, 0, 0.2, 1),\n transform 0.25s cubic-bezier(0.4, 0, 0.2, 1),\n border-radius 0.15s cubic-bezier(0.4, 0, 0.2, 1),\n background-color 0.15s ease;\n\n &.is-pressed {\n width: 32px;\n border-radius: calc(infinity * 1px);\n background-color: transparent;\n }\n\n &:not(.is-pressed) {\n background-color: var(--wui-color-surface, #fff);\n box-shadow: 1px 2px 6px rgb(0 0 0 / 0.2);\n }\n}\n\n.wui-switch-track.is-open .wui-switch-thumb {\n transform: translateX(24px);\n\n &.is-pressed {\n transform: translateX(12px);\n }\n}\n\n.wui-switch-loading {\n pointer-events: none;\n\n position: absolute;\n inset: 0;\n\n display: flex;\n align-items: center;\n justify-content: center;\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
export declare class WebUiTextarea extends LitElement {
|
|
3
|
+
static formAssociated: boolean;
|
|
4
|
+
static styles: import('lit').CSSResult[];
|
|
5
|
+
placeholder: string;
|
|
6
|
+
name: string;
|
|
7
|
+
disabled: boolean;
|
|
8
|
+
readonly: boolean;
|
|
9
|
+
required: boolean;
|
|
10
|
+
full: boolean;
|
|
11
|
+
clearable: boolean;
|
|
12
|
+
borderless: boolean;
|
|
13
|
+
rows: number;
|
|
14
|
+
minlength: number | undefined;
|
|
15
|
+
maxlength: number | undefined;
|
|
16
|
+
autosize: boolean;
|
|
17
|
+
ariaLabel: string | null;
|
|
18
|
+
ariaLabelledby: string | undefined;
|
|
19
|
+
private _value;
|
|
20
|
+
private _focused;
|
|
21
|
+
private _formDisabled;
|
|
22
|
+
private _hasPrefix;
|
|
23
|
+
private _hasSuffix;
|
|
24
|
+
private _textarea;
|
|
25
|
+
private _resizeObserver;
|
|
26
|
+
private _internals?;
|
|
27
|
+
get value(): string;
|
|
28
|
+
set value(v: string);
|
|
29
|
+
private get _isDisabled();
|
|
30
|
+
connectedCallback(): void;
|
|
31
|
+
disconnectedCallback(): void;
|
|
32
|
+
firstUpdated(): void;
|
|
33
|
+
updated(changed: Map<string, unknown>): void;
|
|
34
|
+
formDisabledCallback(disabled: boolean): void;
|
|
35
|
+
formResetCallback(): void;
|
|
36
|
+
formStateRestoreCallback(state: string | File | FormData | null): void;
|
|
37
|
+
private _getTextarea;
|
|
38
|
+
private _syncValidity;
|
|
39
|
+
private _setupAutosize;
|
|
40
|
+
private _teardownAutosize;
|
|
41
|
+
private _autosize;
|
|
42
|
+
private handleInput;
|
|
43
|
+
private handleFocus;
|
|
44
|
+
private handleBlur;
|
|
45
|
+
private handleNativeChange;
|
|
46
|
+
focus(): void;
|
|
47
|
+
blur(): void;
|
|
48
|
+
select(): void;
|
|
49
|
+
private focusTextarea;
|
|
50
|
+
private _onSlotChange;
|
|
51
|
+
private handleClear;
|
|
52
|
+
private preventMouseDownBlur;
|
|
53
|
+
render(): import('lit').TemplateResult<1>;
|
|
54
|
+
readonly $events: {
|
|
55
|
+
input: Event;
|
|
56
|
+
change: Event;
|
|
57
|
+
focus: FocusEvent;
|
|
58
|
+
blur: FocusEvent;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
declare global {
|
|
62
|
+
interface HTMLElementTagNameMap {
|
|
63
|
+
'web-ui-textarea': WebUiTextarea;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import e from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
|
|
2
|
+
import "../icon/index.js";
|
|
3
|
+
import t from "../../assets/glass.js";
|
|
4
|
+
import n from "../../icons/generated/jam-close-circle-f.js";
|
|
5
|
+
import r from "./style.js";
|
|
6
|
+
import { LitElement as i, html as a, unsafeCSS as o } from "lit";
|
|
7
|
+
import { customElement as s, property as c, state as l } from "lit/decorators.js";
|
|
8
|
+
import { classMap as u } from "lit/directives/class-map.js";
|
|
9
|
+
import { ifDefined as d } from "lit/directives/if-defined.js";
|
|
10
|
+
//#region src/components/textarea/index.ts
|
|
11
|
+
var f = class extends i {
|
|
12
|
+
constructor(...e) {
|
|
13
|
+
super(...e), this.placeholder = "", this.name = "", this.disabled = !1, this.readonly = !1, this.required = !1, this.full = !1, this.clearable = !1, this.borderless = !1, this.rows = 3, this.autosize = !1, this.ariaLabel = null, this._value = "", this._focused = !1, this._formDisabled = !1, this._hasPrefix = !1, this._hasSuffix = !1, this._textarea = null, this._resizeObserver = null;
|
|
14
|
+
}
|
|
15
|
+
static {
|
|
16
|
+
this.formAssociated = !0;
|
|
17
|
+
}
|
|
18
|
+
static {
|
|
19
|
+
this.styles = [o(t), o(r)];
|
|
20
|
+
}
|
|
21
|
+
get value() {
|
|
22
|
+
return this._value;
|
|
23
|
+
}
|
|
24
|
+
set value(e) {
|
|
25
|
+
let t = this._value;
|
|
26
|
+
this._value = e, this._internals?.setFormValue?.(e), this.requestUpdate("value", t);
|
|
27
|
+
}
|
|
28
|
+
get _isDisabled() {
|
|
29
|
+
return this.disabled || this._formDisabled;
|
|
30
|
+
}
|
|
31
|
+
connectedCallback() {
|
|
32
|
+
super.connectedCallback(), this._internals ||= this.attachInternals(), this._internals.setFormValue?.(this._value);
|
|
33
|
+
}
|
|
34
|
+
disconnectedCallback() {
|
|
35
|
+
super.disconnectedCallback(), this._teardownAutosize();
|
|
36
|
+
}
|
|
37
|
+
firstUpdated() {
|
|
38
|
+
this._textarea = this.shadowRoot?.querySelector("textarea") ?? null;
|
|
39
|
+
}
|
|
40
|
+
updated(e) {
|
|
41
|
+
if (e.has("_value")) {
|
|
42
|
+
let e = this._getTextarea();
|
|
43
|
+
e && e.value !== this._value && (e.value = this._value);
|
|
44
|
+
}
|
|
45
|
+
e.has("autosize") && (this.autosize ? this._setupAutosize() : this._teardownAutosize(!0)), this._syncValidity(), this.toggleAttribute("focused", this._focused);
|
|
46
|
+
}
|
|
47
|
+
formDisabledCallback(e) {
|
|
48
|
+
this._formDisabled = e;
|
|
49
|
+
}
|
|
50
|
+
formResetCallback() {
|
|
51
|
+
this.value = this.getAttribute("value") || "";
|
|
52
|
+
}
|
|
53
|
+
formStateRestoreCallback(e) {
|
|
54
|
+
typeof e == "string" && (this.value = e);
|
|
55
|
+
}
|
|
56
|
+
_getTextarea() {
|
|
57
|
+
return this._textarea ??= this.shadowRoot?.querySelector("textarea") ?? null, this._textarea;
|
|
58
|
+
}
|
|
59
|
+
_syncValidity() {
|
|
60
|
+
let e = this._internals, t = this._getTextarea();
|
|
61
|
+
if (!e || !t || typeof e.setValidity != "function") return;
|
|
62
|
+
if (this._isDisabled || t.validity.valid) {
|
|
63
|
+
e.setValidity({});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
let n = {};
|
|
67
|
+
t.validity.valueMissing && (n.valueMissing = !0), t.validity.tooShort && (n.tooShort = !0), t.validity.tooLong && (n.tooLong = !0), e.setValidity(n, t.validationMessage, t);
|
|
68
|
+
}
|
|
69
|
+
_setupAutosize() {
|
|
70
|
+
if (this._teardownAutosize(), typeof ResizeObserver > "u") {
|
|
71
|
+
this._autosize();
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
this._resizeObserver = new ResizeObserver(() => {
|
|
75
|
+
this._autosize();
|
|
76
|
+
}), this._textarea && this._resizeObserver.observe(this._textarea), this._autosize();
|
|
77
|
+
}
|
|
78
|
+
_teardownAutosize(e = !1) {
|
|
79
|
+
this._resizeObserver?.disconnect(), this._resizeObserver = null, e && this._textarea?.style.removeProperty("height");
|
|
80
|
+
}
|
|
81
|
+
_autosize() {
|
|
82
|
+
if (!this._textarea || !this.autosize) return;
|
|
83
|
+
this._textarea.style.height = "auto";
|
|
84
|
+
let e = this.rows * 20, t = this._textarea.scrollHeight, n = Math.min(Math.max(t, e), 300);
|
|
85
|
+
this._textarea.style.height = `${n}px`;
|
|
86
|
+
}
|
|
87
|
+
handleInput(e) {
|
|
88
|
+
e.target instanceof HTMLTextAreaElement && (this._value = e.target.value, this._internals?.setFormValue?.(this._value), this._syncValidity(), this._autosize());
|
|
89
|
+
}
|
|
90
|
+
handleFocus() {
|
|
91
|
+
this._isDisabled || (this._focused = !0);
|
|
92
|
+
}
|
|
93
|
+
handleBlur() {
|
|
94
|
+
this._focused = !1;
|
|
95
|
+
}
|
|
96
|
+
handleNativeChange(e) {
|
|
97
|
+
e.target instanceof HTMLTextAreaElement && (this._value = e.target.value, this._internals?.setFormValue?.(this._value), this._syncValidity());
|
|
98
|
+
}
|
|
99
|
+
focus() {
|
|
100
|
+
this.shadowRoot?.querySelector("textarea")?.focus();
|
|
101
|
+
}
|
|
102
|
+
blur() {
|
|
103
|
+
this.shadowRoot?.querySelector("textarea")?.blur();
|
|
104
|
+
}
|
|
105
|
+
select() {
|
|
106
|
+
this.shadowRoot?.querySelector("textarea")?.select();
|
|
107
|
+
}
|
|
108
|
+
focusTextarea() {
|
|
109
|
+
this._isDisabled || this.shadowRoot?.querySelector("textarea")?.focus();
|
|
110
|
+
}
|
|
111
|
+
_onSlotChange(e) {
|
|
112
|
+
if (!(e.target instanceof HTMLSlotElement)) return;
|
|
113
|
+
let t = e.target, n = t.assignedElements().length > 0;
|
|
114
|
+
t.name === "prefix" && (this._hasPrefix = n), t.name === "suffix" && (this._hasSuffix = n);
|
|
115
|
+
}
|
|
116
|
+
handleClear() {
|
|
117
|
+
this._isDisabled || (this._value = "", this._internals?.setFormValue?.(""), this.dispatchEvent(new Event("input", {
|
|
118
|
+
bubbles: !0,
|
|
119
|
+
composed: !0
|
|
120
|
+
})));
|
|
121
|
+
}
|
|
122
|
+
preventMouseDownBlur(e) {
|
|
123
|
+
e.preventDefault();
|
|
124
|
+
}
|
|
125
|
+
render() {
|
|
126
|
+
let e = this.clearable && this._value;
|
|
127
|
+
return a`
|
|
128
|
+
<div class="wui-glass wui-textarea-inner" @click=${this.focusTextarea}>
|
|
129
|
+
<slot name="prefix" class=${u({ empty: !this._hasPrefix })} @slotchange=${this._onSlotChange}></slot>
|
|
130
|
+
<textarea
|
|
131
|
+
placeholder=${this.placeholder}
|
|
132
|
+
name=${this.name}
|
|
133
|
+
aria-label=${d(this.ariaLabel)}
|
|
134
|
+
aria-labelledby=${d(this.ariaLabelledby)}
|
|
135
|
+
.rows=${this.rows}
|
|
136
|
+
minlength=${d(this.minlength)}
|
|
137
|
+
maxlength=${d(this.maxlength)}
|
|
138
|
+
?disabled=${this._isDisabled}
|
|
139
|
+
?readonly=${this.readonly}
|
|
140
|
+
?required=${this.required}
|
|
141
|
+
.value=${this._value}
|
|
142
|
+
@input=${this.handleInput}
|
|
143
|
+
@change=${this.handleNativeChange}
|
|
144
|
+
@focus=${this.handleFocus}
|
|
145
|
+
@blur=${this.handleBlur}
|
|
146
|
+
></textarea>
|
|
147
|
+
${e ? a`<span class="clear" @pointerdown=${this.preventMouseDownBlur} @click=${this.handleClear}>
|
|
148
|
+
<web-ui-icon .icon=${n}></web-ui-icon>
|
|
149
|
+
</span>` : ""}
|
|
150
|
+
<slot name="suffix" class=${u({ empty: !this._hasSuffix })} @slotchange=${this._onSlotChange}></slot>
|
|
151
|
+
</div>
|
|
152
|
+
`;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
e([c({
|
|
156
|
+
type: String,
|
|
157
|
+
reflect: !0
|
|
158
|
+
})], f.prototype, "placeholder", void 0), e([c({
|
|
159
|
+
type: String,
|
|
160
|
+
reflect: !0
|
|
161
|
+
})], f.prototype, "name", void 0), e([c({
|
|
162
|
+
type: Boolean,
|
|
163
|
+
reflect: !0
|
|
164
|
+
})], f.prototype, "disabled", void 0), e([c({
|
|
165
|
+
type: Boolean,
|
|
166
|
+
reflect: !0
|
|
167
|
+
})], f.prototype, "readonly", void 0), e([c({
|
|
168
|
+
type: Boolean,
|
|
169
|
+
reflect: !0
|
|
170
|
+
})], f.prototype, "required", void 0), e([c({
|
|
171
|
+
type: Boolean,
|
|
172
|
+
reflect: !0
|
|
173
|
+
})], f.prototype, "full", void 0), e([c({
|
|
174
|
+
type: Boolean,
|
|
175
|
+
reflect: !0
|
|
176
|
+
})], f.prototype, "clearable", void 0), e([c({
|
|
177
|
+
type: Boolean,
|
|
178
|
+
reflect: !0
|
|
179
|
+
})], f.prototype, "borderless", void 0), e([c({
|
|
180
|
+
type: Number,
|
|
181
|
+
reflect: !0
|
|
182
|
+
})], f.prototype, "rows", void 0), e([c({
|
|
183
|
+
type: Number,
|
|
184
|
+
reflect: !0
|
|
185
|
+
})], f.prototype, "minlength", void 0), e([c({
|
|
186
|
+
type: Number,
|
|
187
|
+
reflect: !0
|
|
188
|
+
})], f.prototype, "maxlength", void 0), e([c({
|
|
189
|
+
type: Boolean,
|
|
190
|
+
reflect: !0
|
|
191
|
+
})], f.prototype, "autosize", void 0), e([c({
|
|
192
|
+
type: String,
|
|
193
|
+
attribute: "aria-label"
|
|
194
|
+
})], f.prototype, "ariaLabel", void 0), e([c({
|
|
195
|
+
type: String,
|
|
196
|
+
attribute: "aria-labelledby"
|
|
197
|
+
})], f.prototype, "ariaLabelledby", void 0), e([l()], f.prototype, "_value", void 0), e([l()], f.prototype, "_focused", void 0), e([l()], f.prototype, "_formDisabled", void 0), e([l()], f.prototype, "_hasPrefix", void 0), e([l()], f.prototype, "_hasSuffix", void 0), e([c({
|
|
198
|
+
type: String,
|
|
199
|
+
reflect: !0
|
|
200
|
+
})], f.prototype, "value", null), f = e([s("web-ui-textarea")], f);
|
|
201
|
+
//#endregion
|
|
202
|
+
export { f as WebUiTextarea };
|
|
203
|
+
|
|
204
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/textarea/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\n\n// web-ui-icon 必须注册(Rolldown tree-shake 副作用 import,引用类名阻止删除)\nimport '@/components/icon'\nimport glass from '@/assets/glass.css?inline'\nimport { jamCloseCircleF } from '@/icons'\n\nimport style from './style.css?inline'\n\n@customElement('web-ui-textarea')\nexport class WebUiTextarea extends LitElement {\n static formAssociated = true\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n\n @property({ type: String, reflect: true }) placeholder = ''\n @property({ type: String, reflect: true }) name = ''\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true }) readonly = false\n @property({ type: Boolean, reflect: true }) required = false\n @property({ type: Boolean, reflect: true }) full = false\n @property({ type: Boolean, reflect: true }) clearable = false\n @property({ type: Boolean, reflect: true }) borderless = false\n @property({ type: Number, reflect: true }) rows = 3\n @property({ type: Number, reflect: true }) minlength: number | undefined\n @property({ type: Number, reflect: true }) maxlength: number | undefined\n @property({ type: Boolean, reflect: true }) autosize = false\n @property({ type: String, attribute: 'aria-label' }) override ariaLabel: string | null = null\n @property({ type: String, attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined\n\n @state() private _value = ''\n @state() private _focused = false\n @state() private _formDisabled = false\n @state() private _hasPrefix = false\n @state() private _hasSuffix = false\n\n private _textarea: HTMLTextAreaElement | null = null\n private _resizeObserver: ResizeObserver | null = null\n private _internals?: ElementInternals\n\n @property({ type: String, reflect: true })\n get value(): string {\n return this._value\n }\n\n set value(v: string) {\n const old = this._value\n this._value = v\n this._internals?.setFormValue?.(v)\n this.requestUpdate('value', old)\n }\n\n private get _isDisabled(): boolean {\n return this.disabled || this._formDisabled\n }\n\n override connectedCallback() {\n super.connectedCallback()\n if (!this._internals) {\n this._internals = this.attachInternals()\n }\n this._internals.setFormValue?.(this._value)\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this._teardownAutosize()\n }\n\n override firstUpdated() {\n this._textarea = this.shadowRoot?.querySelector('textarea') ?? null\n }\n\n override updated(changed: Map<string, unknown>) {\n if (changed.has('_value')) {\n const textarea = this._getTextarea()\n if (textarea && textarea.value !== this._value) {\n textarea.value = this._value\n }\n }\n if (changed.has('autosize')) {\n if (this.autosize) {\n this._setupAutosize()\n } else {\n this._teardownAutosize(true)\n }\n }\n this._syncValidity()\n this.toggleAttribute('focused', this._focused)\n }\n\n formDisabledCallback(disabled: boolean) {\n this._formDisabled = disabled\n }\n\n formResetCallback() {\n this.value = this.getAttribute('value') || ''\n }\n\n formStateRestoreCallback(state: string | File | FormData | null) {\n if (typeof state === 'string') this.value = state\n }\n\n private _getTextarea(): HTMLTextAreaElement | null {\n this._textarea ??= this.shadowRoot?.querySelector('textarea') ?? null\n return this._textarea\n }\n\n private _syncValidity() {\n const internals = this._internals\n const textarea = this._getTextarea()\n if (!internals || !textarea || typeof internals.setValidity !== 'function') return\n\n if (this._isDisabled || textarea.validity.valid) {\n internals.setValidity({})\n return\n }\n\n const validity: ValidityStateFlags = {}\n if (textarea.validity.valueMissing) validity.valueMissing = true\n if (textarea.validity.tooShort) validity.tooShort = true\n if (textarea.validity.tooLong) validity.tooLong = true\n internals.setValidity(validity, textarea.validationMessage, textarea)\n }\n\n private _setupAutosize() {\n this._teardownAutosize()\n if (typeof ResizeObserver === 'undefined') {\n this._autosize()\n return\n }\n this._resizeObserver = new ResizeObserver(() => {\n this._autosize()\n })\n if (this._textarea) this._resizeObserver.observe(this._textarea)\n this._autosize()\n }\n\n private _teardownAutosize(resetHeight = false) {\n this._resizeObserver?.disconnect()\n this._resizeObserver = null\n if (resetHeight) this._textarea?.style.removeProperty('height')\n }\n\n private _autosize() {\n if (!this._textarea || !this.autosize) return\n this._textarea.style.height = 'auto'\n const computedMin = this.rows * 20\n const computedMax = 300\n const scrollH = this._textarea.scrollHeight\n const clamped = Math.min(Math.max(scrollH, computedMin), computedMax)\n this._textarea.style.height = `${clamped}px`\n }\n\n private handleInput(e: Event) {\n if (!(e.target instanceof HTMLTextAreaElement)) return\n this._value = e.target.value\n this._internals?.setFormValue?.(this._value)\n this._syncValidity()\n this._autosize()\n }\n\n private handleFocus() {\n if (!this._isDisabled) this._focused = true\n }\n\n private handleBlur() {\n this._focused = false\n }\n\n private handleNativeChange(e: Event) {\n if (!(e.target instanceof HTMLTextAreaElement)) return\n this._value = e.target.value\n this._internals?.setFormValue?.(this._value)\n this._syncValidity()\n }\n\n override focus() {\n this.shadowRoot?.querySelector('textarea')?.focus()\n }\n\n override blur() {\n this.shadowRoot?.querySelector('textarea')?.blur()\n }\n\n select() {\n this.shadowRoot?.querySelector('textarea')?.select()\n }\n\n private focusTextarea() {\n if (this._isDisabled) return\n this.shadowRoot?.querySelector('textarea')?.focus()\n }\n\n private _onSlotChange(e: Event) {\n if (!(e.target instanceof HTMLSlotElement)) return\n const slot = e.target\n const hasContent = slot.assignedElements().length > 0\n if (slot.name === 'prefix') this._hasPrefix = hasContent\n if (slot.name === 'suffix') this._hasSuffix = hasContent\n }\n\n private handleClear() {\n if (this._isDisabled) return\n this._value = ''\n this._internals?.setFormValue?.('')\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }))\n }\n\n private preventMouseDownBlur(e: Event) {\n e.preventDefault()\n }\n\n override render() {\n const showClear = this.clearable && this._value\n\n return html`\n <div class=\"wui-glass wui-textarea-inner\" @click=${this.focusTextarea}>\n <slot name=\"prefix\" class=${classMap({ empty: !this._hasPrefix })} @slotchange=${this._onSlotChange}></slot>\n <textarea\n placeholder=${this.placeholder}\n name=${this.name}\n aria-label=${ifDefined(this.ariaLabel)}\n aria-labelledby=${ifDefined(this.ariaLabelledby)}\n .rows=${this.rows}\n minlength=${ifDefined(this.minlength)}\n maxlength=${ifDefined(this.maxlength)}\n ?disabled=${this._isDisabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n .value=${this._value}\n @input=${this.handleInput}\n @change=${this.handleNativeChange}\n @focus=${this.handleFocus}\n @blur=${this.handleBlur}\n ></textarea>\n ${showClear\n ? html`<span class=\"clear\" @pointerdown=${this.preventMouseDownBlur} @click=${this.handleClear}>\n <web-ui-icon .icon=${jamCloseCircleF}></web-ui-icon>\n </span>`\n : ''}\n <slot name=\"suffix\" class=${classMap({ empty: !this._hasSuffix })} @slotchange=${this._onSlotChange}></slot>\n </div>\n `\n }\n\n declare readonly $events: {\n input: Event\n change: Event\n focus: FocusEvent\n blur: FocusEvent\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-textarea': WebUiTextarea\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region src/components/textarea/style.css?inline
|
|
2
|
+
var e = "*,:before,:after{box-sizing:border-box}:host{display:block}:host([disabled]){cursor:not-allowed;opacity:.4}.wui-textarea-inner{box-sizing:border-box;width:var(--wui-textarea-width,200px);min-width:var(--wui-button-size,40px);border-radius:20px;align-items:flex-start;gap:8px;padding:9px 18px;transition:border-color .2s,box-shadow .2s;display:flex;position:relative}:host([full]) .wui-textarea-inner{width:100%}:host([borderless]) .wui-textarea-inner{-webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:none;background:0 0;border:none;padding:9px 0}:host([focused]) .wui-textarea-inner{--wui-glass-shadow:var(--wui-shadow-glass,0 2px 16px #0000000f), 0 0 0 3px var(--wui-focus-ring,#08f6);border-color:var(--wui-color-border-strong,#006ee680)}:host([borderless][focused]) .wui-textarea-inner{box-shadow:none;border-color:#0000}textarea{resize:vertical;box-sizing:border-box;width:100%;min-height:60px;font-size:var(--wui-font-size,14px);color:var(--wui-color-text,#1b1b1b);background:0 0;border:none;outline:none;flex:1;padding:0;line-height:1.5;display:block}textarea::placeholder{color:var(--wui-color-text-muted,#6a6a6a)}textarea:disabled{cursor:not-allowed}textarea:read-only{cursor:default}slot{font-size:var(--wui-font-size,14px);color:var(--wui-color-text-muted,#6a6a6a);flex-shrink:0;align-items:center;display:flex}slot.empty{display:none}.clear{cursor:pointer;color:var(--wui-color-text-muted,#6a6a6a);flex-shrink:0;justify-content:center;align-self:flex-start;align-items:center;margin-top:2px;display:flex}.clear:hover{color:var(--wui-color-text-muted,#6a6a6a)}";
|
|
3
|
+
//#endregion
|
|
4
|
+
export { e as default };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/textarea/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: block;\n}\n\n:host([disabled]) {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n/* ===== Textarea ===== */\n\n.wui-textarea-inner {\n position: relative;\n\n display: flex;\n gap: 8px;\n align-items: flex-start;\n\n box-sizing: border-box;\n width: var(--wui-textarea-width, 200px);\n min-width: var(--wui-button-size, 40px);\n padding: 9px 18px;\n border-radius: 20px;\n\n transition:\n border-color 0.2s,\n box-shadow 0.2s;\n}\n\n:host([full]) .wui-textarea-inner {\n width: 100%;\n}\n\n/* ===== Borderless ===== */\n\n:host([borderless]) .wui-textarea-inner {\n padding: 9px 0;\n border: none;\n\n background: transparent;\n backdrop-filter: none;\n box-shadow: none;\n}\n\n:host([focused]) .wui-textarea-inner {\n --wui-glass-shadow:\n var(--wui-shadow-glass, 0 2px 16px rgb(0 0 0 / 0.06)), 0 0 0 3px var(--wui-focus-ring, rgb(0 136 255 / 0.4));\n border-color: var(--wui-color-border-strong, rgb(0 110 230 / 0.5));\n}\n\n:host([borderless][focused]) .wui-textarea-inner {\n border-color: transparent;\n box-shadow: none;\n}\n\ntextarea {\n resize: vertical;\n\n display: block;\n flex: 1;\n\n box-sizing: border-box;\n width: 100%;\n min-height: 60px;\n padding: 0;\n border: none;\n\n font-size: var(--wui-font-size, 14px);\n line-height: 1.5;\n color: var(--wui-color-text, #1b1b1b);\n\n background: transparent;\n outline: none;\n\n &::placeholder {\n color: var(--wui-color-text-muted, #6a6a6a);\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n\n &:read-only {\n cursor: default;\n }\n}\n\n/* ===== Prefix / Suffix ===== */\n\nslot {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n\n font-size: var(--wui-font-size, 14px);\n color: var(--wui-color-text-muted, #6a6a6a);\n}\n\nslot.empty {\n display: none;\n}\n\n/* ===== Clear button ===== */\n\n.clear {\n cursor: pointer;\n\n display: flex;\n flex-shrink: 0;\n align-items: center;\n align-self: flex-start;\n justify-content: center;\n\n margin-top: 2px;\n\n color: var(--wui-color-text-muted, #6a6a6a);\n\n &:hover {\n color: var(--wui-color-text-muted, #6a6a6a);\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
export type ThemeAppearance = 'light' | 'dark' | 'system';
|
|
3
|
+
export type ThemeMotion = 'full' | 'reduced' | 'system';
|
|
4
|
+
export declare class WebUiTheme extends LitElement {
|
|
5
|
+
static styles: import('lit').CSSResult;
|
|
6
|
+
get appearance(): ThemeAppearance | undefined;
|
|
7
|
+
set appearance(v: string | undefined);
|
|
8
|
+
private _appearance?;
|
|
9
|
+
get motion(): ThemeMotion;
|
|
10
|
+
set motion(v: string);
|
|
11
|
+
private _motion;
|
|
12
|
+
private _warned;
|
|
13
|
+
connectedCallback(): void;
|
|
14
|
+
protected updated(): void;
|
|
15
|
+
/** 返回此主题范围内的浮层挂载点;未设置 appearance 时不创建。 */
|
|
16
|
+
getOverlayRoot(): HTMLElement | undefined;
|
|
17
|
+
/** 当前范围是否应减少动效;`system` 跟随用户的系统偏好。 */
|
|
18
|
+
isReducedMotion(): boolean;
|
|
19
|
+
render(): import('lit').TemplateResult<1>;
|
|
20
|
+
firstUpdated(): void;
|
|
21
|
+
private _hasAppearance;
|
|
22
|
+
private _warnWhenAppearanceIsMissing;
|
|
23
|
+
readonly $events: Record<string, never>;
|
|
24
|
+
}
|
|
25
|
+
declare global {
|
|
26
|
+
interface HTMLElementTagNameMap {
|
|
27
|
+
'web-ui-theme': WebUiTheme;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import e from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
|
|
2
|
+
import { normalizeLiteral as t } from "../../shared/normalize/index.js";
|
|
3
|
+
import { applyOverlayRootStyles as n } from "../../shared/theme/overlay-root.js";
|
|
4
|
+
import r from "./style.js";
|
|
5
|
+
import { LitElement as i, html as a, nothing as o, unsafeCSS as s } from "lit";
|
|
6
|
+
import { customElement as c, property as l } from "lit/decorators.js";
|
|
7
|
+
//#region src/components/theme/index.ts
|
|
8
|
+
var u = [
|
|
9
|
+
"light",
|
|
10
|
+
"dark",
|
|
11
|
+
"system"
|
|
12
|
+
], d = [
|
|
13
|
+
"full",
|
|
14
|
+
"reduced",
|
|
15
|
+
"system"
|
|
16
|
+
], f = class extends i {
|
|
17
|
+
constructor(...e) {
|
|
18
|
+
super(...e), this._motion = "system", this._warned = !1;
|
|
19
|
+
}
|
|
20
|
+
static {
|
|
21
|
+
this.styles = s(r);
|
|
22
|
+
}
|
|
23
|
+
get appearance() {
|
|
24
|
+
return this._appearance;
|
|
25
|
+
}
|
|
26
|
+
set appearance(e) {
|
|
27
|
+
let n = this._appearance;
|
|
28
|
+
this._appearance = e === void 0 ? void 0 : t(e, u, "light"), this.requestUpdate("appearance", n);
|
|
29
|
+
}
|
|
30
|
+
get motion() {
|
|
31
|
+
return this._motion;
|
|
32
|
+
}
|
|
33
|
+
set motion(e) {
|
|
34
|
+
let n = this._motion;
|
|
35
|
+
this._motion = t(e, d, "system"), this.requestUpdate("motion", n);
|
|
36
|
+
}
|
|
37
|
+
connectedCallback() {
|
|
38
|
+
super.connectedCallback(), this._warnWhenAppearanceIsMissing();
|
|
39
|
+
}
|
|
40
|
+
updated() {
|
|
41
|
+
this._warnWhenAppearanceIsMissing();
|
|
42
|
+
}
|
|
43
|
+
getOverlayRoot() {
|
|
44
|
+
if (this._hasAppearance()) return this.renderRoot.querySelector("[data-wui-overlay-container]") ?? void 0;
|
|
45
|
+
}
|
|
46
|
+
isReducedMotion() {
|
|
47
|
+
if (this.motion === "reduced") return !0;
|
|
48
|
+
if (this.motion === "full") return !1;
|
|
49
|
+
try {
|
|
50
|
+
return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
51
|
+
} catch {
|
|
52
|
+
return !1;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
render() {
|
|
56
|
+
return a`<slot></slot>${this._hasAppearance() ? a`<div data-wui-overlay-container></div>` : o}`;
|
|
57
|
+
}
|
|
58
|
+
firstUpdated() {
|
|
59
|
+
this.renderRoot instanceof ShadowRoot && n(this.renderRoot);
|
|
60
|
+
}
|
|
61
|
+
_hasAppearance() {
|
|
62
|
+
return this.appearance !== void 0 && u.includes(this.appearance);
|
|
63
|
+
}
|
|
64
|
+
_warnWhenAppearanceIsMissing() {
|
|
65
|
+
this._hasAppearance() || this._warned;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
e([l({
|
|
69
|
+
type: String,
|
|
70
|
+
reflect: !0
|
|
71
|
+
})], f.prototype, "appearance", null), e([l({
|
|
72
|
+
type: String,
|
|
73
|
+
reflect: !0
|
|
74
|
+
})], f.prototype, "motion", null), f = e([c("web-ui-theme")], f);
|
|
75
|
+
//#endregion
|
|
76
|
+
export { f as WebUiTheme };
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/theme/index.ts"],"sourcesContent":["import { html, LitElement, nothing, unsafeCSS } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { normalizeLiteral } from '@/shared/normalize'\nimport { applyOverlayRootStyles } from '@/shared/theme/overlay-root'\n\nimport style from './style.css?inline'\n\nexport type ThemeAppearance = 'light' | 'dark' | 'system'\nexport type ThemeMotion = 'full' | 'reduced' | 'system'\n\nconst APPEARANCES = ['light', 'dark', 'system'] as const\nconst MOTIONS = ['full', 'reduced', 'system'] as const\n\n@customElement('web-ui-theme')\nexport class WebUiTheme extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: String, reflect: true })\n get appearance(): ThemeAppearance | undefined {\n return this._appearance\n }\n set appearance(v: string | undefined) {\n const old = this._appearance\n this._appearance = v !== undefined ? (normalizeLiteral(v, APPEARANCES, 'light') as ThemeAppearance) : undefined\n this.requestUpdate('appearance', old)\n }\n private _appearance?: ThemeAppearance\n\n @property({ type: String, reflect: true })\n get motion(): ThemeMotion {\n return this._motion\n }\n set motion(v: string) {\n const old = this._motion\n this._motion = normalizeLiteral(v, MOTIONS, 'system') as ThemeMotion\n this.requestUpdate('motion', old)\n }\n private _motion: ThemeMotion = 'system'\n\n private _warned = false\n\n override connectedCallback() {\n super.connectedCallback()\n this._warnWhenAppearanceIsMissing()\n }\n\n protected override updated() {\n this._warnWhenAppearanceIsMissing()\n }\n\n /** 返回此主题范围内的浮层挂载点;未设置 appearance 时不创建。 */\n getOverlayRoot(): HTMLElement | undefined {\n if (!this._hasAppearance()) return undefined\n return this.renderRoot.querySelector<HTMLElement>('[data-wui-overlay-container]') ?? undefined\n }\n\n /** 当前范围是否应减少动效;`system` 跟随用户的系统偏好。 */\n isReducedMotion(): boolean {\n if (this.motion === 'reduced') return true\n if (this.motion === 'full') return false\n\n try {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n } catch {\n return false\n }\n }\n\n override render() {\n return html`<slot></slot>${this._hasAppearance() ? html`<div data-wui-overlay-container></div>` : nothing}`\n }\n\n override firstUpdated() {\n if (this.renderRoot instanceof ShadowRoot) {\n applyOverlayRootStyles(this.renderRoot)\n }\n }\n\n private _hasAppearance(): this is this & { appearance: ThemeAppearance } {\n return this.appearance !== undefined && (APPEARANCES as readonly string[]).includes(this.appearance)\n }\n\n private _warnWhenAppearanceIsMissing() {\n if (this._hasAppearance() || this._warned || !import.meta.env.DEV) return\n this._warned = true\n console.warn('[web-ui-theme] appearance is required; this theme scope is inactive until it is set.')\n }\n\n declare readonly $events: Record<string, never>\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-theme': WebUiTheme\n }\n}\n"],"mappings":";;;;;;;AAWA,IAAM,IAAc;CAAC;CAAS;CAAQ;AAAQ,GACxC,IAAU;CAAC;CAAQ;CAAW;AAAQ,GAG/B,IAAN,cAAyB,EAAW;;EAyBvB,aAFa,KAAA,UAAA,UAEb,KAAA,UAAA;;;EAxBO,KAAA,SAAA,EAAU,CAAK;;CAExC,IACI,aAA0C;EAC5C,OAAO,KAAK;CACd;CACA,IAAI,WAAW,GAAuB;EACpC,IAAM,IAAM,KAAK;EAEjB,AADA,KAAK,cAAc,MAAM,KAAA,IAA6E,KAAA,IAAhE,EAAiB,GAAG,GAAa,OAAO,GAC9E,KAAK,cAAc,cAAc,CAAG;CACtC;CAGA,IACI,SAAsB;EACxB,OAAO,KAAK;CACd;CACA,IAAI,OAAO,GAAW;EACpB,IAAM,IAAM,KAAK;EAEjB,AADA,KAAK,UAAU,EAAiB,GAAG,GAAS,QAAQ,GACpD,KAAK,cAAc,UAAU,CAAG;CAClC;CAKA,oBAA6B;EAE3B,AADA,MAAM,kBAAkB,GACxB,KAAK,6BAA6B;CACpC;CAEA,UAA6B;EAC3B,KAAK,6BAA6B;CACpC;CAGA,iBAA0C;EACnC,SAAK,eAAe,GACzB,OAAO,KAAK,WAAW,cAA2B,8BAA8B,KAAK,KAAA;CACvF;CAGA,kBAA2B;EACzB,IAAI,KAAK,WAAW,WAAW,OAAO;EACtC,IAAI,KAAK,WAAW,QAAQ,OAAO;EAEnC,IAAI;GACF,OAAO,OAAO,WAAW,kCAAkC,CAAC,CAAC;EAC/D,QAAQ;GACN,OAAO;EACT;CACF;CAEA,SAAkB;EAChB,OAAO,CAAI,gBAAgB,KAAK,eAAe,IAAI,CAAI,2CAA2C;CACpG;CAEA,eAAwB;EACtB,AAAI,KAAK,sBAAsB,cAC7B,EAAuB,KAAK,UAAU;CAE1C;CAEA,iBAAyE;EACvE,OAAO,KAAK,eAAe,KAAA,KAAc,EAAkC,SAAS,KAAK,UAAU;CACrG;CAEA,+BAAuC;EACjC,KAAK,eAAe,KAAK,KAAK;CAGpC;AAGF;AAxEG,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,cAAA,IAAA,GAWxC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,IAAA,GAf1C,IAAA,EAAA,CAAA,EAAc,cAAc,CAAA,GAAA,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region src/components/theme/style.css?inline
|
|
2
|
+
var e = "*,:before,:after{box-sizing:border-box}:host{--wui-layer-base:0;--wui-layer-header:10;--wui-layer-auxiliary:20;--wui-layer-local-overlay:1;--wui-layer-menu:100;--wui-layer-menu-submenu:110;--wui-layer-toast:200;--wui-layer-loading:300;--wui-duration-press:.12s;--wui-duration-fast:.16s;--wui-duration-overlay-enter:.18s;--wui-duration-overlay-exit:.14s;--wui-duration-drawer:.28s;--wui-ease-out:cubic-bezier(.23, 1, .32, 1);--wui-ease-standard:cubic-bezier(.77, 0, .175, 1);--wui-scale-press:.97;--wui-scale-enter:.97;display:contents}:host([motion=reduced]){--wui-duration-press:0s;--wui-duration-fast:0s;--wui-duration-overlay-enter:0s;--wui-duration-overlay-exit:0s;--wui-duration-drawer:0s;--wui-scale-press:1;--wui-scale-enter:1}@media (prefers-reduced-motion:reduce){:host([motion=system]){--wui-duration-press:0s;--wui-duration-fast:0s;--wui-duration-overlay-enter:0s;--wui-duration-overlay-exit:0s;--wui-duration-drawer:0s;--wui-scale-press:1;--wui-scale-enter:1}}:host([appearance=light]),:host([appearance=system]){--wui-color-page:#fff;--wui-color-surface:#fff;--wui-color-surface-raised:#f2f2f7;--wui-color-surface-raised-mid:#dfdfdf;--wui-color-surface-raised-deep:#e5e5ea;--wui-color-surface-glass:#fafafa8c;--wui-color-surface-overlay:#f5f5f5d9;--wui-color-text:#1b1b1b;--wui-color-text-muted:#6a6a6a;--wui-color-border:#0000001a;--wui-color-border-strong:#006ee680;--wui-color-glass-border:#33333314;--wui-color-glass-highlight:#ffffffe6;--wui-color-accent:#08f;--wui-color-on-accent:#fff;--wui-color-success:#16a34a;--wui-color-warning:#d97706;--wui-color-danger:#dc2626;--wui-color-info:#2563eb;--wui-color-backdrop:#0000001f;--wui-shadow-overlay:2px 16px 40px #0006;--wui-shadow-pop:0 3px 9px #00000045;--wui-shadow-glass:0 2px 16px #0000000f;--wui-focus-ring:#08f6;--lightningcss-light:initial;--lightningcss-dark: ;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:host([appearance=dark]){--wui-color-page:#18181a;--wui-color-surface:#2c2c2e;--wui-color-surface-raised:#2c2c2e;--wui-color-surface-raised-mid:#3a3a3c;--wui-color-surface-raised-deep:#444446;--wui-color-surface-glass:#2c2c2ea6;--wui-color-surface-overlay:#2c2c2ed1;--wui-color-text:#f5f5f7;--wui-color-text-muted:#a1a1a6;--wui-color-border:#ffffff24;--wui-color-border-strong:#0a84ffb8;--wui-color-glass-border:#ffffff29;--wui-color-glass-highlight:#ffffff38;--wui-color-accent:#0a84ff;--wui-color-on-accent:#fff;--wui-color-success:#30d158;--wui-color-warning:#ff9f0a;--wui-color-danger:#ff453a;--wui-color-info:#64d2ff;--wui-color-backdrop:#0000007a;--wui-shadow-overlay:0 18px 48px #0000008a;--wui-shadow-pop:0 4px 16px #00000059;--wui-shadow-glass:0 8px 24px #00000057;--wui-focus-ring:#0a84ff9e;--lightningcss-light: ;--lightningcss-dark:initial;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@media (prefers-color-scheme:dark){:host([appearance=system]){--wui-color-page:#18181a;--wui-color-surface:#2c2c2e;--wui-color-surface-raised:#2c2c2e;--wui-color-surface-raised-mid:#3a3a3c;--wui-color-surface-raised-deep:#444446;--wui-color-surface-glass:#2c2c2ea6;--wui-color-surface-overlay:#2c2c2ed1;--wui-color-text:#f5f5f7;--wui-color-text-muted:#a1a1a6;--wui-color-border:#ffffff24;--wui-color-border-strong:#0a84ffb8;--wui-color-glass-border:#ffffff29;--wui-color-glass-highlight:#ffffff38;--wui-color-accent:#0a84ff;--wui-color-on-accent:#fff;--wui-color-success:#30d158;--wui-color-warning:#ff9f0a;--wui-color-danger:#ff453a;--wui-color-info:#64d2ff;--wui-color-backdrop:#0000007a;--wui-shadow-overlay:0 18px 48px #0000008a;--wui-shadow-pop:0 4px 16px #00000059;--wui-shadow-glass:0 8px 24px #00000057;--wui-focus-ring:#0a84ff9e;--lightningcss-light: ;--lightningcss-dark:initial;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}";
|
|
3
|
+
//#endregion
|
|
4
|
+
export { e as default };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/theme/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n --wui-layer-base: 0;\n --wui-layer-header: 10;\n --wui-layer-auxiliary: 20;\n --wui-layer-local-overlay: 1;\n --wui-layer-menu: 100;\n --wui-layer-menu-submenu: 110;\n --wui-layer-toast: 200;\n --wui-layer-loading: 300;\n --wui-duration-press: 120ms;\n --wui-duration-fast: 160ms;\n --wui-duration-overlay-enter: 180ms;\n --wui-duration-overlay-exit: 140ms;\n --wui-duration-drawer: 280ms;\n --wui-ease-out: cubic-bezier(0.23, 1, 0.32, 1);\n --wui-ease-standard: cubic-bezier(0.77, 0, 0.175, 1);\n --wui-scale-press: 0.97;\n --wui-scale-enter: 0.97;\n display: contents;\n}\n\n:host([motion='reduced']) {\n --wui-duration-press: 0ms;\n --wui-duration-fast: 0ms;\n --wui-duration-overlay-enter: 0ms;\n --wui-duration-overlay-exit: 0ms;\n --wui-duration-drawer: 0ms;\n --wui-scale-press: 1;\n --wui-scale-enter: 1;\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host([motion='system']) {\n --wui-duration-press: 0ms;\n --wui-duration-fast: 0ms;\n --wui-duration-overlay-enter: 0ms;\n --wui-duration-overlay-exit: 0ms;\n --wui-duration-drawer: 0ms;\n --wui-scale-press: 1;\n --wui-scale-enter: 1;\n }\n}\n\n:host([appearance='light']),\n:host([appearance='system']) {\n --wui-color-page: #fff;\n --wui-color-surface: #fff;\n --wui-color-surface-raised: #f2f2f7;\n --wui-color-surface-raised-mid: #dfdfdf;\n --wui-color-surface-raised-deep: #e5e5ea;\n --wui-color-surface-glass: rgb(250 250 250 / 0.55);\n --wui-color-surface-overlay: rgb(245 245 245 / 0.85);\n --wui-color-text: #1b1b1b;\n --wui-color-text-muted: #6a6a6a;\n --wui-color-border: rgb(0 0 0 / 0.1);\n --wui-color-border-strong: rgb(0 110 230 / 0.5);\n --wui-color-glass-border: rgb(51 51 51 / 0.08);\n --wui-color-glass-highlight: rgb(255 255 255 / 0.9);\n --wui-color-accent: #08f;\n --wui-color-on-accent: #fff;\n --wui-color-success: #16a34a;\n --wui-color-warning: #d97706;\n --wui-color-danger: #dc2626;\n --wui-color-info: #2563eb;\n --wui-color-backdrop: rgb(0 0 0 / 0.12);\n --wui-shadow-overlay: 2px 16px 40px rgb(0 0 0 / 0.4);\n --wui-shadow-pop: 0 3px 9px rgb(0 0 0 / 0.27);\n --wui-shadow-glass: 0 2px 16px rgb(0 0 0 / 0.06);\n --wui-focus-ring: rgb(0 136 255 / 0.4);\n color-scheme: light;\n}\n\n:host([appearance='dark']) {\n --wui-color-page: #18181a;\n --wui-color-surface: #2c2c2e;\n --wui-color-surface-raised: #2c2c2e;\n --wui-color-surface-raised-mid: #3a3a3c;\n --wui-color-surface-raised-deep: #444446;\n --wui-color-surface-glass: rgb(44 44 46 / 0.65);\n --wui-color-surface-overlay: rgb(44 44 46 / 0.82);\n --wui-color-text: #f5f5f7;\n --wui-color-text-muted: #a1a1a6;\n --wui-color-border: rgb(255 255 255 / 0.14);\n --wui-color-border-strong: rgb(10 132 255 / 0.72);\n --wui-color-glass-border: rgb(255 255 255 / 0.16);\n --wui-color-glass-highlight: rgb(255 255 255 / 0.22);\n --wui-color-accent: #0a84ff;\n --wui-color-on-accent: #fff;\n --wui-color-success: #30d158;\n --wui-color-warning: #ff9f0a;\n --wui-color-danger: #ff453a;\n --wui-color-info: #64d2ff;\n --wui-color-backdrop: rgb(0 0 0 / 0.48);\n --wui-shadow-overlay: 0 18px 48px rgb(0 0 0 / 0.54);\n --wui-shadow-pop: 0 4px 16px rgb(0 0 0 / 0.35);\n --wui-shadow-glass: 0 8px 24px rgb(0 0 0 / 0.34);\n --wui-focus-ring: rgb(10 132 255 / 0.62);\n color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n :host([appearance='system']) {\n --wui-color-page: #18181a;\n --wui-color-surface: #2c2c2e;\n --wui-color-surface-raised: #2c2c2e;\n --wui-color-surface-raised-mid: #3a3a3c;\n --wui-color-surface-raised-deep: #444446;\n --wui-color-surface-glass: rgb(44 44 46 / 0.65);\n --wui-color-surface-overlay: rgb(44 44 46 / 0.82);\n --wui-color-text: #f5f5f7;\n --wui-color-text-muted: #a1a1a6;\n --wui-color-border: rgb(255 255 255 / 0.14);\n --wui-color-border-strong: rgb(10 132 255 / 0.72);\n --wui-color-glass-border: rgb(255 255 255 / 0.16);\n --wui-color-glass-highlight: rgb(255 255 255 / 0.22);\n --wui-color-accent: #0a84ff;\n --wui-color-on-accent: #fff;\n --wui-color-success: #30d158;\n --wui-color-warning: #ff9f0a;\n --wui-color-danger: #ff453a;\n --wui-color-info: #64d2ff;\n --wui-color-backdrop: rgb(0 0 0 / 0.48);\n --wui-shadow-overlay: 0 18px 48px rgb(0 0 0 / 0.54);\n --wui-shadow-pop: 0 4px 16px rgb(0 0 0 / 0.35);\n --wui-shadow-glass: 0 8px 24px rgb(0 0 0 / 0.34);\n --wui-focus-ring: rgb(10 132 255 / 0.62);\n color-scheme: dark;\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ToastInstanceOptions, ToastMessageUpdateOptions, ToastOptions } from './types';
|
|
2
|
+
type ToastShortcutOptions = Omit<ToastOptions, 'message' | 'type'> & Pick<ToastInstanceOptions, 'position'>;
|
|
3
|
+
declare function toast(options: ToastInstanceOptions): string;
|
|
4
|
+
declare namespace toast {
|
|
5
|
+
var success: (message: string, options?: ToastShortcutOptions) => string;
|
|
6
|
+
var info: (message: string, options?: ToastShortcutOptions) => string;
|
|
7
|
+
var warning: (message: string, options?: ToastShortcutOptions) => string;
|
|
8
|
+
var error: (message: string, options?: ToastShortcutOptions) => string;
|
|
9
|
+
var close: (id: string) => void;
|
|
10
|
+
var clear: () => void;
|
|
11
|
+
var updateMessage: (id: string, options: ToastMessageUpdateOptions) => void;
|
|
12
|
+
var _visibleCount: () => number;
|
|
13
|
+
var _reset: () => void;
|
|
14
|
+
}
|
|
15
|
+
export { toast };
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { getFallbackOverlayRoot as e } from "../../shared/theme/overlay-root.js";
|
|
2
|
+
import { findNearestTheme as t, findRootTheme as n } from "../../shared/theme/theme-scope.js";
|
|
3
|
+
//#region src/components/toast/manager.ts
|
|
4
|
+
var r = 0, i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Map(), o, s = !1;
|
|
5
|
+
function c() {
|
|
6
|
+
return `toast-${++r}`;
|
|
7
|
+
}
|
|
8
|
+
function l(e, t) {
|
|
9
|
+
let n = Array.from(t.children).find((t) => t instanceof HTMLElement && t.dataset.wuiToastPosition === e);
|
|
10
|
+
if (n) return n;
|
|
11
|
+
let r = document.createElement("div");
|
|
12
|
+
return r.className = `wui-toast-container wui-toast-${e}`, r.dataset.wuiToastPosition = e, r.setAttribute("role", "log"), r.setAttribute("aria-live", "polite"), r.setAttribute("aria-relevant", "additions"), t.appendChild(r), i.add(r), r.addEventListener("pointerenter", () => r.dataset.hovered = "true"), r.addEventListener("pointerleave", () => {
|
|
13
|
+
delete r.dataset.hovered, u(r);
|
|
14
|
+
}), r;
|
|
15
|
+
}
|
|
16
|
+
function u(e) {
|
|
17
|
+
e.dataset.hovered !== "true" && requestAnimationFrame(() => {
|
|
18
|
+
e.scrollTop = e.scrollHeight;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function d() {
|
|
22
|
+
s || (s = !0, Promise.resolve().then(f));
|
|
23
|
+
}
|
|
24
|
+
function f() {
|
|
25
|
+
s = !1;
|
|
26
|
+
let e = o;
|
|
27
|
+
if (o = void 0, !e) return;
|
|
28
|
+
let t = /* @__PURE__ */ new Set();
|
|
29
|
+
for (let n of e) m(n.id, n.options, n.container), t.add(n.container);
|
|
30
|
+
for (let e of t) u(e);
|
|
31
|
+
}
|
|
32
|
+
function p(r) {
|
|
33
|
+
let i = r.id || c();
|
|
34
|
+
if (a.has(i)) return i;
|
|
35
|
+
let s = r.position || "top-right", u = r.target ? t(r.target) : n(), f = l(s, r.container ?? u?.getOverlayRoot() ?? e());
|
|
36
|
+
return o ||= [], o.push({
|
|
37
|
+
id: i,
|
|
38
|
+
options: r,
|
|
39
|
+
container: f
|
|
40
|
+
}), d(), i;
|
|
41
|
+
}
|
|
42
|
+
function m(e, t, n) {
|
|
43
|
+
let r = document.createElement("web-ui-toast");
|
|
44
|
+
r.toastId = e, r.type = t.type || "info", r.position = t.position || "top-right", r.heading = t.heading || "", r.message = t.message, r.duration = t.duration ?? 3e3, r.closable = t.closable ?? !0, r.addEventListener("toast-close", (e) => {
|
|
45
|
+
let t = e.detail;
|
|
46
|
+
h(t.id);
|
|
47
|
+
}), n.appendChild(r), a.set(e, r), requestAnimationFrame(() => r.show());
|
|
48
|
+
}
|
|
49
|
+
function h(e) {
|
|
50
|
+
let t = a.get(e);
|
|
51
|
+
t && (t.remove(), a.delete(e));
|
|
52
|
+
}
|
|
53
|
+
function g(e) {
|
|
54
|
+
a.get(e)?.dismiss("programmatic");
|
|
55
|
+
}
|
|
56
|
+
function _() {
|
|
57
|
+
for (let e of a.values()) e.dismiss("clear");
|
|
58
|
+
}
|
|
59
|
+
function v(e, t) {
|
|
60
|
+
let n = a.get(e);
|
|
61
|
+
if (n) {
|
|
62
|
+
n.message = t.message, t.heading !== void 0 && (n.heading = t.heading);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
let r = o?.find((t) => t.id === e);
|
|
66
|
+
r && (r.options.message = t.message, t.heading !== void 0 && (r.options.heading = t.heading));
|
|
67
|
+
}
|
|
68
|
+
function y(e) {
|
|
69
|
+
return p(e);
|
|
70
|
+
}
|
|
71
|
+
y.success = (e, t) => p({
|
|
72
|
+
...t,
|
|
73
|
+
message: e,
|
|
74
|
+
type: "success"
|
|
75
|
+
}), y.info = (e, t) => p({
|
|
76
|
+
...t,
|
|
77
|
+
message: e,
|
|
78
|
+
type: "info"
|
|
79
|
+
}), y.warning = (e, t) => p({
|
|
80
|
+
...t,
|
|
81
|
+
message: e,
|
|
82
|
+
type: "warning"
|
|
83
|
+
}), y.error = (e, t) => p({
|
|
84
|
+
...t,
|
|
85
|
+
message: e,
|
|
86
|
+
type: "error",
|
|
87
|
+
duration: t?.duration ?? 5e3
|
|
88
|
+
}), y.close = g, y.clear = _, y.updateMessage = v, y._visibleCount = () => a.size, y._reset = () => {
|
|
89
|
+
o = void 0, s = !1;
|
|
90
|
+
for (let e of a.values()) e.remove();
|
|
91
|
+
a.clear();
|
|
92
|
+
for (let e of i) e.remove();
|
|
93
|
+
i.clear();
|
|
94
|
+
};
|
|
95
|
+
//#endregion
|
|
96
|
+
export { y as toast };
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=manager.js.map
|