@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,170 +1,324 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { normalizeNumber
|
|
3
|
-
import { ElementWidthController
|
|
4
|
-
import
|
|
5
|
-
import { truncateMiddle
|
|
6
|
-
import { LitElement
|
|
7
|
-
import { customElement
|
|
8
|
-
import { ifDefined
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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 { ElementWidthController } from "../../shared/element-width/index.js";
|
|
4
|
+
import style_default from "./style.js";
|
|
5
|
+
import { truncateMiddle } from "./truncate.js";
|
|
6
|
+
import { LitElement, html, unsafeCSS } from "lit";
|
|
7
|
+
import { customElement, property, query } from "lit/decorators.js";
|
|
8
|
+
import { ifDefined } from "lit/directives/if-defined.js";
|
|
9
|
+
// src/components/middle-ellipsis/index.ts
|
|
10
|
+
const MIN_POSITION = 0;
|
|
11
|
+
const MAX_POSITION = 100;
|
|
12
|
+
const DEFAULT_POSITION = 50;
|
|
13
|
+
/**
|
|
14
|
+
* 合串复核的容差与轮数上限。
|
|
15
|
+
*
|
|
16
|
+
* 分段预算看不见两个接缝处的字距,实测偏差在亚像素量级:容差取 0.5px 吸收它。
|
|
17
|
+
* 轮数上限是纯防御,不是常规路径:实测四种形态(等宽 ASCII 文件名、CJK 长串、无空格长串、
|
|
18
|
+
* emoji/ZWJ 混排)各挂载一次,`_apply` 每次都只被调用一次——复核自己会再调一次 `_apply`,
|
|
19
|
+
* 所以调用次数就是拟合次数,一次意味着复核一轮都没触发。这条上限防的是「标记被调用方撑得比
|
|
20
|
+
* 容器还宽」这类退化输入。
|
|
21
|
+
*/
|
|
22
|
+
const OVERFLOW_TOLERANCE = .5;
|
|
23
|
+
const MAX_REFINE_ROUNDS = 3;
|
|
24
|
+
/**
|
|
25
|
+
* 可用宽度变化的感知阈(px)。
|
|
26
|
+
*
|
|
27
|
+
* `_currentWidth()` 走 `clientWidth`(整数),ResizeObserver 报的是 `contentRect.width`(分数),
|
|
28
|
+
* 同一个盒子在两条路径上最多差 0.5px 的取整误差。不设阈值时,观察者的首次回调会被当成一次「变宽」
|
|
29
|
+
* 而整份重算——实测挂载时两次 `_apply` 的入参都是同一个 240,也就是每次挂载白做一次二分。
|
|
30
|
+
* 0.5 同时压住了「跳过略小于半个像素的真实收缩」的代价:那个量级下输出最多溢出 0.5px,
|
|
31
|
+
* 与 `OVERFLOW_TOLERANCE` 视为可忽略的量级一致。
|
|
32
|
+
*/
|
|
33
|
+
const WIDTH_EPSILON = .5;
|
|
34
|
+
const measurementTargets = /* @__PURE__ */ new WeakMap();
|
|
35
|
+
let measurementObserver;
|
|
36
|
+
const fontMetricSubscribers = /* @__PURE__ */ new Set();
|
|
37
|
+
let observedFontSet;
|
|
38
|
+
function onFontsLoaded() {
|
|
39
|
+
for (const notify of fontMetricSubscribers) notify();
|
|
13
40
|
}
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
|
|
41
|
+
function observeFontMetrics(notify) {
|
|
42
|
+
const fontSet = document.fonts;
|
|
43
|
+
if (!fontSet) return;
|
|
44
|
+
if (!observedFontSet) {
|
|
45
|
+
observedFontSet = fontSet;
|
|
46
|
+
observedFontSet.addEventListener("loadingdone", onFontsLoaded);
|
|
47
|
+
}
|
|
48
|
+
fontMetricSubscribers.add(notify);
|
|
17
49
|
}
|
|
18
|
-
function
|
|
19
|
-
|
|
50
|
+
function unobserveFontMetrics(notify) {
|
|
51
|
+
fontMetricSubscribers.delete(notify);
|
|
52
|
+
if (fontMetricSubscribers.size > 0 || !observedFontSet) return;
|
|
53
|
+
observedFontSet.removeEventListener("loadingdone", onFontsLoaded);
|
|
54
|
+
observedFontSet = void 0;
|
|
20
55
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
56
|
+
/** Observe the full-text probe so font metric changes can refit without a host resize. */
|
|
57
|
+
function getMeasurementObserver() {
|
|
58
|
+
if (typeof ResizeObserver === "undefined") return null;
|
|
59
|
+
if (measurementObserver) return measurementObserver;
|
|
60
|
+
measurementObserver = new ResizeObserver((entries) => {
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
const target = measurementTargets.get(entry.target);
|
|
63
|
+
if (!target) continue;
|
|
64
|
+
const text = entry.target.textContent;
|
|
65
|
+
const width = entry.contentRect.width;
|
|
66
|
+
if (target.text !== text) {
|
|
67
|
+
target.text = text;
|
|
68
|
+
target.width = width;
|
|
29
69
|
continue;
|
|
30
70
|
}
|
|
31
|
-
if (
|
|
32
|
-
|
|
71
|
+
if (target.width < 0) {
|
|
72
|
+
target.width = width;
|
|
33
73
|
continue;
|
|
34
74
|
}
|
|
35
|
-
|
|
75
|
+
if (target.width === width) continue;
|
|
76
|
+
target.width = width;
|
|
77
|
+
target.notify();
|
|
36
78
|
}
|
|
37
|
-
})
|
|
79
|
+
});
|
|
80
|
+
return measurementObserver;
|
|
38
81
|
}
|
|
39
|
-
function
|
|
40
|
-
|
|
41
|
-
notify
|
|
42
|
-
text:
|
|
82
|
+
function observeMeasurement(target, notify) {
|
|
83
|
+
measurementTargets.set(target, {
|
|
84
|
+
notify,
|
|
85
|
+
text: target.textContent,
|
|
43
86
|
width: -1
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
|
|
87
|
+
});
|
|
88
|
+
observeFontMetrics(notify);
|
|
89
|
+
const observer = getMeasurementObserver();
|
|
90
|
+
if (!observer) return;
|
|
91
|
+
observer.observe(target, { box: "content-box" });
|
|
47
92
|
}
|
|
48
|
-
function
|
|
49
|
-
|
|
50
|
-
|
|
93
|
+
function unobserveMeasurement(target) {
|
|
94
|
+
const observation = measurementTargets.get(target);
|
|
95
|
+
if (observation) unobserveFontMetrics(observation.notify);
|
|
96
|
+
measurementTargets.delete(target);
|
|
97
|
+
measurementObserver?.unobserve(target);
|
|
51
98
|
}
|
|
52
|
-
function
|
|
53
|
-
|
|
54
|
-
|
|
99
|
+
function updateMeasurementText(target, text) {
|
|
100
|
+
const observation = measurementTargets.get(target);
|
|
101
|
+
if (!observation) return;
|
|
102
|
+
observation.text = text;
|
|
103
|
+
observation.width = target.getBoundingClientRect().width;
|
|
55
104
|
}
|
|
56
|
-
|
|
57
|
-
constructor(...
|
|
58
|
-
super(...
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
105
|
+
let WebUiMiddleEllipsis = class WebUiMiddleEllipsis extends LitElement {
|
|
106
|
+
constructor(..._args) {
|
|
107
|
+
super(..._args);
|
|
108
|
+
this.text = "";
|
|
109
|
+
this._marker = "…";
|
|
110
|
+
this._markerPosition = DEFAULT_POSITION;
|
|
111
|
+
this._display = "";
|
|
112
|
+
this._truncated = false;
|
|
113
|
+
this._available = -1;
|
|
114
|
+
this._observedWidth = -1;
|
|
115
|
+
this._rendered = 0;
|
|
116
|
+
this._dirty = true;
|
|
117
|
+
this._refineRound = 0;
|
|
118
|
+
this._range = document.createRange();
|
|
119
|
+
this._width = new ElementWidthController(this, (width) => this._onWidth(width));
|
|
120
|
+
this._onMeasurementChange = () => {
|
|
121
|
+
this._refineRound = 0;
|
|
122
|
+
this._dirty = true;
|
|
123
|
+
this._apply(this._observedWidth > 0 ? this._observedWidth : this._currentWidth());
|
|
124
|
+
};
|
|
125
|
+
this._probe = {
|
|
126
|
+
prefix: (units) => this._rangeWidth(0, units),
|
|
127
|
+
suffix: (units) => this._rangeWidth(this.text.length - units, this.text.length),
|
|
63
128
|
marker: () => this._markerProbe?.getBoundingClientRect().width ?? 0
|
|
64
129
|
};
|
|
65
130
|
}
|
|
66
131
|
static {
|
|
67
|
-
this.styles = [
|
|
132
|
+
this.styles = [unsafeCSS(style_default)];
|
|
68
133
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
134
|
+
/** 中间插入的标记,默认 `…`(U+2026)。空串即「只截断不给信号」,是否这样用由调用方判断。 */
|
|
135
|
+
set marker(value) {
|
|
136
|
+
const next = value ?? "…";
|
|
137
|
+
if (this._marker !== next) {
|
|
138
|
+
const old = this._marker;
|
|
139
|
+
this._marker = next;
|
|
140
|
+
this.requestUpdate("marker", old);
|
|
74
141
|
}
|
|
75
|
-
this.getAttribute("marker") !==
|
|
142
|
+
if (this.getAttribute("marker") !== next) this.setAttribute("marker", next);
|
|
76
143
|
}
|
|
77
144
|
get marker() {
|
|
78
145
|
return this._marker;
|
|
79
146
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
147
|
+
/**
|
|
148
|
+
* 标记所在的横向比例,0–100,默认 `50`(居中)。
|
|
149
|
+
*
|
|
150
|
+
* 与 CSSWG css-overflow-5 的 `text-overflow: ellipsis <length-percentage>` 同向:量的是标记
|
|
151
|
+
* 结束边距行末边的距离占可用行内空间的比例。`0` 只剩头部(等价于末尾省略),`100` 只剩尾部。
|
|
152
|
+
* 文件名这类「头部是路径噪声、尾部才是扩展名」的场景用**大于** 50 的值让尾部多留一些。
|
|
153
|
+
*/
|
|
154
|
+
set markerPosition(value) {
|
|
155
|
+
const normalized = normalizeNumber(value, MIN_POSITION, MAX_POSITION, DEFAULT_POSITION);
|
|
156
|
+
if (this._markerPosition !== normalized) {
|
|
157
|
+
const old = this._markerPosition;
|
|
158
|
+
this._markerPosition = normalized;
|
|
159
|
+
this.requestUpdate("markerPosition", old);
|
|
85
160
|
}
|
|
86
|
-
this.getAttribute("marker-position") !== String(
|
|
161
|
+
if (this.getAttribute("marker-position") !== String(normalized)) this.setAttribute("marker-position", String(normalized));
|
|
87
162
|
}
|
|
88
163
|
get markerPosition() {
|
|
89
164
|
return this._markerPosition;
|
|
90
165
|
}
|
|
91
166
|
connectedCallback() {
|
|
92
|
-
super.connectedCallback()
|
|
167
|
+
super.connectedCallback();
|
|
168
|
+
if (this._available >= 0) {
|
|
169
|
+
this._dirty = true;
|
|
170
|
+
this._refineRound = 0;
|
|
171
|
+
}
|
|
172
|
+
this._observeMeasure();
|
|
93
173
|
}
|
|
94
174
|
disconnectedCallback() {
|
|
95
|
-
|
|
175
|
+
if (this._observedMeasure) {
|
|
176
|
+
unobserveMeasurement(this._observedMeasure);
|
|
177
|
+
this._observedMeasure = void 0;
|
|
178
|
+
}
|
|
179
|
+
super.disconnectedCallback();
|
|
96
180
|
}
|
|
97
|
-
willUpdate(
|
|
98
|
-
(
|
|
181
|
+
willUpdate(changed) {
|
|
182
|
+
if (!changed.has("text") && !changed.has("marker") && !changed.has("markerPosition")) return;
|
|
183
|
+
this._dirty = true;
|
|
184
|
+
this._display = this.text;
|
|
185
|
+
this._truncated = false;
|
|
99
186
|
}
|
|
100
187
|
updated() {
|
|
101
|
-
|
|
102
|
-
if (
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
if (this._truncated && this._rendered > this._available + h) {
|
|
108
|
-
if (this._refineRound < g) {
|
|
109
|
-
this._refineRound += 1;
|
|
110
|
-
let e = this._available - (this._rendered - this._available) - h;
|
|
111
|
-
this._defer(() => this._apply(e));
|
|
112
|
-
}
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
188
|
+
const textEl = this._textEl;
|
|
189
|
+
if (!textEl || !this.isConnected) return;
|
|
190
|
+
this._observeMeasure();
|
|
191
|
+
this._rendered = textEl.getBoundingClientRect().width;
|
|
192
|
+
if (this._dirty) {
|
|
115
193
|
this._refineRound = 0;
|
|
194
|
+
this._defer(() => this._apply(this._currentWidth()));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (this._truncated && this._rendered > this._available + OVERFLOW_TOLERANCE) {
|
|
198
|
+
if (this._refineRound < MAX_REFINE_ROUNDS) {
|
|
199
|
+
this._refineRound += 1;
|
|
200
|
+
const tighter = this._available - (this._rendered - this._available) - OVERFLOW_TOLERANCE;
|
|
201
|
+
this._defer(() => this._apply(tighter));
|
|
202
|
+
}
|
|
203
|
+
return;
|
|
116
204
|
}
|
|
205
|
+
this._refineRound = 0;
|
|
117
206
|
}
|
|
118
|
-
|
|
119
|
-
|
|
207
|
+
/**
|
|
208
|
+
* 容器宽度变化。
|
|
209
|
+
*
|
|
210
|
+
* 收缩方向带一条收敛守卫:宿主宽度由内容决定时(flex 主轴 `auto`、或 `width: fit-content` 在内容
|
|
211
|
+
* 缩到容器以内之后),把自己截短会反过来把宿主量窄,于是排下一次尺寸回调。这个自驱动收缩**可能**
|
|
212
|
+
* 一路棘轮到只剩标记,是否发生取决于度量:
|
|
213
|
+
*
|
|
214
|
+
* - flex + 等宽 16px + 默认 50%:缩掉的量小于一个簇宽时,重新二分落回同一组切点,走一步就停。
|
|
215
|
+
* - `width: fit-content` + `marker-position: 80` + CJK:每个簇都是整宽块,切短一簇与宿主窄一簇
|
|
216
|
+
* 互相咬合,摘掉本守卫后 300px 容器里逐帧 282→266→…→10,九步塌到只剩标记(同仓 browser spec
|
|
217
|
+
* 的「fit-content 宿主 + 非居中标记」用例钉住了这一条)。
|
|
218
|
+
*
|
|
219
|
+
* 判据因此取「当前输出已经放得下」:放得下就没有必须重切的理由,自驱动收缩在第一步就停,与度量
|
|
220
|
+
* 无关;真正的容器收缩会让输出宽于新宽度,那时才重切。放长方向没有这个问题,一律重切(可能能
|
|
221
|
+
* 少截一些)。
|
|
222
|
+
*/
|
|
223
|
+
_onWidth(width) {
|
|
224
|
+
this._observedWidth = width;
|
|
225
|
+
if (!(width > 0)) return;
|
|
226
|
+
if (!this._dirty) {
|
|
227
|
+
if (this._available >= 0 && Math.abs(width - this._available) <= WIDTH_EPSILON) return;
|
|
228
|
+
if (this._available >= 0 && width < this._available && this._rendered <= width + OVERFLOW_TOLERANCE) return;
|
|
229
|
+
}
|
|
230
|
+
this._refineRound = 0;
|
|
231
|
+
this._apply(width);
|
|
120
232
|
}
|
|
121
|
-
|
|
122
|
-
|
|
233
|
+
/**
|
|
234
|
+
* 把一次重切排到当前更新周期之外。
|
|
235
|
+
*
|
|
236
|
+
* 重切只能在渲染之后量到宽度才做得了,所以第二次更新是必然的;区别只在它从哪里排出去。
|
|
237
|
+
* 微任务仍排在下一帧渲染之前,画面不会先闪一版全文,而 `updated()` 返回时更新已不再是
|
|
238
|
+
* pending,Lit 的 `change-in-update` 警告不会触发。
|
|
239
|
+
*/
|
|
240
|
+
_defer(fit) {
|
|
241
|
+
queueMicrotask(fit);
|
|
123
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* 同步可读的可用行内空间。
|
|
245
|
+
*
|
|
246
|
+
* ResizeObserver 的回调在布局之后才到,属性刚改完的那一帧还没有宽度可用;用 `.root` 的
|
|
247
|
+
* 内容盒补上,免得先按全文画一帧再切。jsdom 没有布局,读到的 0 由 `_apply` 跳过。
|
|
248
|
+
*/
|
|
124
249
|
_currentWidth() {
|
|
125
250
|
return this._root?.clientWidth ?? 0;
|
|
126
251
|
}
|
|
127
|
-
|
|
128
|
-
|
|
252
|
+
/**
|
|
253
|
+
* 按可用宽度切分并写回渲染结果。
|
|
254
|
+
*
|
|
255
|
+
* 宽度为 0(没有布局)时什么都不做,**并且保留 `_dirty`**:宿主不可见期间改 text 时这一趟
|
|
256
|
+
* 必然被跳过,若在这里就把「有未落的拟合」清掉,等它重新有布局时就没有任何东西记得要切了。
|
|
257
|
+
* 清标记因此只发生在真的切完之后。
|
|
258
|
+
*/
|
|
259
|
+
_apply(available) {
|
|
260
|
+
if (!(available > 0)) return;
|
|
129
261
|
this._syncMeasure();
|
|
130
|
-
|
|
131
|
-
this._available =
|
|
262
|
+
const result = truncateMiddle(this.text, this._marker, this._markerPosition, available, this._probe);
|
|
263
|
+
this._available = available;
|
|
264
|
+
this._dirty = false;
|
|
265
|
+
this._settle(result.truncated ? result.head + this._marker + result.tail : this.text, result.truncated);
|
|
132
266
|
}
|
|
133
|
-
_settle(
|
|
134
|
-
(this._display
|
|
267
|
+
_settle(display, truncated) {
|
|
268
|
+
if (this._display === display && this._truncated === truncated) return;
|
|
269
|
+
this._display = display;
|
|
270
|
+
this._truncated = truncated;
|
|
271
|
+
this.requestUpdate();
|
|
135
272
|
}
|
|
273
|
+
/** 把全文装进隐藏量具。它没有 Lit 绑定,改它不会触发重渲染。 */
|
|
136
274
|
_syncMeasure() {
|
|
137
|
-
|
|
138
|
-
|
|
275
|
+
const measure = this._measure;
|
|
276
|
+
if (measure && measure.textContent !== this.text) {
|
|
277
|
+
measure.textContent = this.text;
|
|
278
|
+
updateMeasurementText(measure, this.text);
|
|
279
|
+
}
|
|
139
280
|
}
|
|
140
281
|
_observeMeasure() {
|
|
141
|
-
|
|
142
|
-
|
|
282
|
+
const measure = this._measure;
|
|
283
|
+
if (!measure || measure === this._observedMeasure) return;
|
|
284
|
+
if (this._observedMeasure) unobserveMeasurement(this._observedMeasure);
|
|
285
|
+
this._observedMeasure = measure;
|
|
286
|
+
observeMeasurement(measure, this._onMeasurementChange);
|
|
143
287
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
288
|
+
/** `[from, to)` 这段原文在量具里的渲染宽度。空区间恒为 0——Range 塌缩矩形的宽度不可靠。 */
|
|
289
|
+
_rangeWidth(from, to) {
|
|
290
|
+
if (to <= from) return 0;
|
|
291
|
+
const node = this._measure?.firstChild;
|
|
292
|
+
if (!(node instanceof Text)) return 0;
|
|
293
|
+
this._range.setStart(node, from);
|
|
294
|
+
this._range.setEnd(node, to);
|
|
295
|
+
return this._range.getBoundingClientRect().width;
|
|
148
296
|
}
|
|
149
297
|
render() {
|
|
150
|
-
return
|
|
298
|
+
return html`
|
|
151
299
|
<div class="root">
|
|
152
|
-
<span class="text" title=${
|
|
300
|
+
<span class="text" title=${ifDefined(this._truncated ? this.text : void 0)}>${this._display}</span>
|
|
153
301
|
<span class="measure"></span>
|
|
154
302
|
<span class="marker-probe" aria-hidden="true">${this._marker}</span>
|
|
155
303
|
</div>
|
|
156
304
|
`;
|
|
157
305
|
}
|
|
158
306
|
};
|
|
159
|
-
|
|
307
|
+
__decorate([property({ type: String })], WebUiMiddleEllipsis.prototype, "text", void 0);
|
|
308
|
+
__decorate([property({
|
|
160
309
|
type: String,
|
|
161
|
-
reflect:
|
|
162
|
-
})],
|
|
310
|
+
reflect: true
|
|
311
|
+
})], WebUiMiddleEllipsis.prototype, "marker", null);
|
|
312
|
+
__decorate([property({
|
|
163
313
|
type: Number,
|
|
164
|
-
reflect:
|
|
314
|
+
reflect: true,
|
|
165
315
|
attribute: "marker-position"
|
|
166
|
-
})],
|
|
167
|
-
|
|
168
|
-
|
|
316
|
+
})], WebUiMiddleEllipsis.prototype, "markerPosition", null);
|
|
317
|
+
__decorate([query(".root")], WebUiMiddleEllipsis.prototype, "_root", void 0);
|
|
318
|
+
__decorate([query(".text")], WebUiMiddleEllipsis.prototype, "_textEl", void 0);
|
|
319
|
+
__decorate([query(".measure")], WebUiMiddleEllipsis.prototype, "_measure", void 0);
|
|
320
|
+
__decorate([query(".marker-probe")], WebUiMiddleEllipsis.prototype, "_markerProbe", void 0);
|
|
321
|
+
WebUiMiddleEllipsis = __decorate([customElement("web-ui-middle-ellipsis")], WebUiMiddleEllipsis);
|
|
322
|
+
export { WebUiMiddleEllipsis };
|
|
169
323
|
|
|
170
324
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/middle-ellipsis/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS, type PropertyValues } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\n\nimport { ElementWidthController } from '@/shared/element-width'\nimport { normalizeNumber } from '@/shared/normalize'\n\nimport style from './style.css?inline'\nimport { DEFAULT_MARKER, truncateMiddle, type WidthProbe } from './truncate'\n\nconst MIN_POSITION = 0\nconst MAX_POSITION = 100\nconst DEFAULT_POSITION = 50\n\n/**\n * 合串复核的容差与轮数上限。\n *\n * 分段预算看不见两个接缝处的字距,实测偏差在亚像素量级:容差取 0.5px 吸收它。\n * 轮数上限是纯防御,不是常规路径:实测四种形态(等宽 ASCII 文件名、CJK 长串、无空格长串、\n * emoji/ZWJ 混排)各挂载一次,`_apply` 每次都只被调用一次——复核自己会再调一次 `_apply`,\n * 所以调用次数就是拟合次数,一次意味着复核一轮都没触发。这条上限防的是「标记被调用方撑得比\n * 容器还宽」这类退化输入。\n */\nconst OVERFLOW_TOLERANCE = 0.5\nconst MAX_REFINE_ROUNDS = 3\n\n/**\n * 可用宽度变化的感知阈(px)。\n *\n * `_currentWidth()` 走 `clientWidth`(整数),ResizeObserver 报的是 `contentRect.width`(分数),\n * 同一个盒子在两条路径上最多差 0.5px 的取整误差。不设阈值时,观察者的首次回调会被当成一次「变宽」\n * 而整份重算——实测挂载时两次 `_apply` 的入参都是同一个 240,也就是每次挂载白做一次二分。\n * 0.5 同时压住了「跳过略小于半个像素的真实收缩」的代价:那个量级下输出最多溢出 0.5px,\n * 与 `OVERFLOW_TOLERANCE` 视为可忽略的量级一致。\n */\nconst WIDTH_EPSILON = 0.5\n\ninterface MeasurementTarget {\n readonly notify: () => void\n text: string | null\n width: number\n}\n\nconst measurementTargets = new WeakMap<Element, MeasurementTarget>()\nlet measurementObserver: ResizeObserver | undefined\nconst fontMetricSubscribers = new Set<() => void>()\nlet observedFontSet: FontFaceSet | undefined\n\nfunction onFontsLoaded(): void {\n for (const notify of fontMetricSubscribers) notify()\n}\n\nfunction observeFontMetrics(notify: () => void): void {\n const fontSet = document.fonts\n if (!fontSet) return\n\n if (!observedFontSet) {\n observedFontSet = fontSet\n observedFontSet.addEventListener('loadingdone', onFontsLoaded)\n }\n fontMetricSubscribers.add(notify)\n}\n\nfunction unobserveFontMetrics(notify: () => void): void {\n fontMetricSubscribers.delete(notify)\n if (fontMetricSubscribers.size > 0 || !observedFontSet) return\n\n observedFontSet.removeEventListener('loadingdone', onFontsLoaded)\n observedFontSet = undefined\n}\n\n/** Observe the full-text probe so font metric changes can refit without a host resize. */\nfunction getMeasurementObserver(): ResizeObserver | null {\n if (typeof ResizeObserver === 'undefined') return null\n if (measurementObserver) return measurementObserver\n\n measurementObserver = new ResizeObserver(entries => {\n for (const entry of entries) {\n const target = measurementTargets.get(entry.target)\n if (!target) continue\n\n const text = entry.target.textContent\n const width = entry.contentRect.width\n if (target.text !== text) {\n target.text = text\n target.width = width\n continue\n }\n\n if (target.width < 0) {\n target.width = width\n continue\n }\n\n if (target.width === width) continue\n target.width = width\n target.notify()\n }\n })\n\n return measurementObserver\n}\n\nfunction observeMeasurement(target: Element, notify: () => void): void {\n measurementTargets.set(target, { notify, text: target.textContent, width: -1 })\n observeFontMetrics(notify)\n\n const observer = getMeasurementObserver()\n if (!observer) return\n\n observer.observe(target, { box: 'content-box' })\n}\n\nfunction unobserveMeasurement(target: Element): void {\n const observation = measurementTargets.get(target)\n if (observation) unobserveFontMetrics(observation.notify)\n measurementTargets.delete(target)\n measurementObserver?.unobserve(target)\n}\n\nfunction updateMeasurementText(target: Element, text: string): void {\n const observation = measurementTargets.get(target)\n if (!observation) return\n\n observation.text = text\n observation.width = target.getBoundingClientRect().width\n}\n\n/**\n * 单行中间省略:把超长文本截成 `首段…尾段`,省略号出现在中间而不是末尾。\n *\n * 适用面与 `text-overflow: ellipsis` 相同——**单行、且有确定宽度**。文本不换行,宽度由容器\n * 给出(块级盒子的包含块、flex 主轴的 `flex: 1`、grid track 都行)。宿主自撑宽度时不存在\n * 「可用空间」可言,组件按当时量到的宽度切一次就不再收缩(见 `_onWidth` 的收敛守卫)。\n *\n * 被丢掉的是中间那段,因此**选中复制拿到的是屏幕上这串**,不是原文;原文经 `title` 暴露,\n * 悬停可见。这条与 CSS 的 `text-overflow` 不同(那里文本节点没被动过、复制得到全文),是\n * JS 方案绕不开的代价,见 docs/research/web-ui-middle-ellipsis-261007.md。\n */\n@customElement('web-ui-middle-ellipsis')\nexport class WebUiMiddleEllipsis extends LitElement {\n static override styles = [unsafeCSS(style)]\n\n /** 要显示的完整文本。组件只读它,不回写。 */\n @property({ type: String }) text = ''\n\n /** 中间插入的标记,默认 `…`(U+2026)。空串即「只截断不给信号」,是否这样用由调用方判断。 */\n @property({ type: String, reflect: true })\n set marker(value: string) {\n const next = value ?? DEFAULT_MARKER\n if (this._marker !== next) {\n const old = this._marker\n this._marker = next\n this.requestUpdate('marker', old)\n }\n if (this.getAttribute('marker') !== next) this.setAttribute('marker', next)\n }\n\n get marker(): string {\n return this._marker\n }\n\n private _marker = DEFAULT_MARKER\n\n /**\n * 标记所在的横向比例,0–100,默认 `50`(居中)。\n *\n * 与 CSSWG css-overflow-5 的 `text-overflow: ellipsis <length-percentage>` 同向:量的是标记\n * 结束边距行末边的距离占可用行内空间的比例。`0` 只剩头部(等价于末尾省略),`100` 只剩尾部。\n * 文件名这类「头部是路径噪声、尾部才是扩展名」的场景用**大于** 50 的值让尾部多留一些。\n */\n @property({ type: Number, reflect: true, attribute: 'marker-position' })\n set markerPosition(value: number) {\n const normalized = normalizeNumber(value, MIN_POSITION, MAX_POSITION, DEFAULT_POSITION)\n if (this._markerPosition !== normalized) {\n const old = this._markerPosition\n this._markerPosition = normalized\n this.requestUpdate('markerPosition', old)\n }\n if (this.getAttribute('marker-position') !== String(normalized)) {\n this.setAttribute('marker-position', String(normalized))\n }\n }\n\n get markerPosition(): number {\n return this._markerPosition\n }\n\n private _markerPosition = DEFAULT_POSITION\n\n /*\n * 渲染结果用普通字段承载,不用 `@state`:切分只能在渲染之后量到真实宽度才算得出来,也就是说\n * 「改渲染结果」必然发生在更新周期里,而周期内的 `requestUpdate` 会被 Lit 记一条\n * `change-in-update` 警告——一个实例一条,一张千行的表就是一千条。改成普通字段 + 只在周期外\n * (ResizeObserver 回调、微任务)显式 `requestUpdate()`,渲染时机不变,警告消失。\n */\n private _display = ''\n private _truncated = false\n\n @query('.root') private _root?: HTMLElement\n @query('.text') private _textEl?: HTMLElement\n @query('.measure') private _measure?: HTMLElement\n @query('.marker-probe') private _markerProbe?: HTMLElement\n\n /** 最近一次切分依据的可用宽度(px);-1 表示还没量到过布局。 */\n private _available = -1\n /** 最近一次 ResizeObserver 测得的宿主内容盒宽度;收敛守卫跳过拟合时也继续更新。 */\n private _observedWidth = -1\n /** 当前渲染出来的文本实际占宽(px)。收敛守卫靠它判断现有输出是否已经放得下。 */\n private _rendered = 0\n /** 输入或字体度量变过、还没重新拟合。 */\n private _dirty = true\n private _refineRound = 0\n private _observedMeasure?: HTMLElement\n\n private readonly _range = document.createRange()\n\n private readonly _width = new ElementWidthController(this, width => this._onWidth(width))\n\n private readonly _onMeasurementChange = (): void => {\n this._refineRound = 0\n this._dirty = true\n // `_available` can predate a shrink; use the latest precise content-box width even when it skipped a refit.\n this._apply(this._observedWidth > 0 ? this._observedWidth : this._currentWidth())\n }\n\n private readonly _probe: WidthProbe = {\n prefix: units => this._rangeWidth(0, units),\n suffix: units => this._rangeWidth(this.text.length - units, this.text.length),\n marker: () => this._markerProbe?.getBoundingClientRect().width ?? 0\n }\n\n override connectedCallback(): void {\n super.connectedCallback()\n if (this._available >= 0) {\n this._dirty = true\n this._refineRound = 0\n }\n this._observeMeasure()\n }\n\n override disconnectedCallback(): void {\n if (this._observedMeasure) {\n unobserveMeasurement(this._observedMeasure)\n this._observedMeasure = undefined\n }\n super.disconnectedCallback()\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (!changed.has('text') && !changed.has('marker') && !changed.has('markerPosition')) return\n\n /*\n * 输入变了就先把渲染退回全文:上一版的切分是按旧文本算的,拿它渲染新文本会显示一段两个\n * 版本都不属于的串。真正的重切由 `updated()` 排进微任务,在同一帧渲染之前完成,所以用户\n * 看不到这个中间态。这里写普通字段,正是为了不在更新周期里再排一次更新。\n */\n this._dirty = true\n this._display = this.text\n this._truncated = false\n }\n\n override updated(): void {\n const textEl = this._textEl\n // Lit can finish an update after this host was removed. Resume fitting only after reconnect.\n if (!textEl || !this.isConnected) return\n\n this._observeMeasure()\n\n this._rendered = textEl.getBoundingClientRect().width\n\n if (this._dirty) {\n this._refineRound = 0\n this._defer(() => this._apply(this._currentWidth()))\n return\n }\n\n /*\n * 合串复核:分段预算只保证「首段和尾段各自没超额度」,接缝处的字距与连字能把合串推过\n * 边界,而这件事只有渲染出来的盒子量得到。超出时按超出量回收额度重切;轮数上限兜住\n * 「怎么切都放不下」的退化情形(例如调用方把标记撑得比容器还宽)。\n */\n if (this._truncated && this._rendered > this._available + OVERFLOW_TOLERANCE) {\n if (this._refineRound < MAX_REFINE_ROUNDS) {\n this._refineRound += 1\n const tighter = this._available - (this._rendered - this._available) - OVERFLOW_TOLERANCE\n this._defer(() => this._apply(tighter))\n }\n return\n }\n\n this._refineRound = 0\n }\n\n /**\n * 容器宽度变化。\n *\n * 收缩方向带一条收敛守卫:宿主宽度由内容决定时(flex 主轴 `auto`、或 `width: fit-content` 在内容\n * 缩到容器以内之后),把自己截短会反过来把宿主量窄,于是排下一次尺寸回调。这个自驱动收缩**可能**\n * 一路棘轮到只剩标记,是否发生取决于度量:\n *\n * - flex + 等宽 16px + 默认 50%:缩掉的量小于一个簇宽时,重新二分落回同一组切点,走一步就停。\n * - `width: fit-content` + `marker-position: 80` + CJK:每个簇都是整宽块,切短一簇与宿主窄一簇\n * 互相咬合,摘掉本守卫后 300px 容器里逐帧 282→266→…→10,九步塌到只剩标记(同仓 browser spec\n * 的「fit-content 宿主 + 非居中标记」用例钉住了这一条)。\n *\n * 判据因此取「当前输出已经放得下」:放得下就没有必须重切的理由,自驱动收缩在第一步就停,与度量\n * 无关;真正的容器收缩会让输出宽于新宽度,那时才重切。放长方向没有这个问题,一律重切(可能能\n * 少截一些)。\n */\n private _onWidth(width: number): void {\n this._observedWidth = width\n if (!(width > 0)) return\n\n /*\n * 两条短路都只在「没有未落的拟合」时才成立,它们的依据都是「当前输出就是按这个宽度切出来的」——\n * 而 `_dirty` 为真恰恰说明它不是(输入换过了,切分还没跟上)。宿主无布局期间改 text 就是这样:\n * `_apply` 按宽度 ≤ 0 直接返回,`_dirty` 留着,恢复显示时宽度与上次**相同**,若这里按\n * 「宽度没变」短路,就再也没有任何回调会把它切回来——屏幕上留着一段被 `overflow: hidden`\n * 硬裁的全文,没有标记也没有 title。\n */\n if (!this._dirty) {\n // 与上次拟合用的宽度相同(含亚像素取整差)就没有可算的:当前结果正是按这个宽度切出来的。\n // 这一档实测存在——观察者的首次回调报的就是 `_currentWidth()` 量到的同一个宽度。\n if (this._available >= 0 && Math.abs(width - this._available) <= WIDTH_EPSILON) return\n if (this._available >= 0 && width < this._available && this._rendered <= width + OVERFLOW_TOLERANCE) {\n return\n }\n }\n\n this._refineRound = 0\n this._apply(width)\n }\n\n /**\n * 把一次重切排到当前更新周期之外。\n *\n * 重切只能在渲染之后量到宽度才做得了,所以第二次更新是必然的;区别只在它从哪里排出去。\n * 微任务仍排在下一帧渲染之前,画面不会先闪一版全文,而 `updated()` 返回时更新已不再是\n * pending,Lit 的 `change-in-update` 警告不会触发。\n */\n private _defer(fit: () => void): void {\n queueMicrotask(fit)\n }\n\n /**\n * 同步可读的可用行内空间。\n *\n * ResizeObserver 的回调在布局之后才到,属性刚改完的那一帧还没有宽度可用;用 `.root` 的\n * 内容盒补上,免得先按全文画一帧再切。jsdom 没有布局,读到的 0 由 `_apply` 跳过。\n */\n private _currentWidth(): number {\n return this._root?.clientWidth ?? 0\n }\n\n /**\n * 按可用宽度切分并写回渲染结果。\n *\n * 宽度为 0(没有布局)时什么都不做,**并且保留 `_dirty`**:宿主不可见期间改 text 时这一趟\n * 必然被跳过,若在这里就把「有未落的拟合」清掉,等它重新有布局时就没有任何东西记得要切了。\n * 清标记因此只发生在真的切完之后。\n */\n private _apply(available: number): void {\n if (!(available > 0)) return\n\n // 量具必须在切分之前装上当前文本:首次更新时量具还不存在,只靠输入变化那次同步会让第一次\n // 切分读到空量具,`prefix(text.length)` 量出 0 而被误判成「放得下」。\n this._syncMeasure()\n\n const result = truncateMiddle(this.text, this._marker, this._markerPosition, available, this._probe)\n this._available = available\n this._dirty = false\n this._settle(result.truncated ? result.head + this._marker + result.tail : this.text, result.truncated)\n }\n\n private _settle(display: string, truncated: boolean): void {\n if (this._display === display && this._truncated === truncated) return\n\n this._display = display\n this._truncated = truncated\n // 周期内的调用会被 Lit 记 change-in-update:这里的两条来路(尺寸回调、微任务)都在周期之外。\n this.requestUpdate()\n }\n\n /** 把全文装进隐藏量具。它没有 Lit 绑定,改它不会触发重渲染。 */\n private _syncMeasure(): void {\n const measure = this._measure\n if (measure && measure.textContent !== this.text) {\n measure.textContent = this.text\n updateMeasurementText(measure, this.text)\n }\n }\n\n private _observeMeasure(): void {\n const measure = this._measure\n if (!measure || measure === this._observedMeasure) return\n\n if (this._observedMeasure) unobserveMeasurement(this._observedMeasure)\n this._observedMeasure = measure\n observeMeasurement(measure, this._onMeasurementChange)\n }\n\n /** `[from, to)` 这段原文在量具里的渲染宽度。空区间恒为 0——Range 塌缩矩形的宽度不可靠。 */\n private _rangeWidth(from: number, to: number): number {\n if (to <= from) return 0\n\n const node = this._measure?.firstChild\n if (!(node instanceof Text)) return 0\n\n this._range.setStart(node, from)\n this._range.setEnd(node, to)\n return this._range.getBoundingClientRect().width\n }\n\n override render() {\n return html`\n <div class=\"root\">\n <span class=\"text\" title=${ifDefined(this._truncated ? this.text : undefined)}>${this._display}</span>\n <span class=\"measure\"></span>\n <span class=\"marker-probe\" aria-hidden=\"true\">${this._marker}</span>\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-middle-ellipsis': WebUiMiddleEllipsis\n }\n}\n"],"mappings":";;;;;;;;;AAUA,IAAM,IAAe,GACf,IAAe,KACf,IAAmB,IAWnB,IAAqB,IACrB,IAAoB,GAWpB,IAAgB,IAQhB,oBAAqB,IAAI,QAAoC,GAC/D,GACE,oBAAwB,IAAI,IAAgB,GAC9C;AAEJ,SAAS,IAAsB;CAC7B,KAAK,IAAM,KAAU,GAAuB,EAAO;AACrD;AAEA,SAAS,EAAmB,GAA0B;CACpD,IAAM,IAAU,SAAS;CACpB,MAEA,MACH,IAAkB,GAClB,EAAgB,iBAAiB,eAAe,CAAa,IAE/D,EAAsB,IAAI,CAAM;AAClC;AAEA,SAAS,EAAqB,GAA0B;CACtD,EAAsB,OAAO,CAAM,GAC/B,IAAsB,OAAO,KAAK,CAAC,OAEvC,EAAgB,oBAAoB,eAAe,CAAa,GAChE,IAAkB,KAAA;AACpB;AAGA,SAAS,IAAgD;CA4BvD,OA3BI,OAAO,iBAAmB,MAAoB,OAC9C,MAEJ,IAAsB,IAAI,gBAAe,MAAW;EAClD,KAAK,IAAM,KAAS,GAAS;GAC3B,IAAM,IAAS,EAAmB,IAAI,EAAM,MAAM;GAClD,IAAI,CAAC,GAAQ;GAEb,IAAM,IAAO,EAAM,OAAO,aACpB,IAAQ,EAAM,YAAY;GAChC,IAAI,EAAO,SAAS,GAAM;IAExB,AADA,EAAO,OAAO,GACd,EAAO,QAAQ;IACf;GACF;GAEA,IAAI,EAAO,QAAQ,GAAG;IACpB,EAAO,QAAQ;IACf;GACF;GAEI,EAAO,UAAU,MACrB,EAAO,QAAQ,GACf,EAAO,OAAO;EAChB;CACF,CAAC,GAEM;AACT;AAEA,SAAS,EAAmB,GAAiB,GAA0B;CAErE,AADA,EAAmB,IAAI,GAAQ;EAAE;EAAQ,MAAM,EAAO;EAAa,OAAO;CAAG,CAAC,GAC9E,EAAmB,CAAM;CAEzB,IAAM,IAAW,EAAuB;CACnC,KAEL,EAAS,QAAQ,GAAQ,EAAE,KAAK,cAAc,CAAC;AACjD;AAEA,SAAS,EAAqB,GAAuB;CACnD,IAAM,IAAc,EAAmB,IAAI,CAAM;CAGjD,AAFI,KAAa,EAAqB,EAAY,MAAM,GACxD,EAAmB,OAAO,CAAM,GAChC,GAAqB,UAAU,CAAM;AACvC;AAEA,SAAS,EAAsB,GAAiB,GAAoB;CAClE,IAAM,IAAc,EAAmB,IAAI,CAAM;CAC5C,MAEL,EAAY,OAAO,GACnB,EAAY,QAAQ,EAAO,sBAAsB,CAAC,CAAC;AACrD;AAcO,IAAM,IAAN,cAAkC,EAAW;;EAsFZ,aAlFH,KAAA,OAAA,IAkBjB,KAAA,UAAA,KA0BQ,KAAA,kBAAA,GAQP,KAAA,WAAA,IACE,KAAA,aAAA,IAQA,KAAA,aAAA,IAEI,KAAA,iBAAA,IAEL,KAAA,YAAA,GAEH,KAAA,SAAA,IACM,KAAA,eAAA,GAGG,KAAA,SAAA,SAAS,YAAY,GAErB,KAAA,SAAA,IAAI,EAAuB,OAAM,MAAS,KAAK,SAAS,CAAK,CAAC,GAEpC,KAAA,6BAAA;GAIlD,AAHA,KAAK,eAAe,GACpB,KAAK,SAAS,IAEd,KAAK,OAAO,KAAK,iBAAiB,IAAI,KAAK,iBAAiB,KAAK,cAAc,CAAC;EAClF,GAEsC,KAAA,SAAA;GACpC,SAAQ,MAAS,KAAK,YAAY,GAAG,CAAK;GAC1C,SAAQ,MAAS,KAAK,YAAY,KAAK,KAAK,SAAS,GAAO,KAAK,KAAK,MAAM;GAC5E,cAAc,KAAK,cAAc,sBAAsB,CAAC,CAAC,SAAS;EACpE;;;EAzFyB,KAAA,SAAA,CAAC,EAAU,CAAK,CAAC;;CAM1C,IACI,OAAO,GAAe;EACxB,IAAM,IAAO,KAAA;EACb,IAAI,KAAK,YAAY,GAAM;GACzB,IAAM,IAAM,KAAK;GAEjB,AADA,KAAK,UAAU,GACf,KAAK,cAAc,UAAU,CAAG;EAClC;EACA,AAAI,KAAK,aAAa,QAAQ,MAAM,KAAM,KAAK,aAAa,UAAU,CAAI;CAC5E;CAEA,IAAI,SAAiB;EACnB,OAAO,KAAK;CACd;CAWA,IACI,eAAe,GAAe;EAChC,IAAM,IAAa,EAAgB,GAAO,GAAc,GAAc,CAAgB;EACtF,IAAI,KAAK,oBAAoB,GAAY;GACvC,IAAM,IAAM,KAAK;GAEjB,AADA,KAAK,kBAAkB,GACvB,KAAK,cAAc,kBAAkB,CAAG;EAC1C;EACA,AAAI,KAAK,aAAa,iBAAiB,MAAM,OAAO,CAAU,KAC5D,KAAK,aAAa,mBAAmB,OAAO,CAAU,CAAC;CAE3D;CAEA,IAAI,iBAAyB;EAC3B,OAAO,KAAK;CACd;CA8CA,oBAAmC;EAMjC,AALA,MAAM,kBAAkB,GACpB,KAAK,cAAc,MACrB,KAAK,SAAS,IACd,KAAK,eAAe,IAEtB,KAAK,gBAAgB;CACvB;CAEA,uBAAsC;EAKpC,AAJA,AAEE,KAAK,sBADL,EAAqB,KAAK,gBAAgB,GAClB,KAAA,IAE1B,MAAM,qBAAqB;CAC7B;CAEA,WAAoB,GAAqC;EACnD,CAAC,EAAQ,IAAI,MAAM,KAAM,EAAQ,IAAI,QAAQ,KAAM,EAAQ,IAAI,gBAAgB,OAOnF,KAAK,SAAS,IACd,KAAK,WAAW,KAAK,MACrB,KAAK,aAAa;CACpB;CAEA,UAAyB;EACvB,IAAM,IAAS,KAAK;EAEhB,IAAC,KAAW,KAAK,aAMrB;OAJA,KAAK,gBAAgB,GAErB,KAAK,YAAY,EAAO,sBAAsB,CAAC,CAAC,OAE5C,KAAK,QAAQ;IAEf,AADA,KAAK,eAAe,GACpB,KAAK,aAAa,KAAK,OAAO,KAAK,cAAc,CAAC,CAAC;IACnD;GACF;GAOA,IAAI,KAAK,cAAc,KAAK,YAAY,KAAK,aAAa,GAAoB;IAC5E,IAAI,KAAK,eAAe,GAAmB;KACzC,KAAK,gBAAgB;KACrB,IAAM,IAAU,KAAK,cAAc,KAAK,YAAY,KAAK,cAAc;KACvE,KAAK,aAAa,KAAK,OAAO,CAAO,CAAC;IACxC;IACA;GACF;GAEA,KAAK,eAAe;EAhBpB;CAiBF;CAkBA,SAAiB,GAAqB;EACpC,KAAK,iBAAiB,GAChB,IAAQ,MASV,CAAC,KAAK,WAGJ,KAAK,cAAc,KAAK,KAAK,IAAI,IAAQ,KAAK,UAAU,KAAK,KAC7D,KAAK,cAAc,KAAK,IAAQ,KAAK,cAAc,KAAK,aAAa,IAAQ,OAKnF,KAAK,eAAe,GACpB,KAAK,OAAO,CAAK;CACnB;CASA,OAAe,GAAuB;EACpC,eAAe,CAAG;CACpB;CAQA,gBAAgC;EAC9B,OAAO,KAAK,OAAO,eAAe;CACpC;CASA,OAAe,GAAyB;EACtC,IAAI,EAAE,IAAY,IAAI;EAItB,KAAK,aAAa;EAElB,IAAM,IAAS,EAAe,KAAK,MAAM,KAAK,SAAS,KAAK,iBAAiB,GAAW,KAAK,MAAM;EAGnG,AAFA,KAAK,aAAa,GAClB,KAAK,SAAS,IACd,KAAK,QAAQ,EAAO,YAAY,EAAO,OAAO,KAAK,UAAU,EAAO,OAAO,KAAK,MAAM,EAAO,SAAS;CACxG;CAEA,QAAgB,GAAiB,GAA0B;EACrD,MAAK,aAAa,KAAW,KAAK,eAAe,OAErD,KAAK,WAAW,GAChB,KAAK,aAAa,GAElB,KAAK,cAAc;CACrB;CAGA,eAA6B;EAC3B,IAAM,IAAU,KAAK;EACrB,AAAI,KAAW,EAAQ,gBAAgB,KAAK,SAC1C,EAAQ,cAAc,KAAK,MAC3B,EAAsB,GAAS,KAAK,IAAI;CAE5C;CAEA,kBAAgC;EAC9B,IAAM,IAAU,KAAK;EACjB,AAAC,KAAW,MAAY,KAAK,qBAE7B,KAAK,oBAAkB,EAAqB,KAAK,gBAAgB,GACrE,KAAK,mBAAmB,GACxB,EAAmB,GAAS,KAAK,oBAAoB;CACvD;CAGA,YAAoB,GAAc,GAAoB;EACpD,IAAI,KAAM,GAAM,OAAO;EAEvB,IAAM,IAAO,KAAK,UAAU;EAK5B,OAJM,aAAgB,QAEtB,KAAK,OAAO,SAAS,GAAM,CAAI,GAC/B,KAAK,OAAO,OAAO,GAAM,CAAE,GACpB,KAAK,OAAO,sBAAsB,CAAC,CAAC,SAJP;CAKtC;CAEA,SAAkB;EAChB,OAAO,CAAI;;mCAEoB,EAAU,KAAK,aAAa,KAAK,OAAO,KAAA,CAAS,EAAE,GAAG,KAAK,SAAS;;wDAE/C,KAAK,QAAQ;;;CAGnE;AACF;AAvRG,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,KAAA,CAAA,GAGzB,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,IAAA,GAwBxC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;CAAM,WAAW;AAAkB,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,IAAA,GA4BtE,EAAA,CAAA,EAAM,OAAO,CAAA,GAAA,EAAA,WAAA,SAAA,KAAA,CAAA,GACb,EAAA,CAAA,EAAM,OAAO,CAAA,GAAA,EAAA,WAAA,WAAA,KAAA,CAAA,GACb,EAAA,CAAA,EAAM,UAAU,CAAA,GAAA,EAAA,WAAA,YAAA,KAAA,CAAA,GAChB,EAAA,CAAA,EAAM,eAAe,CAAA,GAAA,EAAA,WAAA,gBAAA,KAAA,CAAA,GA/DvB,IAAA,EAAA,CAAA,EAAc,wBAAwB,CAAA,GAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["style"],"sources":["../../../src/components/middle-ellipsis/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS, type PropertyValues } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\n\nimport { ElementWidthController } from '@/shared/element-width'\nimport { normalizeNumber } from '@/shared/normalize'\n\nimport style from './style.css?inline'\nimport { DEFAULT_MARKER, truncateMiddle, type WidthProbe } from './truncate'\n\nconst MIN_POSITION = 0\nconst MAX_POSITION = 100\nconst DEFAULT_POSITION = 50\n\n/**\n * 合串复核的容差与轮数上限。\n *\n * 分段预算看不见两个接缝处的字距,实测偏差在亚像素量级:容差取 0.5px 吸收它。\n * 轮数上限是纯防御,不是常规路径:实测四种形态(等宽 ASCII 文件名、CJK 长串、无空格长串、\n * emoji/ZWJ 混排)各挂载一次,`_apply` 每次都只被调用一次——复核自己会再调一次 `_apply`,\n * 所以调用次数就是拟合次数,一次意味着复核一轮都没触发。这条上限防的是「标记被调用方撑得比\n * 容器还宽」这类退化输入。\n */\nconst OVERFLOW_TOLERANCE = 0.5\nconst MAX_REFINE_ROUNDS = 3\n\n/**\n * 可用宽度变化的感知阈(px)。\n *\n * `_currentWidth()` 走 `clientWidth`(整数),ResizeObserver 报的是 `contentRect.width`(分数),\n * 同一个盒子在两条路径上最多差 0.5px 的取整误差。不设阈值时,观察者的首次回调会被当成一次「变宽」\n * 而整份重算——实测挂载时两次 `_apply` 的入参都是同一个 240,也就是每次挂载白做一次二分。\n * 0.5 同时压住了「跳过略小于半个像素的真实收缩」的代价:那个量级下输出最多溢出 0.5px,\n * 与 `OVERFLOW_TOLERANCE` 视为可忽略的量级一致。\n */\nconst WIDTH_EPSILON = 0.5\n\ninterface MeasurementTarget {\n readonly notify: () => void\n text: string | null\n width: number\n}\n\nconst measurementTargets = new WeakMap<Element, MeasurementTarget>()\nlet measurementObserver: ResizeObserver | undefined\nconst fontMetricSubscribers = new Set<() => void>()\nlet observedFontSet: FontFaceSet | undefined\n\nfunction onFontsLoaded(): void {\n for (const notify of fontMetricSubscribers) notify()\n}\n\nfunction observeFontMetrics(notify: () => void): void {\n const fontSet = document.fonts\n if (!fontSet) return\n\n if (!observedFontSet) {\n observedFontSet = fontSet\n observedFontSet.addEventListener('loadingdone', onFontsLoaded)\n }\n fontMetricSubscribers.add(notify)\n}\n\nfunction unobserveFontMetrics(notify: () => void): void {\n fontMetricSubscribers.delete(notify)\n if (fontMetricSubscribers.size > 0 || !observedFontSet) return\n\n observedFontSet.removeEventListener('loadingdone', onFontsLoaded)\n observedFontSet = undefined\n}\n\n/** Observe the full-text probe so font metric changes can refit without a host resize. */\nfunction getMeasurementObserver(): ResizeObserver | null {\n if (typeof ResizeObserver === 'undefined') return null\n if (measurementObserver) return measurementObserver\n\n measurementObserver = new ResizeObserver(entries => {\n for (const entry of entries) {\n const target = measurementTargets.get(entry.target)\n if (!target) continue\n\n const text = entry.target.textContent\n const width = entry.contentRect.width\n if (target.text !== text) {\n target.text = text\n target.width = width\n continue\n }\n\n if (target.width < 0) {\n target.width = width\n continue\n }\n\n if (target.width === width) continue\n target.width = width\n target.notify()\n }\n })\n\n return measurementObserver\n}\n\nfunction observeMeasurement(target: Element, notify: () => void): void {\n measurementTargets.set(target, { notify, text: target.textContent, width: -1 })\n observeFontMetrics(notify)\n\n const observer = getMeasurementObserver()\n if (!observer) return\n\n observer.observe(target, { box: 'content-box' })\n}\n\nfunction unobserveMeasurement(target: Element): void {\n const observation = measurementTargets.get(target)\n if (observation) unobserveFontMetrics(observation.notify)\n measurementTargets.delete(target)\n measurementObserver?.unobserve(target)\n}\n\nfunction updateMeasurementText(target: Element, text: string): void {\n const observation = measurementTargets.get(target)\n if (!observation) return\n\n observation.text = text\n observation.width = target.getBoundingClientRect().width\n}\n\n/**\n * 单行中间省略:把超长文本截成 `首段…尾段`,省略号出现在中间而不是末尾。\n *\n * 适用面与 `text-overflow: ellipsis` 相同——**单行、且有确定宽度**。文本不换行,宽度由容器\n * 给出(块级盒子的包含块、flex 主轴的 `flex: 1`、grid track 都行)。宿主自撑宽度时不存在\n * 「可用空间」可言,组件按当时量到的宽度切一次就不再收缩(见 `_onWidth` 的收敛守卫)。\n *\n * 被丢掉的是中间那段,因此**选中复制拿到的是屏幕上这串**,不是原文;原文经 `title` 暴露,\n * 悬停可见。这条与 CSS 的 `text-overflow` 不同(那里文本节点没被动过、复制得到全文),是\n * JS 方案绕不开的代价,见 docs/research/web-ui-middle-ellipsis-261007.md。\n */\n@customElement('web-ui-middle-ellipsis')\nexport class WebUiMiddleEllipsis extends LitElement {\n static override styles = [unsafeCSS(style)]\n\n /** 要显示的完整文本。组件只读它,不回写。 */\n @property({ type: String }) text = ''\n\n /** 中间插入的标记,默认 `…`(U+2026)。空串即「只截断不给信号」,是否这样用由调用方判断。 */\n @property({ type: String, reflect: true })\n set marker(value: string) {\n const next = value ?? DEFAULT_MARKER\n if (this._marker !== next) {\n const old = this._marker\n this._marker = next\n this.requestUpdate('marker', old)\n }\n if (this.getAttribute('marker') !== next) this.setAttribute('marker', next)\n }\n\n get marker(): string {\n return this._marker\n }\n\n private _marker = DEFAULT_MARKER\n\n /**\n * 标记所在的横向比例,0–100,默认 `50`(居中)。\n *\n * 与 CSSWG css-overflow-5 的 `text-overflow: ellipsis <length-percentage>` 同向:量的是标记\n * 结束边距行末边的距离占可用行内空间的比例。`0` 只剩头部(等价于末尾省略),`100` 只剩尾部。\n * 文件名这类「头部是路径噪声、尾部才是扩展名」的场景用**大于** 50 的值让尾部多留一些。\n */\n @property({ type: Number, reflect: true, attribute: 'marker-position' })\n set markerPosition(value: number) {\n const normalized = normalizeNumber(value, MIN_POSITION, MAX_POSITION, DEFAULT_POSITION)\n if (this._markerPosition !== normalized) {\n const old = this._markerPosition\n this._markerPosition = normalized\n this.requestUpdate('markerPosition', old)\n }\n if (this.getAttribute('marker-position') !== String(normalized)) {\n this.setAttribute('marker-position', String(normalized))\n }\n }\n\n get markerPosition(): number {\n return this._markerPosition\n }\n\n private _markerPosition = DEFAULT_POSITION\n\n /*\n * 渲染结果用普通字段承载,不用 `@state`:切分只能在渲染之后量到真实宽度才算得出来,也就是说\n * 「改渲染结果」必然发生在更新周期里,而周期内的 `requestUpdate` 会被 Lit 记一条\n * `change-in-update` 警告——一个实例一条,一张千行的表就是一千条。用普通字段 + 只在周期外\n * (ResizeObserver 回调、微任务)显式 `requestUpdate()`,渲染时机不变,警告消失。\n */\n private _display = ''\n private _truncated = false\n\n @query('.root') private _root?: HTMLElement\n @query('.text') private _textEl?: HTMLElement\n @query('.measure') private _measure?: HTMLElement\n @query('.marker-probe') private _markerProbe?: HTMLElement\n\n /** 最近一次切分依据的可用宽度(px);-1 表示还没量到过布局。 */\n private _available = -1\n /** 最近一次 ResizeObserver 测得的宿主内容盒宽度;收敛守卫跳过拟合时也继续更新。 */\n private _observedWidth = -1\n /** 当前渲染出来的文本实际占宽(px)。收敛守卫靠它判断现有输出是否已经放得下。 */\n private _rendered = 0\n /** 输入或字体度量变过、还没重新拟合。 */\n private _dirty = true\n private _refineRound = 0\n private _observedMeasure?: HTMLElement\n\n private readonly _range = document.createRange()\n\n private readonly _width = new ElementWidthController(this, width => this._onWidth(width))\n\n private readonly _onMeasurementChange = (): void => {\n this._refineRound = 0\n this._dirty = true\n // `_available` can predate a shrink; use the latest precise content-box width even when it skipped a refit.\n this._apply(this._observedWidth > 0 ? this._observedWidth : this._currentWidth())\n }\n\n private readonly _probe: WidthProbe = {\n prefix: units => this._rangeWidth(0, units),\n suffix: units => this._rangeWidth(this.text.length - units, this.text.length),\n marker: () => this._markerProbe?.getBoundingClientRect().width ?? 0\n }\n\n override connectedCallback(): void {\n super.connectedCallback()\n if (this._available >= 0) {\n this._dirty = true\n this._refineRound = 0\n }\n this._observeMeasure()\n }\n\n override disconnectedCallback(): void {\n if (this._observedMeasure) {\n unobserveMeasurement(this._observedMeasure)\n this._observedMeasure = undefined\n }\n super.disconnectedCallback()\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (!changed.has('text') && !changed.has('marker') && !changed.has('markerPosition')) return\n\n /*\n * 输入变了就先把渲染退回全文:上一版的切分是按旧文本算的,拿它渲染新文本会显示一段两个\n * 版本都不属于的串。真正的重切由 `updated()` 排进微任务,在同一帧渲染之前完成,所以用户\n * 看不到这个中间态。这里写普通字段,正是为了不在更新周期里再排一次更新。\n */\n this._dirty = true\n this._display = this.text\n this._truncated = false\n }\n\n override updated(): void {\n const textEl = this._textEl\n // Lit can finish an update after this host was removed. Resume fitting only after reconnect.\n if (!textEl || !this.isConnected) return\n\n this._observeMeasure()\n\n this._rendered = textEl.getBoundingClientRect().width\n\n if (this._dirty) {\n this._refineRound = 0\n this._defer(() => this._apply(this._currentWidth()))\n return\n }\n\n /*\n * 合串复核:分段预算只保证「首段和尾段各自没超额度」,接缝处的字距与连字能把合串推过\n * 边界,而这件事只有渲染出来的盒子量得到。超出时按超出量回收额度重切;轮数上限兜住\n * 「怎么切都放不下」的退化情形(例如调用方把标记撑得比容器还宽)。\n */\n if (this._truncated && this._rendered > this._available + OVERFLOW_TOLERANCE) {\n if (this._refineRound < MAX_REFINE_ROUNDS) {\n this._refineRound += 1\n const tighter = this._available - (this._rendered - this._available) - OVERFLOW_TOLERANCE\n this._defer(() => this._apply(tighter))\n }\n return\n }\n\n this._refineRound = 0\n }\n\n /**\n * 容器宽度变化。\n *\n * 收缩方向带一条收敛守卫:宿主宽度由内容决定时(flex 主轴 `auto`、或 `width: fit-content` 在内容\n * 缩到容器以内之后),把自己截短会反过来把宿主量窄,于是排下一次尺寸回调。这个自驱动收缩**可能**\n * 一路棘轮到只剩标记,是否发生取决于度量:\n *\n * - flex + 等宽 16px + 默认 50%:缩掉的量小于一个簇宽时,重新二分落回同一组切点,走一步就停。\n * - `width: fit-content` + `marker-position: 80` + CJK:每个簇都是整宽块,切短一簇与宿主窄一簇\n * 互相咬合,摘掉本守卫后 300px 容器里逐帧 282→266→…→10,九步塌到只剩标记(同仓 browser spec\n * 的「fit-content 宿主 + 非居中标记」用例钉住了这一条)。\n *\n * 判据因此取「当前输出已经放得下」:放得下就没有必须重切的理由,自驱动收缩在第一步就停,与度量\n * 无关;真正的容器收缩会让输出宽于新宽度,那时才重切。放长方向没有这个问题,一律重切(可能能\n * 少截一些)。\n */\n private _onWidth(width: number): void {\n this._observedWidth = width\n if (!(width > 0)) return\n\n /*\n * 两条短路都只在「没有未落的拟合」时才成立,它们的依据都是「当前输出就是按这个宽度切出来的」——\n * 而 `_dirty` 为真恰恰说明它不是(输入换过了,切分还没跟上)。宿主无布局期间改 text 就是这样:\n * `_apply` 按宽度 ≤ 0 直接返回,`_dirty` 留着,恢复显示时宽度与上次**相同**,若这里按\n * 「宽度没变」短路,就再也没有任何回调会把它切回来——屏幕上留着一段被 `overflow: hidden`\n * 硬裁的全文,没有标记也没有 title。\n */\n if (!this._dirty) {\n // 与上次拟合用的宽度相同(含亚像素取整差)就没有可算的:当前结果正是按这个宽度切出来的。\n // 这一档实测存在——观察者的首次回调报的就是 `_currentWidth()` 量到的同一个宽度。\n if (this._available >= 0 && Math.abs(width - this._available) <= WIDTH_EPSILON) return\n if (this._available >= 0 && width < this._available && this._rendered <= width + OVERFLOW_TOLERANCE) {\n return\n }\n }\n\n this._refineRound = 0\n this._apply(width)\n }\n\n /**\n * 把一次重切排到当前更新周期之外。\n *\n * 重切只能在渲染之后量到宽度才做得了,所以第二次更新是必然的;区别只在它从哪里排出去。\n * 微任务仍排在下一帧渲染之前,画面不会先闪一版全文,而 `updated()` 返回时更新已不再是\n * pending,Lit 的 `change-in-update` 警告不会触发。\n */\n private _defer(fit: () => void): void {\n queueMicrotask(fit)\n }\n\n /**\n * 同步可读的可用行内空间。\n *\n * ResizeObserver 的回调在布局之后才到,属性刚改完的那一帧还没有宽度可用;用 `.root` 的\n * 内容盒补上,免得先按全文画一帧再切。jsdom 没有布局,读到的 0 由 `_apply` 跳过。\n */\n private _currentWidth(): number {\n return this._root?.clientWidth ?? 0\n }\n\n /**\n * 按可用宽度切分并写回渲染结果。\n *\n * 宽度为 0(没有布局)时什么都不做,**并且保留 `_dirty`**:宿主不可见期间改 text 时这一趟\n * 必然被跳过,若在这里就把「有未落的拟合」清掉,等它重新有布局时就没有任何东西记得要切了。\n * 清标记因此只发生在真的切完之后。\n */\n private _apply(available: number): void {\n if (!(available > 0)) return\n\n // 量具必须在切分之前装上当前文本:首次更新时量具还不存在,只靠输入变化那次同步会让第一次\n // 切分读到空量具,`prefix(text.length)` 量出 0 而被误判成「放得下」。\n this._syncMeasure()\n\n const result = truncateMiddle(this.text, this._marker, this._markerPosition, available, this._probe)\n this._available = available\n this._dirty = false\n this._settle(result.truncated ? result.head + this._marker + result.tail : this.text, result.truncated)\n }\n\n private _settle(display: string, truncated: boolean): void {\n if (this._display === display && this._truncated === truncated) return\n\n this._display = display\n this._truncated = truncated\n // 周期内的调用会被 Lit 记 change-in-update:这里的两条来路(尺寸回调、微任务)都在周期之外。\n this.requestUpdate()\n }\n\n /** 把全文装进隐藏量具。它没有 Lit 绑定,改它不会触发重渲染。 */\n private _syncMeasure(): void {\n const measure = this._measure\n if (measure && measure.textContent !== this.text) {\n measure.textContent = this.text\n updateMeasurementText(measure, this.text)\n }\n }\n\n private _observeMeasure(): void {\n const measure = this._measure\n if (!measure || measure === this._observedMeasure) return\n\n if (this._observedMeasure) unobserveMeasurement(this._observedMeasure)\n this._observedMeasure = measure\n observeMeasurement(measure, this._onMeasurementChange)\n }\n\n /** `[from, to)` 这段原文在量具里的渲染宽度。空区间恒为 0——Range 塌缩矩形的宽度不可靠。 */\n private _rangeWidth(from: number, to: number): number {\n if (to <= from) return 0\n\n const node = this._measure?.firstChild\n if (!(node instanceof Text)) return 0\n\n this._range.setStart(node, from)\n this._range.setEnd(node, to)\n return this._range.getBoundingClientRect().width\n }\n\n override render() {\n return html`\n <div class=\"root\">\n <span class=\"text\" title=${ifDefined(this._truncated ? this.text : undefined)}>${this._display}</span>\n <span class=\"measure\"></span>\n <span class=\"marker-probe\" aria-hidden=\"true\">${this._marker}</span>\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-middle-ellipsis': WebUiMiddleEllipsis\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
export { e as default };
|
|
1
|
+
// src/components/middle-ellipsis/style.css?inline
|
|
2
|
+
var style_default = ":host{display:block;overflow:hidden}.root{white-space:nowrap;position:relative;overflow:hidden}.text{white-space:nowrap}.measure,.marker-probe{pointer-events:none;white-space:nowrap;visibility:hidden;position:absolute;top:0;left:0}\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/middle-ellipsis/style.css?inline"],"sourcesContent":[":host {\n overflow: hidden;\n display: block;\n}\n\n.root {\n position: relative;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.text {\n white-space: nowrap;\n}\n\n/*\n * 两个隐藏量具。必须是出流盒子:留在流内的话宿主的 max-content 会被全文撑开,\n * 而截断的前提正是「宽度来自容器」。\n */\n.measure,\n.marker-probe {\n pointer-events: none;\n\n position: absolute;\n top: 0;\n left: 0;\n\n white-space: nowrap;\n\n visibility: hidden;\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/middle-ellipsis/style.css?inline"],"sourcesContent":[":host {\n overflow: hidden;\n display: block;\n}\n\n.root {\n position: relative;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.text {\n white-space: nowrap;\n}\n\n/*\n * 两个隐藏量具。必须是出流盒子:留在流内的话宿主的 max-content 会被全文撑开,\n * 而截断的前提正是「宽度来自容器」。\n */\n.measure,\n.marker-probe {\n pointer-events: none;\n\n position: absolute;\n top: 0;\n left: 0;\n\n white-space: nowrap;\n\n visibility: hidden;\n}\n"],"mappings":";AAAA,IAAA,gBAAA"}
|