@greypan/web-ui 11.2.0 → 12.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 +79 -68
- package/README.md +81 -72
- package/dist/_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js +8 -0
- package/dist/assets/menu-portal.js +3 -4
- package/dist/assets/menu-portal.js.map +1 -1
- package/dist/assets/modal-surface.js +3 -4
- package/dist/assets/modal-surface.js.map +1 -1
- package/dist/assets/overlay-motion.js +3 -4
- package/dist/assets/overlay-motion.js.map +1 -1
- package/dist/assets/scrollbar.js +5 -0
- package/dist/assets/scrollbar.js.map +1 -0
- package/dist/assets/selection-control.js +3 -4
- package/dist/assets/selection-control.js.map +1 -1
- package/dist/assets/toast-containers.js +3 -4
- package/dist/assets/toast-containers.js.map +1 -1
- package/dist/classes/glass.js +3 -4
- package/dist/classes/glass.js.map +1 -1
- package/dist/classes/glow.js +3 -4
- package/dist/classes/glow.js.map +1 -1
- package/dist/components/autocomplete/index.d.ts +485 -483
- package/dist/components/autocomplete/index.d.ts.map +1 -0
- package/dist/components/autocomplete/index.js +475 -267
- package/dist/components/autocomplete/index.js.map +1 -1
- package/dist/components/autocomplete/style.js +3 -4
- package/dist/components/autocomplete/style.js.map +1 -1
- package/dist/components/avatar/index.d.ts +26 -24
- package/dist/components/avatar/index.d.ts.map +1 -0
- package/dist/components/avatar/index.js +72 -52
- package/dist/components/avatar/index.js.map +1 -1
- package/dist/components/avatar/style.js +3 -4
- package/dist/components/avatar/style.js.map +1 -1
- package/dist/components/back-top/index.d.ts +30 -27
- package/dist/components/back-top/index.d.ts.map +1 -0
- package/dist/components/back-top/index.js +96 -62
- package/dist/components/back-top/index.js.map +1 -1
- package/dist/components/back-top/style.js +3 -4
- package/dist/components/back-top/style.js.map +1 -1
- package/dist/components/badge/index.d.ts +32 -26
- package/dist/components/badge/index.d.ts.map +1 -0
- package/dist/components/badge/index.js +116 -74
- package/dist/components/badge/index.js.map +1 -1
- package/dist/components/badge/style.js +3 -4
- package/dist/components/badge/style.js.map +1 -1
- package/dist/components/button/index.d.ts +392 -390
- package/dist/components/button/index.d.ts.map +1 -0
- package/dist/components/button/index.js +108 -74
- package/dist/components/button/index.js.map +1 -1
- package/dist/components/button/style.js +3 -4
- package/dist/components/button/style.js.map +1 -1
- package/dist/components/button-group/index.d.ts +14 -13
- package/dist/components/button-group/index.d.ts.map +1 -0
- package/dist/components/button-group/index.js +43 -33
- package/dist/components/button-group/index.js.map +1 -1
- package/dist/components/button-group/style.js +3 -4
- package/dist/components/button-group/style.js.map +1 -1
- package/dist/components/checkbox/index.d.ts +399 -397
- package/dist/components/checkbox/index.d.ts.map +1 -0
- package/dist/components/checkbox/index.js +103 -74
- package/dist/components/checkbox/index.js.map +1 -1
- package/dist/components/checkbox/style.js +3 -4
- package/dist/components/checkbox/style.js.map +1 -1
- package/dist/components/checkbox-group/index.d.ts +397 -396
- package/dist/components/checkbox-group/index.d.ts.map +1 -0
- package/dist/components/checkbox-group/index.js +92 -70
- package/dist/components/checkbox-group/index.js.map +1 -1
- package/dist/components/checkbox-group/style.js +3 -4
- package/dist/components/checkbox-group/style.js.map +1 -1
- package/dist/components/collapse/index.d.ts +72 -71
- package/dist/components/collapse/index.d.ts.map +1 -0
- package/dist/components/collapse/index.js +225 -130
- package/dist/components/collapse/index.js.map +1 -1
- package/dist/components/collapse/style.js +3 -4
- package/dist/components/collapse/style.js.map +1 -1
- package/dist/components/context-menu/index.d.ts +307 -310
- package/dist/components/context-menu/index.d.ts.map +1 -0
- package/dist/components/context-menu/index.js +685 -270
- package/dist/components/context-menu/index.js.map +1 -1
- package/dist/components/context-menu/scrim.js +3 -4
- package/dist/components/context-menu/scrim.js.map +1 -1
- package/dist/components/context-menu/style.js +3 -4
- package/dist/components/context-menu/style.js.map +1 -1
- package/dist/components/dialog/index.d.ts +87 -78
- package/dist/components/dialog/index.d.ts.map +1 -0
- package/dist/components/dialog/index.js +183 -88
- package/dist/components/dialog/index.js.map +1 -1
- package/dist/components/dialog/style.js +3 -4
- package/dist/components/dialog/style.js.map +1 -1
- package/dist/components/drawer/index.d.ts +159 -150
- package/dist/components/drawer/index.d.ts.map +1 -0
- package/dist/components/drawer/index.js +503 -242
- package/dist/components/drawer/index.js.map +1 -1
- package/dist/components/drawer/style.js +3 -4
- package/dist/components/drawer/style.js.map +1 -1
- package/dist/components/dropdown/index.d.ts +125 -124
- package/dist/components/dropdown/index.d.ts.map +1 -0
- package/dist/components/dropdown/index.js +556 -328
- package/dist/components/dropdown/index.js.map +1 -1
- package/dist/components/dropdown/style.js +3 -4
- package/dist/components/dropdown/style.js.map +1 -1
- package/dist/components/dropdown-divider/index.d.ts +7 -6
- package/dist/components/dropdown-divider/index.d.ts.map +1 -0
- package/dist/components/dropdown-divider/index.js +10 -11
- package/dist/components/dropdown-divider/index.js.map +1 -1
- package/dist/components/dropdown-divider/style.js +3 -4
- package/dist/components/dropdown-divider/style.js.map +1 -1
- package/dist/components/dropdown-header/index.d.ts +7 -6
- package/dist/components/dropdown-header/index.d.ts.map +1 -0
- package/dist/components/dropdown-header/index.js +10 -11
- package/dist/components/dropdown-header/index.js.map +1 -1
- package/dist/components/dropdown-header/style.js +3 -4
- package/dist/components/dropdown-header/style.js.map +1 -1
- package/dist/components/dropdown-item/index.d.ts +13 -11
- package/dist/components/dropdown-item/index.d.ts.map +1 -0
- package/dist/components/dropdown-item/index.js +32 -25
- package/dist/components/dropdown-item/index.js.map +1 -1
- package/dist/components/dropdown-item/style.js +3 -4
- package/dist/components/dropdown-item/style.js.map +1 -1
- package/dist/components/editable-text/index.d.ts +506 -505
- package/dist/components/editable-text/index.d.ts.map +1 -0
- package/dist/components/editable-text/index.js +281 -127
- package/dist/components/editable-text/index.js.map +1 -1
- package/dist/components/editable-text/style.js +3 -4
- package/dist/components/editable-text/style.js.map +1 -1
- package/dist/components/empty/index.d.ts +17 -15
- package/dist/components/empty/index.d.ts.map +1 -0
- package/dist/components/empty/index.js +66 -37
- package/dist/components/empty/index.js.map +1 -1
- package/dist/components/empty/style.js +3 -4
- package/dist/components/empty/style.js.map +1 -1
- package/dist/components/icon/index.d.ts +12 -11
- package/dist/components/icon/index.d.ts.map +1 -0
- package/dist/components/icon/index.js +34 -27
- package/dist/components/icon/index.js.map +1 -1
- package/dist/components/icon/style.js +3 -4
- package/dist/components/icon/style.js.map +1 -1
- package/dist/components/image-preview/index.d.ts +58 -44
- package/dist/components/image-preview/index.d.ts.map +1 -0
- package/dist/components/image-preview/index.js +536 -265
- package/dist/components/image-preview/index.js.map +1 -1
- package/dist/components/image-preview/style.js +3 -4
- package/dist/components/image-preview/style.js.map +1 -1
- package/dist/components/index.d.ts +46 -43
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +41 -41
- package/dist/components/input/index.d.ts +418 -413
- package/dist/components/input/index.d.ts.map +1 -0
- package/dist/components/input/index.js +148 -84
- package/dist/components/input/index.js.map +1 -1
- package/dist/components/input/style.js +3 -4
- package/dist/components/input/style.js.map +1 -1
- package/dist/components/input-number/index.d.ts +453 -447
- package/dist/components/input-number/index.d.ts.map +1 -0
- package/dist/components/input-number/index.js +484 -292
- package/dist/components/input-number/index.js.map +1 -1
- package/dist/components/input-number/style.js +3 -4
- package/dist/components/input-number/style.js.map +1 -1
- package/dist/components/layout/index.d.ts +110 -87
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/index.js +238 -144
- package/dist/components/layout/index.js.map +1 -1
- package/dist/components/layout/style.js +3 -4
- package/dist/components/layout/style.js.map +1 -1
- package/dist/components/middle-ellipsis/index.d.ts +93 -92
- package/dist/components/middle-ellipsis/index.d.ts.map +1 -0
- package/dist/components/middle-ellipsis/index.js +261 -107
- package/dist/components/middle-ellipsis/index.js.map +1 -1
- package/dist/components/middle-ellipsis/style.js +3 -4
- package/dist/components/middle-ellipsis/style.js.map +1 -1
- package/dist/components/middle-ellipsis/truncate.js +60 -30
- package/dist/components/middle-ellipsis/truncate.js.map +1 -1
- package/dist/components/option/index.d.ts +20 -18
- package/dist/components/option/index.d.ts.map +1 -0
- package/dist/components/option/index.js +53 -40
- package/dist/components/option/index.js.map +1 -1
- package/dist/components/option/style.js +3 -4
- package/dist/components/option/style.js.map +1 -1
- package/dist/components/popover/index.d.ts +69 -68
- package/dist/components/popover/index.d.ts.map +1 -0
- package/dist/components/popover/index.js +221 -104
- package/dist/components/popover/index.js.map +1 -1
- package/dist/components/popover/style.js +3 -4
- package/dist/components/popover/style.js.map +1 -1
- package/dist/components/radio/index.d.ts +396 -395
- package/dist/components/radio/index.d.ts.map +1 -0
- package/dist/components/radio/index.js +91 -62
- package/dist/components/radio/index.js.map +1 -1
- package/dist/components/radio/interaction.js +10 -11
- package/dist/components/radio/interaction.js.map +1 -1
- package/dist/components/radio/style.js +3 -4
- package/dist/components/radio/style.js.map +1 -1
- package/dist/components/radio-group/index.d.ts +417 -416
- package/dist/components/radio-group/index.d.ts.map +1 -0
- package/dist/components/radio-group/index.js +307 -207
- package/dist/components/radio-group/index.js.map +1 -1
- package/dist/components/radio-group/style.js +3 -4
- package/dist/components/radio-group/style.js.map +1 -1
- package/dist/components/segmented/index.d.ts +408 -402
- package/dist/components/segmented/index.d.ts.map +1 -0
- package/dist/components/segmented/index.js +267 -158
- package/dist/components/segmented/index.js.map +1 -1
- package/dist/components/segmented/style.js +3 -4
- package/dist/components/segmented/style.js.map +1 -1
- package/dist/components/segmented-trigger/index.d.ts +18 -17
- package/dist/components/segmented-trigger/index.d.ts.map +1 -0
- package/dist/components/segmented-trigger/index.js +45 -36
- package/dist/components/segmented-trigger/index.js.map +1 -1
- package/dist/components/segmented-trigger/style.js +3 -4
- package/dist/components/segmented-trigger/style.js.map +1 -1
- package/dist/components/select/index.d.ts +450 -448
- package/dist/components/select/index.d.ts.map +1 -0
- package/dist/components/select/index.js +342 -188
- package/dist/components/select/index.js.map +1 -1
- package/dist/components/select/style.js +3 -4
- package/dist/components/select/style.js.map +1 -1
- package/dist/components/slider/index.d.ts +428 -427
- package/dist/components/slider/index.d.ts.map +1 -0
- package/dist/components/slider/index.js +308 -216
- package/dist/components/slider/index.js.map +1 -1
- package/dist/components/slider/style.js +3 -4
- package/dist/components/slider/style.js.map +1 -1
- package/dist/components/spinner/index.d.ts +39 -38
- package/dist/components/spinner/index.d.ts.map +1 -0
- package/dist/components/spinner/index.js +118 -65
- package/dist/components/spinner/index.js.map +1 -1
- package/dist/components/spinner/style.js +3 -4
- package/dist/components/spinner/style.js.map +1 -1
- package/dist/components/svg-draw-lines/index.d.ts +40 -39
- package/dist/components/svg-draw-lines/index.d.ts.map +1 -0
- package/dist/components/svg-draw-lines/index.js +189 -106
- package/dist/components/svg-draw-lines/index.js.map +1 -1
- package/dist/components/svg-draw-lines/style.js +3 -4
- package/dist/components/svg-draw-lines/style.js.map +1 -1
- package/dist/components/switch/index.d.ts +411 -409
- package/dist/components/switch/index.d.ts.map +1 -0
- package/dist/components/switch/index.js +193 -106
- package/dist/components/switch/index.js.map +1 -1
- package/dist/components/switch/style.js +3 -4
- package/dist/components/switch/style.js.map +1 -1
- package/dist/components/textarea/index.d.ts +430 -425
- package/dist/components/textarea/index.d.ts.map +1 -0
- package/dist/components/textarea/index.js +187 -100
- package/dist/components/textarea/index.js.map +1 -1
- package/dist/components/textarea/style.js +3 -4
- package/dist/components/textarea/style.js.map +1 -1
- package/dist/components/theme/index.d.ts +45 -44
- package/dist/components/theme/index.d.ts.map +1 -0
- package/dist/components/theme/index.js +268 -161
- package/dist/components/theme/index.js.map +1 -1
- package/dist/components/theme/style.js +3 -4
- package/dist/components/theme/style.js.map +1 -1
- package/dist/components/toast/index.d.ts +4 -3
- package/dist/components/toast/index.js +3 -3
- package/dist/components/toast/manager.d.ts +9 -8
- package/dist/components/toast/manager.d.ts.map +1 -0
- package/dist/components/toast/manager.js +215 -119
- package/dist/components/toast/manager.js.map +1 -1
- package/dist/components/toast/style.js +3 -4
- package/dist/components/toast/style.js.map +1 -1
- package/dist/components/toast/toast.d.ts +75 -71
- package/dist/components/toast/toast.d.ts.map +1 -0
- package/dist/components/toast/toast.js +203 -96
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/toast/types.d.ts +10 -9
- package/dist/components/toast/types.d.ts.map +1 -0
- package/dist/components/tooltip/index.d.ts +72 -62
- package/dist/components/tooltip/index.d.ts.map +1 -0
- package/dist/components/tooltip/index.js +251 -93
- package/dist/components/tooltip/index.js.map +1 -1
- package/dist/components/tooltip/style.js +3 -4
- package/dist/components/tooltip/style.js.map +1 -1
- package/dist/icons/generated/akar-icons-check.d.ts +5 -4
- package/dist/icons/generated/akar-icons-check.d.ts.map +1 -0
- package/dist/icons/generated/akar-icons-check.js +3 -4
- package/dist/icons/generated/akar-icons-check.js.map +1 -1
- package/dist/icons/generated/akar-icons-circle-check.d.ts +5 -4
- package/dist/icons/generated/akar-icons-circle-check.d.ts.map +1 -0
- package/dist/icons/generated/akar-icons-circle-check.js +3 -4
- package/dist/icons/generated/akar-icons-circle-check.js.map +1 -1
- package/dist/icons/generated/andrsrxn-inbox.d.ts +5 -4
- package/dist/icons/generated/andrsrxn-inbox.d.ts.map +1 -0
- package/dist/icons/generated/andrsrxn-inbox.js +3 -4
- package/dist/icons/generated/andrsrxn-inbox.js.map +1 -1
- package/dist/icons/generated/bi-check-lg.d.ts +5 -4
- package/dist/icons/generated/bi-check-lg.d.ts.map +1 -0
- package/dist/icons/generated/bi-check-lg.js +3 -4
- package/dist/icons/generated/bi-check-lg.js.map +1 -1
- package/dist/icons/generated/bi-check.d.ts +5 -4
- package/dist/icons/generated/bi-check.d.ts.map +1 -0
- package/dist/icons/generated/bi-check.js +3 -4
- package/dist/icons/generated/bi-check.js.map +1 -1
- package/dist/icons/generated/fluent-tag-search-24-regular.d.ts +5 -4
- package/dist/icons/generated/fluent-tag-search-24-regular.d.ts.map +1 -0
- package/dist/icons/generated/fluent-tag-search-24-regular.js +3 -4
- package/dist/icons/generated/fluent-tag-search-24-regular.js.map +1 -1
- package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.d.ts +5 -4
- package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.d.ts.map +1 -0
- package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js +3 -4
- package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js.map +1 -1
- package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.d.ts +5 -4
- package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.d.ts.map +1 -0
- package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js +3 -4
- package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js.map +1 -1
- package/dist/icons/generated/heroicons-check-16-solid.d.ts +5 -4
- package/dist/icons/generated/heroicons-check-16-solid.d.ts.map +1 -0
- package/dist/icons/generated/heroicons-check-16-solid.js +3 -4
- package/dist/icons/generated/heroicons-check-16-solid.js.map +1 -1
- package/dist/icons/generated/heroicons-x-mark-16-solid.d.ts +5 -4
- package/dist/icons/generated/heroicons-x-mark-16-solid.d.ts.map +1 -0
- package/dist/icons/generated/heroicons-x-mark-16-solid.js +3 -4
- package/dist/icons/generated/heroicons-x-mark-16-solid.js.map +1 -1
- package/dist/icons/generated/jam-close-circle-f.d.ts +7 -6
- package/dist/icons/generated/jam-close-circle-f.d.ts.map +1 -0
- package/dist/icons/generated/jam-close-circle-f.js +3 -4
- package/dist/icons/generated/jam-close-circle-f.js.map +1 -1
- package/dist/icons/generated/lucide-arrow-down-to-line.d.ts +5 -4
- package/dist/icons/generated/lucide-arrow-down-to-line.d.ts.map +1 -0
- package/dist/icons/generated/lucide-arrow-down-to-line.js +3 -4
- package/dist/icons/generated/lucide-arrow-down-to-line.js.map +1 -1
- package/dist/icons/generated/lucide-arrow-up-to-line.d.ts +5 -4
- package/dist/icons/generated/lucide-arrow-up-to-line.d.ts.map +1 -0
- package/dist/icons/generated/lucide-arrow-up-to-line.js +3 -4
- package/dist/icons/generated/lucide-arrow-up-to-line.js.map +1 -1
- package/dist/icons/generated/lucide-bell.d.ts +5 -4
- package/dist/icons/generated/lucide-bell.d.ts.map +1 -0
- package/dist/icons/generated/lucide-bell.js +3 -4
- package/dist/icons/generated/lucide-bell.js.map +1 -1
- package/dist/icons/generated/lucide-check.d.ts +5 -4
- package/dist/icons/generated/lucide-check.d.ts.map +1 -0
- package/dist/icons/generated/lucide-check.js +3 -4
- package/dist/icons/generated/lucide-check.js.map +1 -1
- package/dist/icons/generated/lucide-chevron-down.d.ts +5 -4
- package/dist/icons/generated/lucide-chevron-down.d.ts.map +1 -0
- package/dist/icons/generated/lucide-chevron-down.js +3 -4
- package/dist/icons/generated/lucide-chevron-down.js.map +1 -1
- package/dist/icons/generated/lucide-chevron-left.d.ts +5 -4
- package/dist/icons/generated/lucide-chevron-left.d.ts.map +1 -0
- package/dist/icons/generated/lucide-chevron-left.js +3 -4
- package/dist/icons/generated/lucide-chevron-left.js.map +1 -1
- package/dist/icons/generated/lucide-chevron-right.d.ts +5 -4
- package/dist/icons/generated/lucide-chevron-right.d.ts.map +1 -0
- package/dist/icons/generated/lucide-chevron-right.js +3 -4
- package/dist/icons/generated/lucide-chevron-right.js.map +1 -1
- package/dist/icons/generated/lucide-chevron-up.d.ts +5 -4
- package/dist/icons/generated/lucide-chevron-up.d.ts.map +1 -0
- package/dist/icons/generated/lucide-chevron-up.js +3 -4
- package/dist/icons/generated/lucide-chevron-up.js.map +1 -1
- package/dist/icons/generated/lucide-circle-alert.d.ts +5 -4
- package/dist/icons/generated/lucide-circle-alert.d.ts.map +1 -0
- package/dist/icons/generated/lucide-circle-alert.js +3 -4
- package/dist/icons/generated/lucide-circle-alert.js.map +1 -1
- package/dist/icons/generated/lucide-clapperboard.d.ts +5 -4
- package/dist/icons/generated/lucide-clapperboard.d.ts.map +1 -0
- package/dist/icons/generated/lucide-clapperboard.js +3 -4
- package/dist/icons/generated/lucide-clapperboard.js.map +1 -1
- package/dist/icons/generated/lucide-clipboard-paste.d.ts +5 -4
- package/dist/icons/generated/lucide-clipboard-paste.d.ts.map +1 -0
- package/dist/icons/generated/lucide-clipboard-paste.js +3 -4
- package/dist/icons/generated/lucide-clipboard-paste.js.map +1 -1
- package/dist/icons/generated/lucide-code.d.ts +5 -4
- package/dist/icons/generated/lucide-code.d.ts.map +1 -0
- package/dist/icons/generated/lucide-code.js +3 -4
- package/dist/icons/generated/lucide-code.js.map +1 -1
- package/dist/icons/generated/lucide-copy.d.ts +5 -4
- package/dist/icons/generated/lucide-copy.d.ts.map +1 -0
- package/dist/icons/generated/lucide-copy.js +3 -4
- package/dist/icons/generated/lucide-copy.js.map +1 -1
- package/dist/icons/generated/lucide-download.d.ts +5 -4
- package/dist/icons/generated/lucide-download.d.ts.map +1 -0
- package/dist/icons/generated/lucide-download.js +3 -4
- package/dist/icons/generated/lucide-download.js.map +1 -1
- package/dist/icons/generated/lucide-ellipsis-vertical.d.ts +5 -4
- package/dist/icons/generated/lucide-ellipsis-vertical.d.ts.map +1 -0
- package/dist/icons/generated/lucide-ellipsis-vertical.js +3 -4
- package/dist/icons/generated/lucide-ellipsis-vertical.js.map +1 -1
- package/dist/icons/generated/lucide-external-link.d.ts +5 -4
- package/dist/icons/generated/lucide-external-link.d.ts.map +1 -0
- package/dist/icons/generated/lucide-external-link.js +3 -4
- package/dist/icons/generated/lucide-external-link.js.map +1 -1
- package/dist/icons/generated/lucide-eye.d.ts +5 -4
- package/dist/icons/generated/lucide-eye.d.ts.map +1 -0
- package/dist/icons/generated/lucide-eye.js +3 -4
- package/dist/icons/generated/lucide-eye.js.map +1 -1
- package/dist/icons/generated/lucide-file-text.d.ts +5 -4
- package/dist/icons/generated/lucide-file-text.d.ts.map +1 -0
- package/dist/icons/generated/lucide-file-text.js +3 -4
- package/dist/icons/generated/lucide-file-text.js.map +1 -1
- package/dist/icons/generated/lucide-file.d.ts +5 -4
- package/dist/icons/generated/lucide-file.d.ts.map +1 -0
- package/dist/icons/generated/lucide-file.js +3 -4
- package/dist/icons/generated/lucide-file.js.map +1 -1
- package/dist/icons/generated/lucide-film.d.ts +5 -4
- package/dist/icons/generated/lucide-film.d.ts.map +1 -0
- package/dist/icons/generated/lucide-film.js +3 -4
- package/dist/icons/generated/lucide-film.js.map +1 -1
- package/dist/icons/generated/lucide-folder-open.d.ts +5 -4
- package/dist/icons/generated/lucide-folder-open.d.ts.map +1 -0
- package/dist/icons/generated/lucide-folder-open.js +3 -4
- package/dist/icons/generated/lucide-folder-open.js.map +1 -1
- package/dist/icons/generated/lucide-folder.d.ts +5 -4
- package/dist/icons/generated/lucide-folder.d.ts.map +1 -0
- package/dist/icons/generated/lucide-folder.js +3 -4
- package/dist/icons/generated/lucide-folder.js.map +1 -1
- package/dist/icons/generated/lucide-globe.d.ts +5 -4
- package/dist/icons/generated/lucide-globe.d.ts.map +1 -0
- package/dist/icons/generated/lucide-globe.js +3 -4
- package/dist/icons/generated/lucide-globe.js.map +1 -1
- package/dist/icons/generated/lucide-headphones.d.ts +5 -4
- package/dist/icons/generated/lucide-headphones.d.ts.map +1 -0
- package/dist/icons/generated/lucide-headphones.js +3 -4
- package/dist/icons/generated/lucide-headphones.js.map +1 -1
- package/dist/icons/generated/lucide-heart.d.ts +5 -4
- package/dist/icons/generated/lucide-heart.d.ts.map +1 -0
- package/dist/icons/generated/lucide-heart.js +3 -4
- package/dist/icons/generated/lucide-heart.js.map +1 -1
- package/dist/icons/generated/lucide-image.d.ts +5 -4
- package/dist/icons/generated/lucide-image.d.ts.map +1 -0
- package/dist/icons/generated/lucide-image.js +3 -4
- package/dist/icons/generated/lucide-image.js.map +1 -1
- package/dist/icons/generated/lucide-inbox.d.ts +5 -4
- package/dist/icons/generated/lucide-inbox.d.ts.map +1 -0
- package/dist/icons/generated/lucide-inbox.js +3 -4
- package/dist/icons/generated/lucide-inbox.js.map +1 -1
- package/dist/icons/generated/lucide-info.d.ts +5 -4
- package/dist/icons/generated/lucide-info.d.ts.map +1 -0
- package/dist/icons/generated/lucide-info.js +3 -4
- package/dist/icons/generated/lucide-info.js.map +1 -1
- package/dist/icons/generated/lucide-layout-grid.d.ts +5 -4
- package/dist/icons/generated/lucide-layout-grid.d.ts.map +1 -0
- package/dist/icons/generated/lucide-layout-grid.js +3 -4
- package/dist/icons/generated/lucide-layout-grid.js.map +1 -1
- package/dist/icons/generated/lucide-link.d.ts +5 -4
- package/dist/icons/generated/lucide-link.d.ts.map +1 -0
- package/dist/icons/generated/lucide-link.js +3 -4
- package/dist/icons/generated/lucide-link.js.map +1 -1
- package/dist/icons/generated/lucide-list-filter.d.ts +5 -4
- package/dist/icons/generated/lucide-list-filter.d.ts.map +1 -0
- package/dist/icons/generated/lucide-list-filter.js +3 -4
- package/dist/icons/generated/lucide-list-filter.js.map +1 -1
- package/dist/icons/generated/lucide-list-restart.d.ts +5 -4
- package/dist/icons/generated/lucide-list-restart.d.ts.map +1 -0
- package/dist/icons/generated/lucide-list-restart.js +3 -4
- package/dist/icons/generated/lucide-list-restart.js.map +1 -1
- package/dist/icons/generated/lucide-loader-circle.d.ts +5 -4
- package/dist/icons/generated/lucide-loader-circle.d.ts.map +1 -0
- package/dist/icons/generated/lucide-loader-circle.js +3 -4
- package/dist/icons/generated/lucide-loader-circle.js.map +1 -1
- package/dist/icons/generated/lucide-mail.d.ts +5 -4
- package/dist/icons/generated/lucide-mail.d.ts.map +1 -0
- package/dist/icons/generated/lucide-mail.js +3 -4
- package/dist/icons/generated/lucide-mail.js.map +1 -1
- package/dist/icons/generated/lucide-minus.d.ts +5 -4
- package/dist/icons/generated/lucide-minus.d.ts.map +1 -0
- package/dist/icons/generated/lucide-minus.js +3 -4
- package/dist/icons/generated/lucide-minus.js.map +1 -1
- package/dist/icons/generated/lucide-music.d.ts +5 -4
- package/dist/icons/generated/lucide-music.d.ts.map +1 -0
- package/dist/icons/generated/lucide-music.js +3 -4
- package/dist/icons/generated/lucide-music.js.map +1 -1
- package/dist/icons/generated/lucide-package.d.ts +5 -4
- package/dist/icons/generated/lucide-package.d.ts.map +1 -0
- package/dist/icons/generated/lucide-package.js +3 -4
- package/dist/icons/generated/lucide-package.js.map +1 -1
- package/dist/icons/generated/lucide-pen-line.d.ts +5 -4
- package/dist/icons/generated/lucide-pen-line.d.ts.map +1 -0
- package/dist/icons/generated/lucide-pen-line.js +3 -4
- package/dist/icons/generated/lucide-pen-line.js.map +1 -1
- package/dist/icons/generated/lucide-pencil.d.ts +5 -4
- package/dist/icons/generated/lucide-pencil.d.ts.map +1 -0
- package/dist/icons/generated/lucide-pencil.js +3 -4
- package/dist/icons/generated/lucide-pencil.js.map +1 -1
- package/dist/icons/generated/lucide-play.d.ts +5 -4
- package/dist/icons/generated/lucide-play.d.ts.map +1 -0
- package/dist/icons/generated/lucide-play.js +3 -4
- package/dist/icons/generated/lucide-play.js.map +1 -1
- package/dist/icons/generated/lucide-plus.d.ts +5 -4
- package/dist/icons/generated/lucide-plus.d.ts.map +1 -0
- package/dist/icons/generated/lucide-plus.js +3 -4
- package/dist/icons/generated/lucide-plus.js.map +1 -1
- package/dist/icons/generated/lucide-printer.d.ts +5 -4
- package/dist/icons/generated/lucide-printer.d.ts.map +1 -0
- package/dist/icons/generated/lucide-printer.js +3 -4
- package/dist/icons/generated/lucide-printer.js.map +1 -1
- package/dist/icons/generated/lucide-redo-2.d.ts +5 -4
- package/dist/icons/generated/lucide-redo-2.d.ts.map +1 -0
- package/dist/icons/generated/lucide-redo-2.js +3 -4
- package/dist/icons/generated/lucide-redo-2.js.map +1 -1
- package/dist/icons/generated/lucide-refresh-cw.d.ts +5 -4
- package/dist/icons/generated/lucide-refresh-cw.d.ts.map +1 -0
- package/dist/icons/generated/lucide-refresh-cw.js +3 -4
- package/dist/icons/generated/lucide-refresh-cw.js.map +1 -1
- package/dist/icons/generated/lucide-scissors.d.ts +5 -4
- package/dist/icons/generated/lucide-scissors.d.ts.map +1 -0
- package/dist/icons/generated/lucide-scissors.js +3 -4
- package/dist/icons/generated/lucide-scissors.js.map +1 -1
- package/dist/icons/generated/lucide-search.d.ts +5 -4
- package/dist/icons/generated/lucide-search.d.ts.map +1 -0
- package/dist/icons/generated/lucide-search.js +3 -4
- package/dist/icons/generated/lucide-search.js.map +1 -1
- package/dist/icons/generated/lucide-settings.d.ts +5 -4
- package/dist/icons/generated/lucide-settings.d.ts.map +1 -0
- package/dist/icons/generated/lucide-settings.js +3 -4
- package/dist/icons/generated/lucide-settings.js.map +1 -1
- package/dist/icons/generated/lucide-sliders-horizontal.d.ts +5 -4
- package/dist/icons/generated/lucide-sliders-horizontal.d.ts.map +1 -0
- package/dist/icons/generated/lucide-sliders-horizontal.js +3 -4
- package/dist/icons/generated/lucide-sliders-horizontal.js.map +1 -1
- package/dist/icons/generated/lucide-star.d.ts +5 -4
- package/dist/icons/generated/lucide-star.d.ts.map +1 -0
- package/dist/icons/generated/lucide-star.js +3 -4
- package/dist/icons/generated/lucide-star.js.map +1 -1
- package/dist/icons/generated/lucide-tag.d.ts +5 -4
- package/dist/icons/generated/lucide-tag.d.ts.map +1 -0
- package/dist/icons/generated/lucide-tag.js +3 -4
- package/dist/icons/generated/lucide-tag.js.map +1 -1
- package/dist/icons/generated/lucide-tags.d.ts +5 -4
- package/dist/icons/generated/lucide-tags.d.ts.map +1 -0
- package/dist/icons/generated/lucide-tags.js +3 -4
- package/dist/icons/generated/lucide-tags.js.map +1 -1
- package/dist/icons/generated/lucide-trash-2.d.ts +5 -4
- package/dist/icons/generated/lucide-trash-2.d.ts.map +1 -0
- package/dist/icons/generated/lucide-trash-2.js +3 -4
- package/dist/icons/generated/lucide-trash-2.js.map +1 -1
- package/dist/icons/generated/lucide-triangle-alert.d.ts +5 -4
- package/dist/icons/generated/lucide-triangle-alert.d.ts.map +1 -0
- package/dist/icons/generated/lucide-triangle-alert.js +3 -4
- package/dist/icons/generated/lucide-triangle-alert.js.map +1 -1
- package/dist/icons/generated/lucide-undo-2.d.ts +5 -4
- package/dist/icons/generated/lucide-undo-2.d.ts.map +1 -0
- package/dist/icons/generated/lucide-undo-2.js +3 -4
- package/dist/icons/generated/lucide-undo-2.js.map +1 -1
- package/dist/icons/generated/lucide-upload.d.ts +5 -4
- package/dist/icons/generated/lucide-upload.d.ts.map +1 -0
- package/dist/icons/generated/lucide-upload.js +3 -4
- package/dist/icons/generated/lucide-upload.js.map +1 -1
- package/dist/icons/generated/lucide-user.d.ts +5 -4
- package/dist/icons/generated/lucide-user.d.ts.map +1 -0
- package/dist/icons/generated/lucide-user.js +3 -4
- package/dist/icons/generated/lucide-user.js.map +1 -1
- package/dist/icons/generated/lucide-wrench.d.ts +5 -4
- package/dist/icons/generated/lucide-wrench.d.ts.map +1 -0
- package/dist/icons/generated/lucide-wrench.js +3 -4
- package/dist/icons/generated/lucide-wrench.js.map +1 -1
- package/dist/icons/generated/lucide-x.d.ts +5 -4
- package/dist/icons/generated/lucide-x.d.ts.map +1 -0
- package/dist/icons/generated/lucide-x.js +3 -4
- package/dist/icons/generated/lucide-x.js.map +1 -1
- package/dist/icons/generated/mdi-tag-search-outline.d.ts +5 -4
- package/dist/icons/generated/mdi-tag-search-outline.d.ts.map +1 -0
- package/dist/icons/generated/mdi-tag-search-outline.js +3 -4
- package/dist/icons/generated/mdi-tag-search-outline.js.map +1 -1
- package/dist/icons/generated/ooui-close.d.ts +5 -4
- package/dist/icons/generated/ooui-close.d.ts.map +1 -0
- package/dist/icons/generated/ooui-close.js +3 -4
- package/dist/icons/generated/ooui-close.js.map +1 -1
- package/dist/icons/generated/radix-icons-panel-left-minimized.d.ts +5 -4
- package/dist/icons/generated/radix-icons-panel-left-minimized.d.ts.map +1 -0
- package/dist/icons/generated/radix-icons-panel-left-minimized.js +3 -4
- package/dist/icons/generated/radix-icons-panel-left-minimized.js.map +1 -1
- package/dist/icons/generated/radix-icons-reset.d.ts +5 -4
- package/dist/icons/generated/radix-icons-reset.d.ts.map +1 -0
- package/dist/icons/generated/radix-icons-reset.js +3 -4
- package/dist/icons/generated/radix-icons-reset.js.map +1 -1
- package/dist/icons/generated/tabler-sort-ascending-letters.d.ts +5 -4
- package/dist/icons/generated/tabler-sort-ascending-letters.d.ts.map +1 -0
- package/dist/icons/generated/tabler-sort-ascending-letters.js +3 -4
- package/dist/icons/generated/tabler-sort-ascending-letters.js.map +1 -1
- package/dist/icons/index.d.ts +75 -74
- package/dist/icons/index.js +75 -75
- package/dist/shared/element-height/index.js +51 -25
- package/dist/shared/element-height/index.js.map +1 -1
- package/dist/shared/element-width/index.js +39 -24
- package/dist/shared/element-width/index.js.map +1 -1
- package/dist/shared/events/user-change.js +14 -8
- package/dist/shared/events/user-change.js.map +1 -1
- package/dist/shared/focus/pointer-focus.js +56 -30
- package/dist/shared/focus/pointer-focus.js.map +1 -1
- package/dist/shared/focus/tabbable.js +96 -0
- package/dist/shared/focus/tabbable.js.map +1 -0
- package/dist/shared/form-association/field-id.js +13 -6
- package/dist/shared/form-association/field-id.js.map +1 -1
- package/dist/shared/form-association/index.js +75 -42
- package/dist/shared/form-association/index.js.map +1 -1
- package/dist/shared/gesture/drag-gesture.js +239 -99
- package/dist/shared/gesture/drag-gesture.js.map +1 -1
- package/dist/shared/gesture/physics.js +49 -16
- package/dist/shared/gesture/physics.js.map +1 -1
- package/dist/shared/gesture/pinch-gesture.js +111 -60
- package/dist/shared/gesture/pinch-gesture.js.map +1 -1
- package/dist/shared/group-management/index.js +181 -84
- package/dist/shared/group-management/index.js.map +1 -1
- package/dist/shared/label-emptiness/index.js +45 -26
- package/dist/shared/label-emptiness/index.js.map +1 -1
- package/dist/shared/locale/builtin-labels.js +38 -0
- package/dist/shared/locale/builtin-labels.js.map +1 -0
- package/dist/shared/menu-behavior/index.js +113 -60
- package/dist/shared/menu-behavior/index.js.map +1 -1
- package/dist/shared/menu-portal/menu-portal.js +47 -26
- package/dist/shared/menu-portal/menu-portal.js.map +1 -1
- package/dist/shared/menu-portal/menu-tree.js +132 -75
- package/dist/shared/menu-portal/menu-tree.js.map +1 -1
- package/dist/shared/normalize/index.js +16 -7
- package/dist/shared/normalize/index.js.map +1 -1
- package/dist/shared/open-state/index.js +7 -8
- package/dist/shared/open-state/index.js.map +1 -1
- package/dist/shared/option-portal/combobox-shell.js +121 -56
- package/dist/shared/option-portal/combobox-shell.js.map +1 -1
- package/dist/shared/option-portal/index.js +65 -44
- package/dist/shared/option-portal/index.js.map +1 -1
- package/dist/shared/overlay/anchored-panel.js +75 -40
- package/dist/shared/overlay/anchored-panel.js.map +1 -1
- package/dist/shared/overlay/native-dialog-presence.js +116 -52
- package/dist/shared/overlay/native-dialog-presence.js.map +1 -1
- package/dist/shared/overlay/nested-drawer-layers.js +76 -46
- package/dist/shared/overlay/nested-drawer-layers.js.map +1 -1
- package/dist/shared/overlay/open-overlay.js +240 -136
- package/dist/shared/overlay/open-overlay.js.map +1 -1
- package/dist/shared/overlay/overlay-root.js +33 -24
- package/dist/shared/overlay/overlay-root.js.map +1 -1
- package/dist/shared/overlay/overlay.js +109 -66
- package/dist/shared/overlay/overlay.js.map +1 -1
- package/dist/shared/overlay/placement-props.js +9 -4
- package/dist/shared/overlay/placement-props.js.map +1 -1
- package/dist/shared/overlay/portal.d.ts +2 -0
- package/dist/shared/overlay/portal.d.ts.map +1 -0
- package/dist/shared/overlay/portal.js +202 -117
- package/dist/shared/overlay/portal.js.map +1 -1
- package/dist/shared/overlay/positioning-generation.js +9 -10
- package/dist/shared/overlay/positioning-generation.js.map +1 -1
- package/dist/shared/overlay/presence.js +43 -21
- package/dist/shared/overlay/presence.js.map +1 -1
- package/dist/shared/overlay/theme-overlay-scope.js +22 -19
- package/dist/shared/overlay/theme-overlay-scope.js.map +1 -1
- package/dist/shared/scroll-lock/scroll-lock.js +49 -15
- package/dist/shared/scroll-lock/scroll-lock.js.map +1 -1
- package/dist/shared/theme/duration.js +13 -6
- package/dist/shared/theme/duration.js.map +1 -1
- package/dist/shared/theme/reduced-motion.js +14 -9
- package/dist/shared/theme/reduced-motion.js.map +1 -1
- package/dist/shared/theme/root-sync.js +85 -32
- package/dist/shared/theme/root-sync.js.map +1 -1
- package/dist/shared/visible-area/index.js +81 -37
- package/dist/shared/visible-area/index.js.map +1 -1
- package/dist/types/iconify.d.ts +1 -1
- package/dist/types/iconify.js +0 -0
- package/dist/types/react.d.ts +8 -10
- package/dist/types/react.d.ts.map +1 -0
- package/dist/types/react.js +0 -0
- package/dist/types/utils.d.ts +8 -13
- package/dist/types/utils.d.ts.map +1 -0
- package/dist/types/utils.js +0 -0
- package/dist/types/vue.d.ts +9 -13
- package/dist/types/vue.d.ts.map +1 -0
- package/dist/types/vue.js +0 -0
- package/dist/vite/index.d.ts +1 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +30 -4
- package/dist/vite/index.js.map +1 -1
- package/package.json +10 -23
- package/dist/_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js +0 -9
- package/dist/components/middle-ellipsis/truncate.d.ts +0 -62
- package/dist/components/radio/interaction.d.ts +0 -4
- package/dist/scrollbars/index.d.ts +0 -33
- package/dist/scrollbars/index.js +0 -18
- package/dist/scrollbars/index.js.map +0 -1
- package/dist/scrollbars/internal.js +0 -6
- package/dist/scrollbars/internal.js.map +0 -1
- package/dist/scrollbars/style.css +0 -10
|
@@ -1,45 +1,46 @@
|
|
|
1
|
-
import { LitElement } from
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
2
|
export interface ReplayOptions {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
/** 沿原路径收回(从完整描边画回空白),默认 false 即揭示方向。 */
|
|
4
|
+
reverse?: boolean;
|
|
5
5
|
}
|
|
6
6
|
export declare class WebUiSvgDrawLines extends LitElement {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
7
|
+
static styles: import("lit").CSSResult;
|
|
8
|
+
get duration(): number;
|
|
9
|
+
set duration(v: number);
|
|
10
|
+
private _duration;
|
|
11
|
+
easing: string;
|
|
12
|
+
/** 关掉「首次内容稳定时自动播放一次」,交给调用方用 replay() 决定何时播。 */
|
|
13
|
+
noAutoplay: boolean;
|
|
14
|
+
private _activeRun;
|
|
15
|
+
private _hasAutoPlayed;
|
|
16
|
+
private readonly _authoredDash;
|
|
17
|
+
/** 收回留在元素上的「空白」,只有内联那两个值都还是我们自己写的那一份时才算数。 */
|
|
18
|
+
private readonly _stickyBlank;
|
|
19
|
+
/**
|
|
20
|
+
* 停止当前播放并重新开始。每次调用重新收集子树中的几何元素。
|
|
21
|
+
* 所有元素同时开始并行的 stroke-dashoffset 动画。
|
|
22
|
+
* options.reverse 为 true 时沿原路径收回。
|
|
23
|
+
* 无目标或当前主题范围启用 reduced motion 时立即 resolve。
|
|
24
|
+
*/
|
|
25
|
+
replay(options?: ReplayOptions): Promise<void>;
|
|
26
|
+
private cancelAll;
|
|
27
|
+
private finishRun;
|
|
28
|
+
/** 只撤销我们自己写进去的那一份空白;消费者后来动过内联的任一个值就不碰。 */
|
|
29
|
+
private clearStickyBlank;
|
|
30
|
+
/**
|
|
31
|
+
* 深度遍历组件的 light DOM 子节点与开放 Shadow Root,
|
|
32
|
+
* 收集所有 SVGGeometryElement。closed shadow root 跳过。
|
|
33
|
+
*/
|
|
34
|
+
private collectGeometryElements;
|
|
35
|
+
private animateElement;
|
|
36
|
+
private fixPathGap;
|
|
37
|
+
private handleSlotChange;
|
|
38
|
+
disconnectedCallback(): void;
|
|
39
|
+
render(): import("lit").TemplateResult<1>;
|
|
40
40
|
}
|
|
41
41
|
declare global {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
interface HTMLElementTagNameMap {
|
|
43
|
+
'web-ui-svg-draw-lines': WebUiSvgDrawLines;
|
|
44
|
+
}
|
|
45
45
|
}
|
|
46
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/svg-draw-lines/index.ts"],"mappings":";iBAqFiB;;EAEf;;qBAIW,0BAA0B;SACrB,sBAAM;MAGlB;MAGA,SAAS;UAKL;EAEmC;;EAG2B;UAE9D;UACA;mBAKS;;mBAEA;;;;;;;EAQX,OAAO,UAAS,gBAAqB;UAgCnC;UAUA;;UA2BA;;;;;UAmBA;UA8BA;UAyDA;UAQA;EAMC;EAKA,wBAAM;;QAKT;YACI;IACR,yBAAyB"}
|
|
@@ -1,160 +1,243 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { normalizeNumber
|
|
3
|
-
import { prefersReducedMotion
|
|
4
|
-
import
|
|
5
|
-
import { LitElement
|
|
6
|
-
import { customElement
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import __decorate from "../../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
|
|
2
|
+
import { normalizeNumber } from "../../shared/normalize/index.js";
|
|
3
|
+
import { prefersReducedMotion } from "../../shared/theme/reduced-motion.js";
|
|
4
|
+
import style_default from "./style.js";
|
|
5
|
+
import { LitElement, html, unsafeCSS } from "lit";
|
|
6
|
+
import { customElement, property } from "lit/decorators.js";
|
|
7
|
+
// src/components/svg-draw-lines/index.ts
|
|
8
|
+
const GEOMETRY_SELECTOR = "path, rect, circle, line, polyline, polygon, ellipse";
|
|
9
|
+
const DASH_OFFSET_PROPERTY = "--wui-svg-draw-lines-offset";
|
|
10
|
+
let dashOffsetRegistrationApi;
|
|
11
|
+
let dashOffsetInterpolationSupported;
|
|
12
|
+
function isAlreadyRegistered(error) {
|
|
13
|
+
return typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "InvalidModificationError";
|
|
11
14
|
}
|
|
12
|
-
function
|
|
13
|
-
|
|
15
|
+
function supportsDashOffsetInterpolation() {
|
|
16
|
+
const probe = document.createElement("span");
|
|
17
|
+
let animation;
|
|
14
18
|
try {
|
|
15
|
-
|
|
19
|
+
probe.style.setProperty(DASH_OFFSET_PROPERTY, "0px");
|
|
20
|
+
document.documentElement.append(probe);
|
|
21
|
+
animation = probe.animate([{ [DASH_OFFSET_PROPERTY]: "0px" }, { [DASH_OFFSET_PROPERTY]: "100px" }], {
|
|
16
22
|
duration: 1e3,
|
|
17
23
|
easing: "linear",
|
|
18
24
|
fill: "both"
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return
|
|
25
|
+
});
|
|
26
|
+
animation.pause();
|
|
27
|
+
animation.currentTime = 250;
|
|
28
|
+
const interpolated = Number.parseFloat(getComputedStyle(probe).getPropertyValue(DASH_OFFSET_PROPERTY));
|
|
29
|
+
return Number.isFinite(interpolated) && Math.abs(interpolated - 25) < .1;
|
|
30
|
+
} catch (error) {
|
|
31
|
+
console.warn("web-ui-svg-draw-lines could not verify typed offset interpolation. Using linear easing.", error);
|
|
32
|
+
return false;
|
|
24
33
|
} finally {
|
|
25
|
-
|
|
34
|
+
animation?.cancel();
|
|
35
|
+
probe.remove();
|
|
26
36
|
}
|
|
27
37
|
}
|
|
28
|
-
function
|
|
29
|
-
if (typeof CSS
|
|
30
|
-
|
|
31
|
-
if (
|
|
38
|
+
function registerDashOffsetProperty() {
|
|
39
|
+
if (typeof CSS === "undefined" || typeof CSS.registerProperty !== "function" || typeof document === "undefined") return false;
|
|
40
|
+
const registerProperty = CSS.registerProperty;
|
|
41
|
+
if (dashOffsetRegistrationApi !== registerProperty) {
|
|
42
|
+
dashOffsetRegistrationApi = registerProperty;
|
|
43
|
+
dashOffsetInterpolationSupported = void 0;
|
|
44
|
+
}
|
|
45
|
+
if (dashOffsetInterpolationSupported !== void 0) return dashOffsetInterpolationSupported;
|
|
32
46
|
try {
|
|
33
47
|
CSS.registerProperty({
|
|
34
|
-
name:
|
|
48
|
+
name: DASH_OFFSET_PROPERTY,
|
|
35
49
|
syntax: "<length>",
|
|
36
|
-
inherits:
|
|
50
|
+
inherits: false,
|
|
37
51
|
initialValue: "0px"
|
|
38
52
|
});
|
|
39
|
-
} catch (
|
|
40
|
-
if (!
|
|
53
|
+
} catch (error) {
|
|
54
|
+
if (!isAlreadyRegistered(error)) {
|
|
55
|
+
console.warn("web-ui-svg-draw-lines could not register its typed offset property. Using linear easing.", error);
|
|
56
|
+
dashOffsetInterpolationSupported = false;
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
41
59
|
}
|
|
42
|
-
|
|
60
|
+
dashOffsetInterpolationSupported = supportsDashOffsetInterpolation();
|
|
61
|
+
return dashOffsetInterpolationSupported;
|
|
43
62
|
}
|
|
44
|
-
|
|
45
|
-
constructor(...
|
|
46
|
-
super(...
|
|
63
|
+
let WebUiSvgDrawLines = class WebUiSvgDrawLines extends LitElement {
|
|
64
|
+
constructor(..._args) {
|
|
65
|
+
super(..._args);
|
|
66
|
+
this._duration = 1e3;
|
|
67
|
+
this.easing = "linear";
|
|
68
|
+
this.noAutoplay = false;
|
|
69
|
+
this._hasAutoPlayed = false;
|
|
70
|
+
this._authoredDash = /* @__PURE__ */ new WeakMap();
|
|
71
|
+
this._stickyBlank = /* @__PURE__ */ new WeakMap();
|
|
47
72
|
}
|
|
48
73
|
static {
|
|
49
|
-
this.styles =
|
|
74
|
+
this.styles = unsafeCSS(style_default);
|
|
50
75
|
}
|
|
51
76
|
get duration() {
|
|
52
77
|
return this._duration;
|
|
53
78
|
}
|
|
54
|
-
set duration(
|
|
55
|
-
|
|
56
|
-
this._duration =
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
79
|
+
set duration(v) {
|
|
80
|
+
const old = this._duration;
|
|
81
|
+
this._duration = normalizeNumber(v, 0, 3e4, 1e3);
|
|
82
|
+
this.requestUpdate("duration", old);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 停止当前播放并重新开始。每次调用重新收集子树中的几何元素。
|
|
86
|
+
* 所有元素同时开始并行的 stroke-dashoffset 动画。
|
|
87
|
+
* options.reverse 为 true 时沿原路径收回。
|
|
88
|
+
* 无目标或当前主题范围启用 reduced motion 时立即 resolve。
|
|
89
|
+
*/
|
|
90
|
+
async replay(options = {}) {
|
|
91
|
+
const reverse = options.reverse === true;
|
|
60
92
|
this.cancelAll();
|
|
61
|
-
|
|
62
|
-
if (
|
|
63
|
-
for (
|
|
93
|
+
const targets = this.collectGeometryElements();
|
|
94
|
+
if (prefersReducedMotion(this)) {
|
|
95
|
+
for (const el of targets) this.clearStickyBlank(el);
|
|
64
96
|
return;
|
|
65
97
|
}
|
|
66
|
-
if (
|
|
67
|
-
|
|
68
|
-
reverse
|
|
98
|
+
if (targets.length === 0) return;
|
|
99
|
+
const run = {
|
|
100
|
+
reverse,
|
|
69
101
|
animations: [],
|
|
70
102
|
blankByElement: /* @__PURE__ */ new Map(),
|
|
71
103
|
patchedD: /* @__PURE__ */ new Map()
|
|
72
104
|
};
|
|
73
|
-
this._activeRun =
|
|
105
|
+
this._activeRun = run;
|
|
106
|
+
await Promise.all(targets.map((el) => this.animateElement(el, run, reverse)));
|
|
107
|
+
if (this._activeRun !== run) return;
|
|
108
|
+
this.finishRun(run);
|
|
74
109
|
}
|
|
75
110
|
cancelAll() {
|
|
76
|
-
this._activeRun
|
|
77
|
-
}
|
|
78
|
-
finishRun(
|
|
79
|
-
|
|
80
|
-
for (
|
|
81
|
-
for (
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
111
|
+
if (this._activeRun) this.finishRun(this._activeRun);
|
|
112
|
+
}
|
|
113
|
+
finishRun(run) {
|
|
114
|
+
run.animations.forEach((anim) => anim.cancel());
|
|
115
|
+
for (const [el, d] of run.patchedD) el.setAttribute("d", d);
|
|
116
|
+
for (const [el, blank] of run.blankByElement) {
|
|
117
|
+
const authored = this._authoredDash.get(el);
|
|
118
|
+
if (run.reverse) {
|
|
119
|
+
el.style.strokeDasharray = blank;
|
|
120
|
+
el.style.strokeDashoffset = blank;
|
|
121
|
+
this._stickyBlank.set(el, {
|
|
122
|
+
dasharray: el.style.strokeDasharray,
|
|
123
|
+
dashoffset: el.style.strokeDashoffset
|
|
124
|
+
});
|
|
125
|
+
} else {
|
|
126
|
+
el.style.strokeDasharray = authored?.dasharray ?? "";
|
|
127
|
+
el.style.strokeDashoffset = authored?.dashoffset ?? "";
|
|
128
|
+
this._stickyBlank.delete(el);
|
|
129
|
+
}
|
|
130
|
+
el.style.removeProperty(DASH_OFFSET_PROPERTY);
|
|
87
131
|
}
|
|
88
|
-
this._activeRun ===
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
132
|
+
if (this._activeRun === run) this._activeRun = void 0;
|
|
133
|
+
}
|
|
134
|
+
/** 只撤销我们自己写进去的那一份空白;消费者后来动过内联的任一个值就不碰。 */
|
|
135
|
+
clearStickyBlank(el) {
|
|
136
|
+
const blank = this._stickyBlank.get(el);
|
|
137
|
+
if (blank === void 0 || el.style.strokeDasharray !== blank.dasharray || el.style.strokeDashoffset !== blank.dashoffset) return;
|
|
138
|
+
const authored = this._authoredDash.get(el);
|
|
139
|
+
el.style.strokeDasharray = authored?.dasharray ?? "";
|
|
140
|
+
el.style.strokeDashoffset = authored?.dashoffset ?? "";
|
|
141
|
+
this._stickyBlank.delete(el);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 深度遍历组件的 light DOM 子节点与开放 Shadow Root,
|
|
145
|
+
* 收集所有 SVGGeometryElement。closed shadow root 跳过。
|
|
146
|
+
*/
|
|
96
147
|
collectGeometryElements() {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
148
|
+
const elements = [];
|
|
149
|
+
const seen = /* @__PURE__ */ new Set();
|
|
150
|
+
const walk = (root) => {
|
|
151
|
+
if (root instanceof Element || root instanceof DocumentFragment) root.querySelectorAll(GEOMETRY_SELECTOR).forEach((el) => {
|
|
152
|
+
if (typeof el.getTotalLength === "function" && !seen.has(el)) {
|
|
153
|
+
seen.add(el);
|
|
154
|
+
elements.push(el);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
if (root instanceof Element) {
|
|
158
|
+
for (const child of root.children) walk(child);
|
|
159
|
+
if (root.shadowRoot) walk(root.shadowRoot);
|
|
160
|
+
} else if (root instanceof ShadowRoot) for (const child of root.children) walk(child);
|
|
104
161
|
};
|
|
105
|
-
for (
|
|
106
|
-
return
|
|
107
|
-
}
|
|
108
|
-
animateElement(
|
|
109
|
-
return new Promise((
|
|
110
|
-
if (this._authoredDash.has(
|
|
111
|
-
dasharray:
|
|
112
|
-
dashoffset:
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
|
|
162
|
+
for (const child of this.children) walk(child);
|
|
163
|
+
return elements;
|
|
164
|
+
}
|
|
165
|
+
animateElement(el, run, reverse) {
|
|
166
|
+
return new Promise((resolve) => {
|
|
167
|
+
if (!this._authoredDash.has(el)) this._authoredDash.set(el, {
|
|
168
|
+
dasharray: el.style.strokeDasharray,
|
|
169
|
+
dashoffset: el.style.strokeDashoffset
|
|
170
|
+
});
|
|
171
|
+
if (el.tagName === "path") {
|
|
172
|
+
const d = el.getAttribute("d");
|
|
173
|
+
if (d && /[Zz]\s*$/.test(d) && !run.patchedD.has(el)) {
|
|
174
|
+
run.patchedD.set(el, d);
|
|
175
|
+
el.setAttribute("d", this.fixPathGap(el, d));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const strokeWidth = parseFloat(getComputedStyle(el).strokeWidth) || 0;
|
|
179
|
+
const len = el.getTotalLength() + strokeWidth;
|
|
180
|
+
const blank = `${len}`;
|
|
181
|
+
const from = reverse ? 0 : len;
|
|
182
|
+
const to = reverse ? len : 0;
|
|
183
|
+
const canClampOvershoot = registerDashOffsetProperty();
|
|
184
|
+
el.style.strokeDasharray = blank;
|
|
185
|
+
if (canClampOvershoot) {
|
|
186
|
+
el.style.setProperty(DASH_OFFSET_PROPERTY, `${from}px`);
|
|
187
|
+
el.style.strokeDashoffset = `clamp(0px, var(${DASH_OFFSET_PROPERTY}), ${blank}px)`;
|
|
188
|
+
} else {
|
|
189
|
+
el.style.removeProperty(DASH_OFFSET_PROPERTY);
|
|
190
|
+
el.style.strokeDashoffset = `${from}px`;
|
|
116
191
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
192
|
+
run.blankByElement.set(el, blank);
|
|
193
|
+
const property = canClampOvershoot ? DASH_OFFSET_PROPERTY : "strokeDashoffset";
|
|
194
|
+
const anim = el.animate([{ [property]: `${from}px` }, { [property]: `${to}px` }], {
|
|
120
195
|
duration: this.duration,
|
|
121
|
-
easing:
|
|
196
|
+
easing: canClampOvershoot ? this.easing : "linear",
|
|
122
197
|
fill: "forwards"
|
|
123
198
|
});
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
199
|
+
run.animations.push(anim);
|
|
200
|
+
anim.onfinish = () => {
|
|
201
|
+
resolve();
|
|
202
|
+
};
|
|
203
|
+
anim.oncancel = () => {
|
|
204
|
+
resolve();
|
|
128
205
|
};
|
|
129
206
|
});
|
|
130
207
|
}
|
|
131
|
-
fixPathGap(
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
208
|
+
fixPathGap(pathEl, d) {
|
|
209
|
+
pathEl.setAttribute("d", d);
|
|
210
|
+
const p0 = pathEl.getPointAtLength(0);
|
|
211
|
+
const p1 = pathEl.getPointAtLength(.1);
|
|
212
|
+
return d.replace(/[Zz]\s*$/, `L${p0.x.toFixed(3)} ${p0.y.toFixed(3)} L${p1.x.toFixed(3)} ${p1.y.toFixed(3)}`);
|
|
135
213
|
}
|
|
136
214
|
handleSlotChange() {
|
|
137
|
-
this.noAutoplay || this._hasAutoPlayed
|
|
215
|
+
if (this.noAutoplay || this._hasAutoPlayed) return;
|
|
216
|
+
this._hasAutoPlayed = true;
|
|
217
|
+
this.replay();
|
|
138
218
|
}
|
|
139
219
|
disconnectedCallback() {
|
|
140
|
-
this.cancelAll()
|
|
220
|
+
this.cancelAll();
|
|
221
|
+
super.disconnectedCallback();
|
|
141
222
|
}
|
|
142
223
|
render() {
|
|
143
|
-
return
|
|
224
|
+
return html`<slot @slotchange=${this.handleSlotChange}></slot>`;
|
|
144
225
|
}
|
|
145
226
|
};
|
|
146
|
-
|
|
227
|
+
__decorate([property({
|
|
147
228
|
type: Number,
|
|
148
|
-
reflect:
|
|
149
|
-
})],
|
|
229
|
+
reflect: true
|
|
230
|
+
})], WebUiSvgDrawLines.prototype, "duration", null);
|
|
231
|
+
__decorate([property({
|
|
150
232
|
type: String,
|
|
151
|
-
reflect:
|
|
152
|
-
})],
|
|
233
|
+
reflect: true
|
|
234
|
+
})], WebUiSvgDrawLines.prototype, "easing", void 0);
|
|
235
|
+
__decorate([property({
|
|
153
236
|
type: Boolean,
|
|
154
|
-
reflect:
|
|
237
|
+
reflect: true,
|
|
155
238
|
attribute: "no-autoplay"
|
|
156
|
-
})],
|
|
157
|
-
|
|
158
|
-
export {
|
|
239
|
+
})], WebUiSvgDrawLines.prototype, "noAutoplay", void 0);
|
|
240
|
+
WebUiSvgDrawLines = __decorate([customElement("web-ui-svg-draw-lines")], WebUiSvgDrawLines);
|
|
241
|
+
export { WebUiSvgDrawLines };
|
|
159
242
|
|
|
160
243
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/svg-draw-lines/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { normalizeNumber } from '@/shared/normalize'\nimport { prefersReducedMotion } from '@/shared/theme/reduced-motion'\n\nimport style from './style.css?inline'\n\nconst GEOMETRY_SELECTOR = 'path, rect, circle, line, polyline, polygon, ellipse'\n// Animate a registered length, then clamp it before using it as a dash offset.\nconst DASH_OFFSET_PROPERTY = '--wui-svg-draw-lines-offset'\n\nlet dashOffsetRegistrationApi: typeof CSS.registerProperty | undefined\nlet dashOffsetInterpolationSupported: boolean | undefined\n\nfunction isAlreadyRegistered(error: unknown): boolean {\n return (\n typeof DOMException !== 'undefined' && error instanceof DOMException && error.name === 'InvalidModificationError'\n )\n}\n\nfunction supportsDashOffsetInterpolation(): boolean {\n const probe = document.createElement('span')\n let animation: Animation | undefined\n try {\n probe.style.setProperty(DASH_OFFSET_PROPERTY, '0px')\n document.documentElement.append(probe)\n animation = probe.animate([{ [DASH_OFFSET_PROPERTY]: '0px' }, { [DASH_OFFSET_PROPERTY]: '100px' }], {\n duration: 1000,\n easing: 'linear',\n fill: 'both'\n })\n animation.pause()\n animation.currentTime = 250\n\n const interpolated = Number.parseFloat(getComputedStyle(probe).getPropertyValue(DASH_OFFSET_PROPERTY))\n return Number.isFinite(interpolated) && Math.abs(interpolated - 25) < 0.1\n } catch (error) {\n console.warn('web-ui-svg-draw-lines could not verify typed offset interpolation. Using linear easing.', error)\n return false\n } finally {\n animation?.cancel()\n probe.remove()\n }\n}\n\nfunction registerDashOffsetProperty(): boolean {\n if (typeof CSS === 'undefined' || typeof CSS.registerProperty !== 'function' || typeof document === 'undefined')\n return false\n\n const registerProperty = CSS.registerProperty\n if (dashOffsetRegistrationApi !== registerProperty) {\n // Capability is cached only for the registration implementation that passed the probe.\n dashOffsetRegistrationApi = registerProperty\n dashOffsetInterpolationSupported = undefined\n }\n if (dashOffsetInterpolationSupported !== undefined) return dashOffsetInterpolationSupported\n\n try {\n CSS.registerProperty({\n name: DASH_OFFSET_PROPERTY,\n syntax: '<length>',\n inherits: false,\n initialValue: '0px'\n })\n } catch (error) {\n if (!isAlreadyRegistered(error)) {\n console.warn('web-ui-svg-draw-lines could not register its typed offset property. Using linear easing.', error)\n dashOffsetInterpolationSupported = false\n return false\n }\n }\n\n dashOffsetInterpolationSupported = supportsDashOffsetInterpolation()\n return dashOffsetInterpolationSupported\n}\n\ninterface AnimationRun {\n reverse: boolean\n animations: Animation[]\n /** 本次运行写过的「空白」dash 值,按元素记;收回收尾要把它留在 DOM 上。 */\n blankByElement: Map<SVGGeometryElement, string>\n patchedD: Map<SVGGeometryElement, string>\n}\n\nexport interface ReplayOptions {\n /** 沿原路径收回(从完整描边画回空白),默认 false 即揭示方向。 */\n reverse?: boolean\n}\n\n@customElement('web-ui-svg-draw-lines')\nexport class WebUiSvgDrawLines extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: Number, reflect: true })\n get duration(): number {\n return this._duration\n }\n set duration(v: number) {\n const old = this._duration\n this._duration = normalizeNumber(v, 0, 30000, 1000)\n this.requestUpdate('duration', old)\n }\n private _duration = 1000\n\n @property({ type: String, reflect: true }) easing = 'linear'\n\n /** 关掉「首次内容稳定时自动播放一次」,交给调用方用 replay() 决定何时播。 */\n @property({ type: Boolean, reflect: true, attribute: 'no-autoplay' }) noAutoplay = false\n\n private _activeRun: AnimationRun | undefined\n private _hasAutoPlayed = false\n /*\n * 消费者自己写在目标元素上的 dash 值,只在第一次碰到该元素时取一次。运行会把这两个属性改成\n * 自己的空白值,所以不能从「上一次运行之后」的状态重新取,否则画入收尾会把空白当成原值。\n */\n private readonly _authoredDash = new WeakMap<SVGGeometryElement, { dasharray: string; dashoffset: string }>()\n /** 收回留在元素上的「空白」,只有内联那两个值都还是我们自己写的那一份时才算数。 */\n private readonly _stickyBlank = new WeakMap<SVGGeometryElement, { dasharray: string; dashoffset: string }>()\n\n /**\n * 停止当前播放并重新开始。每次调用重新收集子树中的几何元素。\n * 所有元素同时开始并行的 stroke-dashoffset 动画。\n * options.reverse 为 true 时沿原路径收回。\n * 无目标或当前主题范围启用 reduced motion 时立即 resolve。\n */\n async replay(options: ReplayOptions = {}): Promise<void> {\n const reverse = options.reverse === true\n\n this.cancelAll()\n\n const targets = this.collectGeometryElements()\n\n if (prefersReducedMotion(this)) {\n // 不播,但上一次收回提交的空白要清掉:reduced motion 下可见性完全交给消费者的 opacity,\n // 留着空白就会出现「aria-checked=true 却看不见勾」,而之后每次 replay 都会同样早退、无法自愈。\n for (const el of targets) this.clearStickyBlank(el)\n return\n }\n\n if (targets.length === 0) return\n\n const run: AnimationRun = {\n reverse,\n animations: [],\n blankByElement: new Map(),\n patchedD: new Map()\n }\n this._activeRun = run\n\n await Promise.all(targets.map(el => this.animateElement(el, run, reverse)))\n\n // A later replay owns the current DOM state and must not be cleaned up here.\n if (this._activeRun !== run) return\n\n this.finishRun(run)\n }\n\n private cancelAll() {\n if (this._activeRun) this.finishRun(this._activeRun)\n }\n\n /*\n * 收尾分两个方向:画线还原消费者自己写的 dash(描边完整可见),收回把空白留在内联样式上\n * (整条路径落进 dash 间隙,看不见)。收回末态必须是 DOM 状态,不能是「一条还活着的\n * fill:forwards 动画」——元素被摘走再挂回(列表 key 重排、teleport)时,还原成完整描边的\n * 那份内联值会让勾当场复现,而控件已经是未勾选。\n */\n private finishRun(run: AnimationRun) {\n run.animations.forEach(anim => anim.cancel())\n\n for (const [el, d] of run.patchedD) {\n el.setAttribute('d', d)\n }\n\n for (const [el, blank] of run.blankByElement) {\n const authored = this._authoredDash.get(el)\n if (run.reverse) {\n el.style.strokeDasharray = blank\n el.style.strokeDashoffset = blank\n // 存回读值而不是写入值:CSSOM 会按自己的精度序列化,撤销时要按同一份文本比对。\n this._stickyBlank.set(el, { dasharray: el.style.strokeDasharray, dashoffset: el.style.strokeDashoffset })\n } else {\n el.style.strokeDasharray = authored?.dasharray ?? ''\n el.style.strokeDashoffset = authored?.dashoffset ?? ''\n this._stickyBlank.delete(el)\n }\n\n el.style.removeProperty(DASH_OFFSET_PROPERTY)\n }\n\n if (this._activeRun === run) this._activeRun = undefined\n }\n\n /** 只撤销我们自己写进去的那一份空白;消费者后来动过内联的任一个值就不碰。 */\n private clearStickyBlank(el: SVGGeometryElement) {\n const blank = this._stickyBlank.get(el)\n if (\n blank === undefined ||\n el.style.strokeDasharray !== blank.dasharray ||\n el.style.strokeDashoffset !== blank.dashoffset\n )\n return\n\n const authored = this._authoredDash.get(el)\n el.style.strokeDasharray = authored?.dasharray ?? ''\n el.style.strokeDashoffset = authored?.dashoffset ?? ''\n this._stickyBlank.delete(el)\n }\n\n /**\n * 深度遍历组件的 light DOM 子节点与开放 Shadow Root,\n * 收集所有 SVGGeometryElement。closed shadow root 跳过。\n */\n private collectGeometryElements(): SVGGeometryElement[] {\n const elements: SVGGeometryElement[] = []\n const seen = new Set<SVGGeometryElement>()\n\n const walk = (root: Node) => {\n if (root instanceof Element || root instanceof DocumentFragment) {\n root.querySelectorAll(GEOMETRY_SELECTOR).forEach(el => {\n // instanceof SVGGeometryElement 在 jsdom 中未定义,使用 duck-type 检查\n if (\n typeof (el as unknown as Record<string, unknown>).getTotalLength === 'function' &&\n !seen.has(el as unknown as SVGGeometryElement)\n ) {\n seen.add(el as unknown as SVGGeometryElement)\n elements.push(el as unknown as SVGGeometryElement)\n }\n })\n }\n\n if (root instanceof Element) {\n for (const child of root.children) walk(child)\n if (root.shadowRoot) walk(root.shadowRoot)\n } else if (root instanceof ShadowRoot) {\n for (const child of root.children) walk(child)\n }\n }\n\n for (const child of this.children) walk(child)\n return elements\n }\n\n private animateElement(el: SVGGeometryElement, run: AnimationRun, reverse: boolean): Promise<void> {\n return new Promise(resolve => {\n if (!this._authoredDash.has(el)) {\n this._authoredDash.set(el, {\n dasharray: el.style.strokeDasharray,\n dashoffset: el.style.strokeDashoffset\n })\n }\n\n if (el.tagName === 'path') {\n const d = el.getAttribute('d')\n if (d && /[Zz]\\s*$/.test(d) && !run.patchedD.has(el)) {\n run.patchedD.set(el, d)\n el.setAttribute('d', this.fixPathGap(el, d))\n }\n }\n\n const strokeWidth = parseFloat(getComputedStyle(el).strokeWidth) || 0\n const len = el.getTotalLength() + strokeWidth\n // 空白 = 整条路径落在 dash 间隙里;满 = 偏移归零。两个方向只是这两端换先后。\n const blank = `${len}`\n const from = reverse ? 0 : len\n const to = reverse ? len : 0\n\n const canClampOvershoot = registerDashOffsetProperty()\n el.style.strokeDasharray = blank\n if (canClampOvershoot) {\n el.style.setProperty(DASH_OFFSET_PROPERTY, `${from}px`)\n el.style.strokeDashoffset = `clamp(0px, var(${DASH_OFFSET_PROPERTY}), ${blank}px)`\n } else {\n // Older engines cannot interpolate the registered helper property. Animate the real offset\n // with a bounded easing so replay still works without letting an overshoot crop the path.\n el.style.removeProperty(DASH_OFFSET_PROPERTY)\n el.style.strokeDashoffset = `${from}px`\n }\n run.blankByElement.set(el, blank)\n\n const property = canClampOvershoot ? DASH_OFFSET_PROPERTY : 'strokeDashoffset'\n const anim = el.animate([{ [property]: `${from}px` }, { [property]: `${to}px` }], {\n duration: this.duration,\n easing: canClampOvershoot ? this.easing : 'linear',\n fill: 'forwards'\n })\n\n run.animations.push(anim)\n\n anim.onfinish = () => {\n resolve()\n }\n\n anim.oncancel = () => {\n resolve()\n }\n })\n }\n\n // Z → explicit line back to start + 0.1px extra, forcing render of the closing segment\n private fixPathGap(pathEl: SVGPathElement, d: string): string {\n pathEl.setAttribute('d', d)\n const p0 = pathEl.getPointAtLength(0)\n const p1 = pathEl.getPointAtLength(0.1)\n return d.replace(/[Zz]\\s*$/, `L${p0.x.toFixed(3)} ${p0.y.toFixed(3)} L${p1.x.toFixed(3)} ${p1.y.toFixed(3)}`)\n }\n\n // 首次 slot 内容稳定后自动播放一次;no-autoplay 下这一步交给调用方的 replay()。\n private handleSlotChange() {\n if (this.noAutoplay || this._hasAutoPlayed) return\n this._hasAutoPlayed = true\n void this.replay()\n }\n\n override disconnectedCallback() {\n this.cancelAll()\n super.disconnectedCallback()\n }\n\n override render() {\n return html`<slot @slotchange=${this.handleSlotChange}></slot>`\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-svg-draw-lines': WebUiSvgDrawLines\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["style"],"sources":["../../../src/components/svg-draw-lines/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { normalizeNumber } from '@/shared/normalize'\nimport { prefersReducedMotion } from '@/shared/theme/reduced-motion'\n\nimport style from './style.css?inline'\n\nconst GEOMETRY_SELECTOR = 'path, rect, circle, line, polyline, polygon, ellipse'\n// Animate a registered length, then clamp it before using it as a dash offset.\nconst DASH_OFFSET_PROPERTY = '--wui-svg-draw-lines-offset'\n\nlet dashOffsetRegistrationApi: typeof CSS.registerProperty | undefined\nlet dashOffsetInterpolationSupported: boolean | undefined\n\nfunction isAlreadyRegistered(error: unknown): boolean {\n return (\n typeof DOMException !== 'undefined' && error instanceof DOMException && error.name === 'InvalidModificationError'\n )\n}\n\nfunction supportsDashOffsetInterpolation(): boolean {\n const probe = document.createElement('span')\n let animation: Animation | undefined\n try {\n probe.style.setProperty(DASH_OFFSET_PROPERTY, '0px')\n document.documentElement.append(probe)\n animation = probe.animate([{ [DASH_OFFSET_PROPERTY]: '0px' }, { [DASH_OFFSET_PROPERTY]: '100px' }], {\n duration: 1000,\n easing: 'linear',\n fill: 'both'\n })\n animation.pause()\n animation.currentTime = 250\n\n const interpolated = Number.parseFloat(getComputedStyle(probe).getPropertyValue(DASH_OFFSET_PROPERTY))\n return Number.isFinite(interpolated) && Math.abs(interpolated - 25) < 0.1\n } catch (error) {\n console.warn('web-ui-svg-draw-lines could not verify typed offset interpolation. Using linear easing.', error)\n return false\n } finally {\n animation?.cancel()\n probe.remove()\n }\n}\n\nfunction registerDashOffsetProperty(): boolean {\n if (typeof CSS === 'undefined' || typeof CSS.registerProperty !== 'function' || typeof document === 'undefined')\n return false\n\n const registerProperty = CSS.registerProperty\n if (dashOffsetRegistrationApi !== registerProperty) {\n // Capability is cached only for the registration implementation that passed the probe.\n dashOffsetRegistrationApi = registerProperty\n dashOffsetInterpolationSupported = undefined\n }\n if (dashOffsetInterpolationSupported !== undefined) return dashOffsetInterpolationSupported\n\n try {\n CSS.registerProperty({\n name: DASH_OFFSET_PROPERTY,\n syntax: '<length>',\n inherits: false,\n initialValue: '0px'\n })\n } catch (error) {\n if (!isAlreadyRegistered(error)) {\n console.warn('web-ui-svg-draw-lines could not register its typed offset property. Using linear easing.', error)\n dashOffsetInterpolationSupported = false\n return false\n }\n }\n\n dashOffsetInterpolationSupported = supportsDashOffsetInterpolation()\n return dashOffsetInterpolationSupported\n}\n\ninterface AnimationRun {\n reverse: boolean\n animations: Animation[]\n /** 本次运行写过的「空白」dash 值,按元素记;收回收尾要把它留在 DOM 上。 */\n blankByElement: Map<SVGGeometryElement, string>\n patchedD: Map<SVGGeometryElement, string>\n}\n\nexport interface ReplayOptions {\n /** 沿原路径收回(从完整描边画回空白),默认 false 即揭示方向。 */\n reverse?: boolean\n}\n\n@customElement('web-ui-svg-draw-lines')\nexport class WebUiSvgDrawLines extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: Number, reflect: true })\n get duration(): number {\n return this._duration\n }\n set duration(v: number) {\n const old = this._duration\n this._duration = normalizeNumber(v, 0, 30000, 1000)\n this.requestUpdate('duration', old)\n }\n private _duration = 1000\n\n @property({ type: String, reflect: true }) easing = 'linear'\n\n /** 关掉「首次内容稳定时自动播放一次」,交给调用方用 replay() 决定何时播。 */\n @property({ type: Boolean, reflect: true, attribute: 'no-autoplay' }) noAutoplay = false\n\n private _activeRun: AnimationRun | undefined\n private _hasAutoPlayed = false\n /*\n * 消费者自己写在目标元素上的 dash 值,只在第一次碰到该元素时取一次。运行会把这两个属性改成\n * 自己的空白值,所以不能从「上一次运行之后」的状态重新取,否则画入收尾会把空白当成原值。\n */\n private readonly _authoredDash = new WeakMap<SVGGeometryElement, { dasharray: string; dashoffset: string }>()\n /** 收回留在元素上的「空白」,只有内联那两个值都还是我们自己写的那一份时才算数。 */\n private readonly _stickyBlank = new WeakMap<SVGGeometryElement, { dasharray: string; dashoffset: string }>()\n\n /**\n * 停止当前播放并重新开始。每次调用重新收集子树中的几何元素。\n * 所有元素同时开始并行的 stroke-dashoffset 动画。\n * options.reverse 为 true 时沿原路径收回。\n * 无目标或当前主题范围启用 reduced motion 时立即 resolve。\n */\n async replay(options: ReplayOptions = {}): Promise<void> {\n const reverse = options.reverse === true\n\n this.cancelAll()\n\n const targets = this.collectGeometryElements()\n\n if (prefersReducedMotion(this)) {\n // 不播,但上一次收回提交的空白要清掉:reduced motion 下可见性完全交给消费者的 opacity,\n // 留着空白就会出现「aria-checked=true 却看不见勾」,而之后每次 replay 都会同样早退、无法自愈。\n for (const el of targets) this.clearStickyBlank(el)\n return\n }\n\n if (targets.length === 0) return\n\n const run: AnimationRun = {\n reverse,\n animations: [],\n blankByElement: new Map(),\n patchedD: new Map()\n }\n this._activeRun = run\n\n await Promise.all(targets.map(el => this.animateElement(el, run, reverse)))\n\n // A later replay owns the current DOM state and must not be cleaned up here.\n if (this._activeRun !== run) return\n\n this.finishRun(run)\n }\n\n private cancelAll() {\n if (this._activeRun) this.finishRun(this._activeRun)\n }\n\n /*\n * 收尾分两个方向:画线还原消费者自己写的 dash(描边完整可见),收回把空白留在内联样式上\n * (整条路径落进 dash 间隙,看不见)。收回末态必须是 DOM 状态,不能是「一条还活着的\n * fill:forwards 动画」——元素被摘走再挂回(列表 key 重排、teleport)时,还原成完整描边的\n * 那份内联值会让勾当场复现,而控件已经是未勾选。\n */\n private finishRun(run: AnimationRun) {\n run.animations.forEach(anim => anim.cancel())\n\n for (const [el, d] of run.patchedD) {\n el.setAttribute('d', d)\n }\n\n for (const [el, blank] of run.blankByElement) {\n const authored = this._authoredDash.get(el)\n if (run.reverse) {\n el.style.strokeDasharray = blank\n el.style.strokeDashoffset = blank\n // 存回读值而不是写入值:CSSOM 会按自己的精度序列化,撤销时要按同一份文本比对。\n this._stickyBlank.set(el, { dasharray: el.style.strokeDasharray, dashoffset: el.style.strokeDashoffset })\n } else {\n el.style.strokeDasharray = authored?.dasharray ?? ''\n el.style.strokeDashoffset = authored?.dashoffset ?? ''\n this._stickyBlank.delete(el)\n }\n\n el.style.removeProperty(DASH_OFFSET_PROPERTY)\n }\n\n if (this._activeRun === run) this._activeRun = undefined\n }\n\n /** 只撤销我们自己写进去的那一份空白;消费者后来动过内联的任一个值就不碰。 */\n private clearStickyBlank(el: SVGGeometryElement) {\n const blank = this._stickyBlank.get(el)\n if (\n blank === undefined ||\n el.style.strokeDasharray !== blank.dasharray ||\n el.style.strokeDashoffset !== blank.dashoffset\n )\n return\n\n const authored = this._authoredDash.get(el)\n el.style.strokeDasharray = authored?.dasharray ?? ''\n el.style.strokeDashoffset = authored?.dashoffset ?? ''\n this._stickyBlank.delete(el)\n }\n\n /**\n * 深度遍历组件的 light DOM 子节点与开放 Shadow Root,\n * 收集所有 SVGGeometryElement。closed shadow root 跳过。\n */\n private collectGeometryElements(): SVGGeometryElement[] {\n const elements: SVGGeometryElement[] = []\n const seen = new Set<SVGGeometryElement>()\n\n const walk = (root: Node) => {\n if (root instanceof Element || root instanceof DocumentFragment) {\n root.querySelectorAll(GEOMETRY_SELECTOR).forEach(el => {\n // instanceof SVGGeometryElement 在 jsdom 中未定义,使用 duck-type 检查\n if (\n typeof (el as unknown as Record<string, unknown>).getTotalLength === 'function' &&\n !seen.has(el as unknown as SVGGeometryElement)\n ) {\n seen.add(el as unknown as SVGGeometryElement)\n elements.push(el as unknown as SVGGeometryElement)\n }\n })\n }\n\n if (root instanceof Element) {\n for (const child of root.children) walk(child)\n if (root.shadowRoot) walk(root.shadowRoot)\n } else if (root instanceof ShadowRoot) {\n for (const child of root.children) walk(child)\n }\n }\n\n for (const child of this.children) walk(child)\n return elements\n }\n\n private animateElement(el: SVGGeometryElement, run: AnimationRun, reverse: boolean): Promise<void> {\n return new Promise(resolve => {\n if (!this._authoredDash.has(el)) {\n this._authoredDash.set(el, {\n dasharray: el.style.strokeDasharray,\n dashoffset: el.style.strokeDashoffset\n })\n }\n\n if (el.tagName === 'path') {\n const d = el.getAttribute('d')\n if (d && /[Zz]\\s*$/.test(d) && !run.patchedD.has(el)) {\n run.patchedD.set(el, d)\n el.setAttribute('d', this.fixPathGap(el, d))\n }\n }\n\n const strokeWidth = parseFloat(getComputedStyle(el).strokeWidth) || 0\n const len = el.getTotalLength() + strokeWidth\n // 空白 = 整条路径落在 dash 间隙里;满 = 偏移归零。两个方向只是这两端换先后。\n const blank = `${len}`\n const from = reverse ? 0 : len\n const to = reverse ? len : 0\n\n const canClampOvershoot = registerDashOffsetProperty()\n el.style.strokeDasharray = blank\n if (canClampOvershoot) {\n el.style.setProperty(DASH_OFFSET_PROPERTY, `${from}px`)\n el.style.strokeDashoffset = `clamp(0px, var(${DASH_OFFSET_PROPERTY}), ${blank}px)`\n } else {\n // Older engines cannot interpolate the registered helper property. Animate the real offset\n // with a bounded easing so replay still works without letting an overshoot crop the path.\n el.style.removeProperty(DASH_OFFSET_PROPERTY)\n el.style.strokeDashoffset = `${from}px`\n }\n run.blankByElement.set(el, blank)\n\n const property = canClampOvershoot ? DASH_OFFSET_PROPERTY : 'strokeDashoffset'\n const anim = el.animate([{ [property]: `${from}px` }, { [property]: `${to}px` }], {\n duration: this.duration,\n easing: canClampOvershoot ? this.easing : 'linear',\n fill: 'forwards'\n })\n\n run.animations.push(anim)\n\n anim.onfinish = () => {\n resolve()\n }\n\n anim.oncancel = () => {\n resolve()\n }\n })\n }\n\n // Z → explicit line back to start + 0.1px extra, forcing render of the closing segment\n private fixPathGap(pathEl: SVGPathElement, d: string): string {\n pathEl.setAttribute('d', d)\n const p0 = pathEl.getPointAtLength(0)\n const p1 = pathEl.getPointAtLength(0.1)\n return d.replace(/[Zz]\\s*$/, `L${p0.x.toFixed(3)} ${p0.y.toFixed(3)} L${p1.x.toFixed(3)} ${p1.y.toFixed(3)}`)\n }\n\n // 首次 slot 内容稳定后自动播放一次;no-autoplay 下这一步交给调用方的 replay()。\n private handleSlotChange() {\n if (this.noAutoplay || this._hasAutoPlayed) return\n this._hasAutoPlayed = true\n void this.replay()\n }\n\n override disconnectedCallback() {\n this.cancelAll()\n super.disconnectedCallback()\n }\n\n override render() {\n return html`<slot @slotchange=${this.handleSlotChange}></slot>`\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-svg-draw-lines': WebUiSvgDrawLines\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
export { e as default };
|
|
1
|
+
// src/components/svg-draw-lines/style.css?inline
|
|
2
|
+
var style_default = "*,:before,:after{box-sizing:border-box}:host{-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;line-height:0;display:inline-flex}\n";
|
|
3
|
+
export { style_default as default };
|
|
5
4
|
|
|
6
5
|
//# sourceMappingURL=style.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/svg-draw-lines/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* 行为型包裹器:inline-flex + line-height:0 使宿主盒高收缩到被包裹内容(不引入\n inline-block 的行盒导致 24px 抬升),同时宿主仍是可 transform 的盒子——interweave\n prototype 依赖对宿主的 scale 动画(#126)。 */\n:host {\n user-select: none;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n line-height: 0;\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/svg-draw-lines/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* 行为型包裹器:inline-flex + line-height:0 使宿主盒高收缩到被包裹内容(不引入\n inline-block 的行盒导致 24px 抬升),同时宿主仍是可 transform 的盒子——interweave\n prototype 依赖对宿主的 scale 动画(#126)。 */\n:host {\n user-select: none;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n line-height: 0;\n}\n"],"mappings":";AAAA,IAAA,gBAAA"}
|