@hina-ui/vue 1.7.5 → 1.7.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/dist/index.js +2222 -987
- package/dist/index.js.map +1 -1
- package/dist/shared/behavior/anchor-follow.ts +95 -0
- package/dist/shared/behavior/form.ts +187 -0
- package/dist/shared/behavior/ripple.ts +222 -0
- package/dist/shared/behavior/spoiler/painter.ts +197 -0
- package/dist/shared/behavior/spoiler/worklet.ts +199 -0
- package/dist/shared/behavior/toast.ts +243 -0
- package/dist/shared/lib/anchor.ts +83 -0
- package/dist/shared/lib/banner.ts +10 -0
- package/dist/shared/lib/calendar/format.ts +23 -0
- package/dist/shared/lib/caret.ts +48 -0
- package/dist/shared/lib/collapse.ts +29 -0
- package/dist/shared/lib/command-palette/hotkey.ts +27 -0
- package/dist/shared/lib/command-palette/match.ts +92 -0
- package/dist/shared/lib/data-list.ts +40 -0
- package/dist/shared/lib/data-table/column-sizing-styles.ts +41 -0
- package/dist/shared/lib/data-table/column-sizing.ts +101 -0
- package/dist/shared/lib/data-table/csv.ts +51 -0
- package/dist/shared/lib/data-table/layout.ts +199 -0
- package/dist/shared/lib/data-table/resize.ts +66 -0
- package/dist/shared/lib/data-table/state.ts +226 -0
- package/dist/shared/lib/data-table/utils.ts +80 -0
- package/dist/shared/lib/date-range-field/validity.ts +21 -0
- package/dist/shared/lib/date.ts +111 -0
- package/dist/shared/lib/field-focus.ts +36 -0
- package/dist/shared/lib/file-upload/select.ts +58 -0
- package/dist/shared/lib/file-upload/size.ts +16 -0
- package/dist/shared/lib/form/errors.ts +48 -0
- package/dist/shared/lib/form/focus.ts +10 -0
- package/dist/shared/lib/form/standard-schema.ts +26 -0
- package/dist/shared/lib/form/values.ts +23 -0
- package/dist/shared/lib/highlighter.ts +98 -0
- package/dist/shared/lib/iris-origin.ts +40 -0
- package/dist/shared/lib/lightbox/clip.ts +117 -0
- package/dist/shared/lib/lightbox/download.ts +29 -0
- package/dist/shared/lib/lightbox/gesture.ts +54 -0
- package/dist/shared/lib/lightbox/paging.ts +33 -0
- package/dist/shared/lib/lightbox/pose.ts +142 -0
- package/dist/shared/lib/lightbox/source.ts +17 -0
- package/dist/shared/lib/lightbox/types.ts +14 -0
- package/dist/shared/lib/lightbox/zoom.ts +127 -0
- package/dist/shared/lib/meter-group.ts +16 -0
- package/dist/shared/lib/overlay-anchor.ts +42 -0
- package/dist/shared/lib/pagination.ts +16 -0
- package/dist/shared/lib/pointer-corridor.ts +26 -0
- package/dist/shared/lib/qr-code-export.ts +68 -0
- package/dist/shared/lib/range-calendar/limit.ts +11 -0
- package/dist/shared/lib/rating.ts +4 -0
- package/dist/shared/lib/relative-time.ts +20 -0
- package/dist/shared/lib/scroll-area.ts +77 -0
- package/dist/shared/lib/scroll-restore.ts +148 -0
- package/dist/shared/lib/toast-layout.ts +42 -0
- package/dist/shared/lib/tree/selection.ts +131 -0
- package/dist/shared/lib/tree-select/filter.ts +19 -0
- package/dist/shared/lib/virtual/choices.ts +193 -0
- package/dist/shared/lib/virtual/collection.ts +71 -0
- package/dist/shared/lib/virtual/filter.ts +26 -0
- package/dist/shared/lib/virtual/flow.ts +32 -0
- package/dist/shared/lib/virtual/list.ts +63 -0
- package/dist/shared/lib/virtual/navigation.ts +26 -0
- package/dist/shared/lib/virtual/tree.ts +98 -0
- package/dist/shared/locale/en-US.ts +220 -0
- package/dist/shared/locale/index.ts +52 -0
- package/dist/shared/locale/types.ts +225 -0
- package/dist/shared/locale/zh-CN.ts +215 -0
- package/dist/shared/primitives/number-field/LICENSE +21 -0
- package/dist/shared/primitives/number-field/index.ts +407 -0
- package/dist/shared/styles/semantic.css +10 -2
- package/dist/shared/types/autocomplete.ts +16 -0
- package/dist/shared/types/data-table.ts +170 -0
- package/dist/shared/types/pagination.ts +19 -0
- package/dist/shared/types/select.ts +23 -0
- package/dist/shared/types/tree-select.ts +34 -0
- package/dist/shared/types/tree.ts +20 -0
- package/dist/types/shared/src/behavior/anchor-follow.d.ts +13 -0
- package/dist/types/shared/src/behavior/anchor-follow.d.ts.map +1 -0
- package/dist/types/shared/src/behavior/form.d.ts +24 -0
- package/dist/types/shared/src/behavior/form.d.ts.map +1 -0
- package/dist/types/shared/src/behavior/ripple.d.ts +11 -0
- package/dist/types/shared/src/behavior/ripple.d.ts.map +1 -0
- package/dist/types/shared/src/behavior/spoiler/painter.d.ts +35 -0
- package/dist/types/shared/src/behavior/spoiler/painter.d.ts.map +1 -0
- package/dist/types/shared/src/behavior/spoiler/worklet.d.ts +2 -0
- package/dist/types/shared/src/behavior/spoiler/worklet.d.ts.map +1 -0
- package/dist/types/shared/src/behavior/toast.d.ts +72 -0
- package/dist/types/shared/src/behavior/toast.d.ts.map +1 -0
- package/dist/types/shared/src/lib/anchor.d.ts +31 -0
- package/dist/types/shared/src/lib/anchor.d.ts.map +1 -0
- package/dist/types/shared/src/lib/banner.d.ts +3 -0
- package/dist/types/shared/src/lib/banner.d.ts.map +1 -0
- package/dist/types/shared/src/lib/calendar/format.d.ts +7 -0
- package/dist/types/shared/src/lib/calendar/format.d.ts.map +1 -0
- package/dist/types/shared/src/lib/caret.d.ts +2 -0
- package/dist/types/shared/src/lib/caret.d.ts.map +1 -0
- package/dist/types/shared/src/lib/collapse.d.ts +9 -0
- package/dist/types/shared/src/lib/collapse.d.ts.map +1 -0
- package/dist/types/shared/src/lib/command-palette/hotkey.d.ts +9 -0
- package/dist/types/shared/src/lib/command-palette/hotkey.d.ts.map +1 -0
- package/dist/types/shared/src/lib/command-palette/match.d.ts +21 -0
- package/dist/types/shared/src/lib/command-palette/match.d.ts.map +1 -0
- package/dist/types/shared/src/lib/data-list.d.ts +7 -0
- package/dist/types/shared/src/lib/data-list.d.ts.map +1 -0
- package/dist/types/shared/src/lib/data-table/column-sizing-styles.d.ts +8 -0
- package/dist/types/shared/src/lib/data-table/column-sizing-styles.d.ts.map +1 -0
- package/dist/types/shared/src/lib/data-table/column-sizing.d.ts +22 -0
- package/dist/types/shared/src/lib/data-table/column-sizing.d.ts.map +1 -0
- package/dist/types/shared/src/lib/data-table/csv.d.ts +5 -0
- package/dist/types/shared/src/lib/data-table/csv.d.ts.map +1 -0
- package/dist/types/shared/src/lib/data-table/layout.d.ts +28 -0
- package/dist/types/shared/src/lib/data-table/layout.d.ts.map +1 -0
- package/dist/types/shared/src/lib/data-table/resize.d.ts +15 -0
- package/dist/types/shared/src/lib/data-table/resize.d.ts.map +1 -0
- package/dist/types/shared/src/lib/data-table/state.d.ts +103 -0
- package/dist/types/shared/src/lib/data-table/state.d.ts.map +1 -0
- package/dist/types/shared/src/lib/data-table/utils.d.ts +11 -0
- package/dist/types/shared/src/lib/data-table/utils.d.ts.map +1 -0
- package/dist/types/shared/src/lib/date-range-field/validity.d.ts +12 -0
- package/dist/types/shared/src/lib/date-range-field/validity.d.ts.map +1 -0
- package/dist/types/shared/src/lib/date.d.ts +28 -0
- package/dist/types/shared/src/lib/date.d.ts.map +1 -0
- package/dist/types/shared/src/lib/field-focus.d.ts +2 -0
- package/dist/types/shared/src/lib/field-focus.d.ts.map +1 -0
- package/dist/types/shared/src/lib/file-upload/select.d.ts +17 -0
- package/dist/types/shared/src/lib/file-upload/select.d.ts.map +1 -0
- package/dist/types/shared/src/lib/file-upload/size.d.ts +2 -0
- package/dist/types/shared/src/lib/file-upload/size.d.ts.map +1 -0
- package/dist/types/shared/src/lib/form/errors.d.ts +7 -0
- package/dist/types/shared/src/lib/form/errors.d.ts.map +1 -0
- package/dist/types/shared/src/lib/form/focus.d.ts +2 -0
- package/dist/types/shared/src/lib/form/focus.d.ts.map +1 -0
- package/dist/types/shared/src/lib/form/standard-schema.d.ts +23 -0
- package/dist/types/shared/src/lib/form/standard-schema.d.ts.map +1 -0
- package/dist/types/shared/src/lib/form/values.d.ts +3 -0
- package/dist/types/shared/src/lib/form/values.d.ts.map +1 -0
- package/dist/types/shared/src/lib/highlighter.d.ts +4 -0
- package/dist/types/shared/src/lib/highlighter.d.ts.map +1 -0
- package/dist/types/shared/src/lib/iris-origin.d.ts +6 -0
- package/dist/types/shared/src/lib/iris-origin.d.ts.map +1 -0
- package/dist/types/shared/src/lib/lightbox/clip.d.ts +16 -0
- package/dist/types/shared/src/lib/lightbox/clip.d.ts.map +1 -0
- package/dist/types/shared/src/lib/lightbox/download.d.ts +3 -0
- package/dist/types/shared/src/lib/lightbox/download.d.ts.map +1 -0
- package/dist/types/shared/src/lib/lightbox/gesture.d.ts +26 -0
- package/dist/types/shared/src/lib/lightbox/gesture.d.ts.map +1 -0
- package/dist/types/shared/src/lib/lightbox/paging.d.ts +9 -0
- package/dist/types/shared/src/lib/lightbox/paging.d.ts.map +1 -0
- package/dist/types/shared/src/lib/lightbox/pose.d.ts +38 -0
- package/dist/types/shared/src/lib/lightbox/pose.d.ts.map +1 -0
- package/dist/types/shared/src/lib/lightbox/source.d.ts +4 -0
- package/dist/types/shared/src/lib/lightbox/source.d.ts.map +1 -0
- package/dist/types/shared/src/lib/lightbox/types.d.ts +16 -0
- package/dist/types/shared/src/lib/lightbox/types.d.ts.map +1 -0
- package/dist/types/shared/src/lib/lightbox/zoom.d.ts +40 -0
- package/dist/types/shared/src/lib/lightbox/zoom.d.ts.map +1 -0
- package/dist/types/shared/src/lib/meter-group.d.ts +5 -0
- package/dist/types/shared/src/lib/meter-group.d.ts.map +1 -0
- package/dist/types/shared/src/lib/overlay-anchor.d.ts +10 -0
- package/dist/types/shared/src/lib/overlay-anchor.d.ts.map +1 -0
- package/dist/types/shared/src/lib/pagination.d.ts +4 -0
- package/dist/types/shared/src/lib/pagination.d.ts.map +1 -0
- package/dist/types/shared/src/lib/pointer-corridor.d.ts +7 -0
- package/dist/types/shared/src/lib/pointer-corridor.d.ts.map +1 -0
- package/dist/types/shared/src/lib/qr-code-export.d.ts +6 -0
- package/dist/types/shared/src/lib/qr-code-export.d.ts.map +1 -0
- package/dist/types/shared/src/lib/range-calendar/limit.d.ts +3 -0
- package/dist/types/shared/src/lib/range-calendar/limit.d.ts.map +1 -0
- package/dist/types/shared/src/lib/rating.d.ts +2 -0
- package/dist/types/shared/src/lib/rating.d.ts.map +1 -0
- package/dist/types/shared/src/lib/relative-time.d.ts +2 -0
- package/dist/types/shared/src/lib/relative-time.d.ts.map +1 -0
- package/dist/types/shared/src/lib/scroll-area.d.ts +50 -0
- package/dist/types/shared/src/lib/scroll-area.d.ts.map +1 -0
- package/dist/types/shared/src/lib/scroll-restore.d.ts +34 -0
- package/dist/types/shared/src/lib/scroll-restore.d.ts.map +1 -0
- package/dist/types/shared/src/lib/toast-layout.d.ts +13 -0
- package/dist/types/shared/src/lib/toast-layout.d.ts.map +1 -0
- package/dist/types/shared/src/lib/tree/selection.d.ts +23 -0
- package/dist/types/shared/src/lib/tree/selection.d.ts.map +1 -0
- package/dist/types/shared/src/lib/tree-select/filter.d.ts +7 -0
- package/dist/types/shared/src/lib/tree-select/filter.d.ts.map +1 -0
- package/dist/types/shared/src/lib/virtual/choices.d.ts +59 -0
- package/dist/types/shared/src/lib/virtual/choices.d.ts.map +1 -0
- package/dist/types/shared/src/lib/virtual/collection.d.ts +25 -0
- package/dist/types/shared/src/lib/virtual/collection.d.ts.map +1 -0
- package/dist/types/shared/src/lib/virtual/flow.d.ts +18 -0
- package/dist/types/shared/src/lib/virtual/flow.d.ts.map +1 -0
- package/dist/types/shared/src/lib/virtual/list.d.ts +46 -0
- package/dist/types/shared/src/lib/virtual/list.d.ts.map +1 -0
- package/dist/types/shared/src/lib/virtual/navigation.d.ts +3 -0
- package/dist/types/shared/src/lib/virtual/navigation.d.ts.map +1 -0
- package/dist/types/shared/src/lib/virtual/tree.d.ts +31 -0
- package/dist/types/shared/src/lib/virtual/tree.d.ts.map +1 -0
- package/dist/types/shared/src/locale/en-US.d.ts +3 -0
- package/dist/types/shared/src/locale/en-US.d.ts.map +1 -0
- package/dist/types/shared/src/locale/index.d.ts +6 -0
- package/dist/types/shared/src/locale/index.d.ts.map +1 -0
- package/dist/types/shared/src/locale/types.d.ts +235 -0
- package/dist/types/shared/src/locale/types.d.ts.map +1 -0
- package/dist/types/shared/src/locale/zh-CN.d.ts +3 -0
- package/dist/types/shared/src/locale/zh-CN.d.ts.map +1 -0
- package/dist/types/shared/src/primitives/number-field/index.d.ts +155 -0
- package/dist/types/shared/src/primitives/number-field/index.d.ts.map +1 -0
- package/dist/types/shared/src/types/autocomplete.d.ts +14 -0
- package/dist/types/shared/src/types/autocomplete.d.ts.map +1 -0
- package/dist/types/shared/src/types/data-table.d.ts +169 -0
- package/dist/types/shared/src/types/data-table.d.ts.map +1 -0
- package/dist/types/shared/src/types/pagination.d.ts +23 -0
- package/dist/types/shared/src/types/pagination.d.ts.map +1 -0
- package/dist/types/shared/src/types/select.d.ts +14 -0
- package/dist/types/shared/src/types/select.d.ts.map +1 -0
- package/dist/types/shared/src/types/tree-select.d.ts +10 -0
- package/dist/types/shared/src/types/tree-select.d.ts.map +1 -0
- package/dist/types/shared/src/types/tree.d.ts +18 -0
- package/dist/types/shared/src/types/tree.d.ts.map +1 -0
- package/dist/types/shared/src/variants/autocomplete.d.ts +3 -0
- package/dist/types/shared/src/variants/autocomplete.d.ts.map +1 -0
- package/dist/types/shared/src/variants/editable.d.ts +52 -0
- package/dist/types/shared/src/variants/editable.d.ts.map +1 -0
- package/dist/types/shared/src/variants/float-button.d.ts +74 -0
- package/dist/types/shared/src/variants/float-button.d.ts.map +1 -0
- package/dist/types/shared/src/variants/split-button.d.ts +18 -0
- package/dist/types/shared/src/variants/split-button.d.ts.map +1 -0
- package/dist/types/vue/src/components/accordion/AccordionTrigger.vue.d.ts.map +1 -1
- package/dist/types/vue/src/components/anchor/composables/useAnchor.d.ts +2 -7
- package/dist/types/vue/src/components/anchor/composables/useAnchor.d.ts.map +1 -1
- package/dist/types/vue/src/components/anchor/composables/useAnchorFollow.d.ts.map +1 -1
- package/dist/types/vue/src/components/anchor/composables/useScrollSpy.d.ts +2 -5
- package/dist/types/vue/src/components/anchor/composables/useScrollSpy.d.ts.map +1 -1
- package/dist/types/vue/src/components/anchor/types.d.ts +1 -8
- package/dist/types/vue/src/components/anchor/types.d.ts.map +1 -1
- package/dist/types/vue/src/components/autocomplete/autocomplete.variants.d.ts +1 -1
- package/dist/types/vue/src/components/autocomplete/autocomplete.variants.d.ts.map +1 -1
- package/dist/types/vue/src/components/autocomplete/types.d.ts +1 -13
- package/dist/types/vue/src/components/autocomplete/types.d.ts.map +1 -1
- package/dist/types/vue/src/components/banner/utils/direction.d.ts +1 -2
- package/dist/types/vue/src/components/banner/utils/direction.d.ts.map +1 -1
- package/dist/types/vue/src/components/calendar/utils/format.d.ts +1 -6
- package/dist/types/vue/src/components/calendar/utils/format.d.ts.map +1 -1
- package/dist/types/vue/src/components/code-block/highlighter.d.ts +1 -3
- package/dist/types/vue/src/components/code-block/highlighter.d.ts.map +1 -1
- package/dist/types/vue/src/components/collapsible/CollapsibleTrigger.vue.d.ts.map +1 -1
- package/dist/types/vue/src/components/command-palette/composables/useCommandItems.d.ts +1 -1
- package/dist/types/vue/src/components/command-palette/utils/hotkey.d.ts +1 -8
- package/dist/types/vue/src/components/command-palette/utils/hotkey.d.ts.map +1 -1
- package/dist/types/vue/src/components/command-palette/utils/match.d.ts +5 -12
- package/dist/types/vue/src/components/command-palette/utils/match.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-list/composables/useDataList.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-list/utils/scroll.d.ts +1 -2
- package/dist/types/vue/src/components/data-list/utils/scroll.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-table/column-sizing-styles.d.ts +1 -3
- package/dist/types/vue/src/components/data-table/column-sizing-styles.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-table/column-sizing.d.ts +1 -21
- package/dist/types/vue/src/components/data-table/column-sizing.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-table/composables/useDataTable.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-table/composables/useTableColumns.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-table/composables/useTableDrag.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-table/composables/useTableExport.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-table/composables/useTableResize.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-table/composables/useTableResizeHandles.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-table/composables/useTableVirtual.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-table/types.d.ts +3 -153
- package/dist/types/vue/src/components/data-table/types.d.ts.map +1 -1
- package/dist/types/vue/src/components/data-table/utils.d.ts +1 -9
- package/dist/types/vue/src/components/data-table/utils.d.ts.map +1 -1
- package/dist/types/vue/src/components/date-range-field/utils/validity.d.ts +1 -11
- package/dist/types/vue/src/components/date-range-field/utils/validity.d.ts.map +1 -1
- package/dist/types/vue/src/components/editable/editable.variants.d.ts +1 -1
- package/dist/types/vue/src/components/editable/editable.variants.d.ts.map +1 -1
- package/dist/types/vue/src/components/file-upload/utils/select.d.ts +1 -16
- package/dist/types/vue/src/components/file-upload/utils/select.d.ts.map +1 -1
- package/dist/types/vue/src/components/file-upload/utils/size.d.ts +1 -1
- package/dist/types/vue/src/components/file-upload/utils/size.d.ts.map +1 -1
- package/dist/types/vue/src/components/float-button/float-button.variants.d.ts +1 -1
- package/dist/types/vue/src/components/float-button/float-button.variants.d.ts.map +1 -1
- package/dist/types/vue/src/components/form/Form.vue.d.ts +1 -1
- package/dist/types/vue/src/components/form/composables/useForm.d.ts +9 -15
- package/dist/types/vue/src/components/form/composables/useForm.d.ts.map +1 -1
- package/dist/types/vue/src/components/form/standard-schema.d.ts +1 -22
- package/dist/types/vue/src/components/form/standard-schema.d.ts.map +1 -1
- package/dist/types/vue/src/components/form/utils/errors.d.ts +1 -6
- package/dist/types/vue/src/components/form/utils/errors.d.ts.map +1 -1
- package/dist/types/vue/src/components/form/utils/focus.d.ts +1 -1
- package/dist/types/vue/src/components/form/utils/focus.d.ts.map +1 -1
- package/dist/types/vue/src/components/form/utils/values.d.ts +1 -2
- package/dist/types/vue/src/components/form/utils/values.d.ts.map +1 -1
- package/dist/types/vue/src/components/form-field/FormField.vue.d.ts.map +1 -1
- package/dist/types/vue/src/components/lightbox/types.d.ts +1 -15
- package/dist/types/vue/src/components/lightbox/types.d.ts.map +1 -1
- package/dist/types/vue/src/components/lightbox/utils/clip.d.ts +1 -15
- package/dist/types/vue/src/components/lightbox/utils/clip.d.ts.map +1 -1
- package/dist/types/vue/src/components/lightbox/utils/download.d.ts +1 -2
- package/dist/types/vue/src/components/lightbox/utils/download.d.ts.map +1 -1
- package/dist/types/vue/src/components/lightbox/utils/gesture.d.ts +1 -25
- package/dist/types/vue/src/components/lightbox/utils/gesture.d.ts.map +1 -1
- package/dist/types/vue/src/components/lightbox/utils/paging.d.ts +1 -8
- package/dist/types/vue/src/components/lightbox/utils/paging.d.ts.map +1 -1
- package/dist/types/vue/src/components/lightbox/utils/pose.d.ts +1 -37
- package/dist/types/vue/src/components/lightbox/utils/pose.d.ts.map +1 -1
- package/dist/types/vue/src/components/lightbox/utils/source.d.ts +1 -3
- package/dist/types/vue/src/components/lightbox/utils/source.d.ts.map +1 -1
- package/dist/types/vue/src/components/lightbox/utils/zoom.d.ts +1 -39
- package/dist/types/vue/src/components/lightbox/utils/zoom.d.ts.map +1 -1
- package/dist/types/vue/src/components/meter-group/utils/tones.d.ts +1 -3
- package/dist/types/vue/src/components/meter-group/utils/tones.d.ts.map +1 -1
- package/dist/types/vue/src/components/month-grid/MonthGrid.vue.d.ts +1 -1
- package/dist/types/vue/src/components/multi-select/MultiSelect.vue.d.ts.map +1 -1
- package/dist/types/vue/src/components/pagination/composables/usePagination.d.ts +2 -2
- package/dist/types/vue/src/components/pagination/composables/usePagination.d.ts.map +1 -1
- package/dist/types/vue/src/components/pagination/types.d.ts +1 -22
- package/dist/types/vue/src/components/pagination/types.d.ts.map +1 -1
- package/dist/types/vue/src/components/pagination/utils/ranges.d.ts +1 -2
- package/dist/types/vue/src/components/pagination/utils/ranges.d.ts.map +1 -1
- package/dist/types/vue/src/components/password-input/PasswordInput.vue.d.ts +4 -1
- package/dist/types/vue/src/components/password-input/PasswordInput.vue.d.ts.map +1 -1
- package/dist/types/vue/src/components/qr-code/export.d.ts +1 -2
- package/dist/types/vue/src/components/qr-code/export.d.ts.map +1 -1
- package/dist/types/vue/src/components/range-calendar/utils/limit.d.ts +1 -2
- package/dist/types/vue/src/components/range-calendar/utils/limit.d.ts.map +1 -1
- package/dist/types/vue/src/components/range-slider/RangeSlider.vue.d.ts +2 -2
- package/dist/types/vue/src/components/rating/utils/fill.d.ts +1 -1
- package/dist/types/vue/src/components/rating/utils/fill.d.ts.map +1 -1
- package/dist/types/vue/src/components/ripple/useRipple.d.ts.map +1 -1
- package/dist/types/vue/src/components/scroll-area/ScrollArea.vue.d.ts.map +1 -1
- package/dist/types/vue/src/components/scroll-area/composables/useEdgeShadow.d.ts +2 -1
- package/dist/types/vue/src/components/scroll-area/composables/useEdgeShadow.d.ts.map +1 -1
- package/dist/types/vue/src/components/scroll-area/composables/useLayerLock.d.ts.map +1 -1
- package/dist/types/vue/src/components/scroll-area/composables/useWheelRedirect.d.ts.map +1 -1
- package/dist/types/vue/src/components/scroll-area/scroll-restore.d.ts +1 -33
- package/dist/types/vue/src/components/scroll-area/scroll-restore.d.ts.map +1 -1
- package/dist/types/vue/src/components/search-input/SearchInput.vue.d.ts +4 -1
- package/dist/types/vue/src/components/search-input/SearchInput.vue.d.ts.map +1 -1
- package/dist/types/vue/src/components/select/types.d.ts +1 -13
- package/dist/types/vue/src/components/select/types.d.ts.map +1 -1
- package/dist/types/vue/src/components/slider/Slider.vue.d.ts +2 -2
- package/dist/types/vue/src/components/split-button/split-button.variants.d.ts +1 -1
- package/dist/types/vue/src/components/split-button/split-button.variants.d.ts.map +1 -1
- package/dist/types/vue/src/components/spoiler/SpoilerPainter.d.ts +1 -34
- package/dist/types/vue/src/components/spoiler/SpoilerPainter.d.ts.map +1 -1
- package/dist/types/vue/src/components/spoiler/utils/irisOrigin.d.ts +1 -5
- package/dist/types/vue/src/components/spoiler/utils/irisOrigin.d.ts.map +1 -1
- package/dist/types/vue/src/components/spoiler/worklet.d.ts +1 -1
- package/dist/types/vue/src/components/spoiler/worklet.d.ts.map +1 -1
- package/dist/types/vue/src/components/table/Table.vue.d.ts +6 -3
- package/dist/types/vue/src/components/table/Table.vue.d.ts.map +1 -1
- package/dist/types/vue/src/components/tabs/TabsList.vue.d.ts +6 -3
- package/dist/types/vue/src/components/tabs/TabsList.vue.d.ts.map +1 -1
- package/dist/types/vue/src/components/time/utils/relativeTime.d.ts +1 -1
- package/dist/types/vue/src/components/time/utils/relativeTime.d.ts.map +1 -1
- package/dist/types/vue/src/components/toast/composables/useToastLayout.d.ts +4 -11
- package/dist/types/vue/src/components/toast/composables/useToastLayout.d.ts.map +1 -1
- package/dist/types/vue/src/components/toast/store.d.ts +14 -62
- package/dist/types/vue/src/components/toast/store.d.ts.map +1 -1
- package/dist/types/vue/src/components/tree/composables/useTree.d.ts.map +1 -1
- package/dist/types/vue/src/components/tree/types.d.ts +1 -17
- package/dist/types/vue/src/components/tree/types.d.ts.map +1 -1
- package/dist/types/vue/src/components/tree/utils/selection.d.ts +1 -15
- package/dist/types/vue/src/components/tree/utils/selection.d.ts.map +1 -1
- package/dist/types/vue/src/components/tree-select/types.d.ts +1 -9
- package/dist/types/vue/src/components/tree-select/types.d.ts.map +1 -1
- package/dist/types/vue/src/components/tree-select/utils/filterTree.d.ts +1 -6
- package/dist/types/vue/src/components/tree-select/utils/filterTree.d.ts.map +1 -1
- package/dist/types/vue/src/components/virtual-list/composables/useVirtualList.d.ts +1 -1
- package/dist/types/vue/src/components/virtual-list/composables/useVirtualList.d.ts.map +1 -1
- package/dist/types/vue/src/components/visually-hidden/VisuallyHidden.vue.d.ts +4 -1
- package/dist/types/vue/src/components/visually-hidden/VisuallyHidden.vue.d.ts.map +1 -1
- package/dist/types/vue/src/lib/caret.d.ts +1 -1
- package/dist/types/vue/src/lib/caret.d.ts.map +1 -1
- package/dist/types/vue/src/lib/collapse.d.ts +2 -8
- package/dist/types/vue/src/lib/collapse.d.ts.map +1 -1
- package/dist/types/vue/src/lib/date.d.ts +1 -27
- package/dist/types/vue/src/lib/date.d.ts.map +1 -1
- package/dist/types/vue/src/lib/field-focus.d.ts +1 -1
- package/dist/types/vue/src/lib/field-focus.d.ts.map +1 -1
- package/dist/types/vue/src/lib/overlay-anchor.d.ts +2 -7
- package/dist/types/vue/src/lib/overlay-anchor.d.ts.map +1 -1
- package/dist/types/vue/src/lib/pointer-corridor.d.ts +1 -6
- package/dist/types/vue/src/lib/pointer-corridor.d.ts.map +1 -1
- package/dist/types/vue/src/lib/reka/useVirtualChoices.d.ts +3 -11
- package/dist/types/vue/src/lib/reka/useVirtualChoices.d.ts.map +1 -1
- package/dist/types/vue/src/lib/reka/useVirtualTree.d.ts +1 -1
- package/dist/types/vue/src/lib/reka/useVirtualTree.d.ts.map +1 -1
- package/dist/types/vue/src/lib/virtual/navigation.d.ts +1 -2
- package/dist/types/vue/src/lib/virtual/navigation.d.ts.map +1 -1
- package/dist/types/vue/src/lib/virtual/useVirtualCollection.d.ts +1 -1
- package/dist/types/vue/src/lib/virtual/useVirtualCollection.d.ts.map +1 -1
- package/dist/types/vue/src/lib/virtual/useVirtualWindow.d.ts +2 -15
- package/dist/types/vue/src/lib/virtual/useVirtualWindow.d.ts.map +1 -1
- package/dist/types/vue/src/locale/en-US.d.ts +1 -2
- package/dist/types/vue/src/locale/en-US.d.ts.map +1 -1
- package/dist/types/vue/src/locale/index.d.ts +3 -4
- package/dist/types/vue/src/locale/index.d.ts.map +1 -1
- package/dist/types/vue/src/locale/types.d.ts +1 -234
- package/dist/types/vue/src/locale/types.d.ts.map +1 -1
- package/dist/types/vue/src/locale/zh-CN.d.ts +1 -2
- package/dist/types/vue/src/locale/zh-CN.d.ts.map +1 -1
- package/dist/types/vue/src/primitives/number-field/NumberFieldDecrement.vue.d.ts +17 -0
- package/dist/types/vue/src/primitives/number-field/NumberFieldDecrement.vue.d.ts.map +1 -0
- package/dist/types/vue/src/primitives/number-field/NumberFieldIncrement.vue.d.ts +17 -0
- package/dist/types/vue/src/primitives/number-field/NumberFieldIncrement.vue.d.ts.map +1 -0
- package/dist/types/vue/src/primitives/number-field/NumberFieldInput.vue.d.ts +16 -0
- package/dist/types/vue/src/primitives/number-field/NumberFieldInput.vue.d.ts.map +1 -0
- package/dist/types/vue/src/primitives/number-field/NumberFieldRoot.vue.d.ts +47 -0
- package/dist/types/vue/src/primitives/number-field/NumberFieldRoot.vue.d.ts.map +1 -0
- package/dist/types/vue/src/primitives/number-field/context.d.ts +41 -0
- package/dist/types/vue/src/primitives/number-field/context.d.ts.map +1 -0
- package/dist/types/vue/src/primitives/number-field/index.d.ts +5 -0
- package/dist/types/vue/src/primitives/number-field/index.d.ts.map +1 -0
- package/dist/types/vue/src/primitives/utils/timers.d.ts +6 -0
- package/dist/types/vue/src/primitives/utils/timers.d.ts.map +1 -0
- package/dist/types/vue/src/primitives/utils/usePrimitiveElement.d.ts +6 -0
- package/dist/types/vue/src/primitives/utils/usePrimitiveElement.d.ts.map +1 -0
- package/dist/types/vue/src/primitives/utils/useVModel.d.ts +7 -0
- package/dist/types/vue/src/primitives/utils/useVModel.d.ts.map +1 -0
- package/dist/types/vue/src/primitives/visually-hidden/VisuallyHiddenInput.d.ts +66 -0
- package/dist/types/vue/src/primitives/visually-hidden/VisuallyHiddenInput.d.ts.map +1 -0
- package/dist/types/vue/src/primitives/visually-hidden/VisuallyHiddenInputBubble.vue.d.ts +28 -0
- package/dist/types/vue/src/primitives/visually-hidden/VisuallyHiddenInputBubble.vue.d.ts.map +1 -0
- package/package.json +3 -2
- package/src/components/accordion/AccordionTrigger.vue +9 -1
- package/src/components/anchor/composables/useAnchor.ts +3 -12
- package/src/components/anchor/composables/useAnchorFollow.ts +8 -76
- package/src/components/anchor/composables/useScrollSpy.ts +22 -38
- package/src/components/anchor/types.ts +1 -8
- package/src/components/autocomplete/autocomplete.variants.ts +1 -1
- package/src/components/autocomplete/composables/useAutocomplete.ts +1 -1
- package/src/components/autocomplete/types.ts +1 -16
- package/src/components/banner/utils/direction.ts +1 -10
- package/src/components/calendar/utils/format.ts +1 -23
- package/src/components/code-block/highlighter.ts +1 -98
- package/src/components/collapsible/CollapsibleTrigger.vue +8 -1
- package/src/components/command-palette/utils/hotkey.ts +1 -27
- package/src/components/command-palette/utils/match.ts +5 -75
- package/src/components/data-list/composables/useDataList.ts +2 -4
- package/src/components/data-list/utils/scroll.ts +1 -26
- package/src/components/data-table/column-sizing-styles.ts +1 -40
- package/src/components/data-table/column-sizing.ts +1 -101
- package/src/components/data-table/composables/useDataTable.ts +103 -123
- package/src/components/data-table/composables/useTableColumns.ts +38 -113
- package/src/components/data-table/composables/useTableDrag.ts +21 -11
- package/src/components/data-table/composables/useTableExport.ts +8 -32
- package/src/components/data-table/composables/useTableResize.ts +13 -17
- package/src/components/data-table/composables/useTableResizeHandles.ts +6 -21
- package/src/components/data-table/types.ts +15 -155
- package/src/components/data-table/utils.ts +1 -75
- package/src/components/date-range-field/utils/validity.ts +1 -21
- package/src/components/editable/editable.variants.ts +1 -1
- package/src/components/file-upload/utils/select.ts +1 -58
- package/src/components/file-upload/utils/size.ts +1 -16
- package/src/components/float-button/float-button.variants.ts +1 -1
- package/src/components/form/composables/useForm.ts +24 -135
- package/src/components/form/standard-schema.ts +1 -26
- package/src/components/form/utils/errors.ts +1 -48
- package/src/components/form/utils/focus.ts +1 -10
- package/src/components/form/utils/values.ts +1 -23
- package/src/components/form-field/FormField.vue +3 -2
- package/src/components/lightbox/types.ts +1 -14
- package/src/components/lightbox/utils/clip.ts +1 -117
- package/src/components/lightbox/utils/download.ts +1 -29
- package/src/components/lightbox/utils/gesture.ts +1 -54
- package/src/components/lightbox/utils/paging.ts +1 -33
- package/src/components/lightbox/utils/pose.ts +1 -142
- package/src/components/lightbox/utils/source.ts +1 -17
- package/src/components/lightbox/utils/zoom.ts +1 -127
- package/src/components/meter-group/utils/tones.ts +1 -14
- package/src/components/multi-select/MultiSelect.vue +1 -2
- package/src/components/number-input/NumberInput.vue +2 -2
- package/src/components/pagination/composables/usePagination.ts +2 -3
- package/src/components/pagination/types.ts +1 -19
- package/src/components/pagination/utils/ranges.ts +1 -12
- package/src/components/password-input/PasswordInput.vue +6 -0
- package/src/components/qr-code/export.ts +1 -65
- package/src/components/range-calendar/utils/limit.ts +1 -11
- package/src/components/rating/utils/fill.ts +1 -4
- package/src/components/ripple/useRipple.ts +10 -198
- package/src/components/scroll-area/ScrollArea.vue +6 -18
- package/src/components/scroll-area/composables/useEdgeShadow.ts +7 -16
- package/src/components/scroll-area/composables/useLayerLock.ts +2 -9
- package/src/components/scroll-area/composables/useWheelRedirect.ts +2 -10
- package/src/components/scroll-area/scroll-restore.ts +1 -148
- package/src/components/search-input/SearchInput.vue +6 -0
- package/src/components/select/types.ts +1 -23
- package/src/components/split-button/split-button.variants.ts +1 -1
- package/src/components/spoiler/SpoilerPainter.ts +1 -197
- package/src/components/spoiler/utils/irisOrigin.ts +1 -40
- package/src/components/spoiler/worklet.ts +1 -199
- package/src/components/table/Table.vue +9 -0
- package/src/components/tabs/TabsList.vue +9 -0
- package/src/components/time/utils/relativeTime.ts +1 -20
- package/src/components/toast/composables/useToastLayout.ts +12 -24
- package/src/components/toast/store.ts +16 -228
- package/src/components/tree/composables/useTree.ts +17 -33
- package/src/components/tree/types.ts +1 -20
- package/src/components/tree/utils/selection.ts +1 -78
- package/src/components/tree-select/types.ts +1 -34
- package/src/components/tree-select/utils/filterTree.ts +1 -19
- package/src/components/virtual-list/composables/useVirtualList.ts +16 -42
- package/src/components/visually-hidden/VisuallyHidden.vue +21 -3
- package/src/lib/caret.ts +1 -48
- package/src/lib/collapse.ts +6 -29
- package/src/lib/date.ts +1 -111
- package/src/lib/field-focus.ts +1 -36
- package/src/lib/overlay-anchor.ts +11 -37
- package/src/lib/pointer-corridor.ts +1 -26
- package/src/lib/reka/useVirtualChoices.ts +55 -133
- package/src/lib/reka/useVirtualTree.ts +22 -65
- package/src/lib/virtual/navigation.ts +1 -26
- package/src/lib/virtual/useVirtualCollection.ts +28 -47
- package/src/lib/virtual/useVirtualWindow.ts +15 -25
- package/src/locale/en-US.ts +1 -220
- package/src/locale/index.ts +9 -53
- package/src/locale/types.ts +1 -225
- package/src/locale/zh-CN.ts +1 -215
- package/src/primitives/number-field/LICENSE +21 -0
- package/src/primitives/number-field/NumberFieldDecrement.vue +21 -0
- package/src/primitives/number-field/NumberFieldIncrement.vue +21 -0
- package/src/primitives/number-field/NumberFieldInput.vue +114 -0
- package/src/primitives/number-field/NumberFieldRoot.vue +169 -0
- package/src/primitives/number-field/context.ts +111 -0
- package/src/primitives/number-field/index.ts +14 -0
- package/src/primitives/utils/LICENSE +44 -0
- package/src/primitives/utils/timers.ts +6 -0
- package/src/primitives/utils/usePrimitiveElement.ts +12 -0
- package/src/primitives/utils/useVModel.ts +37 -0
- package/src/primitives/visually-hidden/LICENSE +21 -0
- package/src/primitives/visually-hidden/VisuallyHiddenInput.ts +97 -0
- package/src/primitives/visually-hidden/VisuallyHiddenInputBubble.vue +49 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
declare function registerPaint(name: string, painter: unknown): void
|
|
2
|
+
|
|
3
|
+
const workletMain = () => {
|
|
4
|
+
const M = Math
|
|
5
|
+
|
|
6
|
+
const lcgrand =
|
|
7
|
+
(seed = 1) =>
|
|
8
|
+
(a = 0, b = 1) =>
|
|
9
|
+
a +
|
|
10
|
+
(M.abs(b - a) * (M.imul(48271, (seed = M.imul(214013, seed) + 2531011)) & 0x7fffffff)) /
|
|
11
|
+
0x7fffffff
|
|
12
|
+
|
|
13
|
+
const pol2vec = (l: number, a = 0) => [l * M.cos(a), l * M.sin(a)] as const
|
|
14
|
+
const vecmag = ([x, y]: readonly number[]) => M.sqrt(x! * x! + y! * y!)
|
|
15
|
+
const vecnorm = ([x, y]: readonly number[], l = vecmag([x!, y!])) =>
|
|
16
|
+
l === 0 ? ([0, 0] as const) : ([x! / l, y! / l] as const)
|
|
17
|
+
|
|
18
|
+
const trapezoidalWave = (l: number, a: number, b: number) => {
|
|
19
|
+
const s = M.max(a, l - b)
|
|
20
|
+
return (t: number) => {
|
|
21
|
+
if (t < a) return M.max(0, t / a)
|
|
22
|
+
if (t > s) return M.max(0, 1 - (t - s) / (l - s))
|
|
23
|
+
return 1
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const cycle = (x: number, n: number) => ((x % n) + n) % n
|
|
28
|
+
const mirror = (x: number, n: number, r: number) => (x < r ? n + x : x > n - r ? x - n : x)
|
|
29
|
+
const clamp = (min: number, x: number, max: number) => M.max(min, M.min(x, max))
|
|
30
|
+
|
|
31
|
+
const cycleBounds = ([x, y]: readonly number[], [w, h]: readonly number[], r: number) => {
|
|
32
|
+
const tx = cycle(x!, w!)
|
|
33
|
+
const ty = cycle(y!, h!)
|
|
34
|
+
return [
|
|
35
|
+
[tx, ty],
|
|
36
|
+
[mirror(tx, w!, r), mirror(ty, h!, r)],
|
|
37
|
+
] as const
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const easeOutCubic = (t: number) => --t * t * t + 1
|
|
41
|
+
|
|
42
|
+
type World = { t: number; tStop: number; tStart: number; n: number }
|
|
43
|
+
|
|
44
|
+
const animateFadeInOut = (world: World, idx: number, duration: number) => {
|
|
45
|
+
const direction = world.tStop <= world.t ? 'out' : 'in'
|
|
46
|
+
const animationStartT = direction === 'in' ? world.tStart : world.tStop
|
|
47
|
+
const t = animationStartT + ((2 / 3) * duration * idx) / world.n
|
|
48
|
+
const fadeFor = (1 / 3) * duration
|
|
49
|
+
|
|
50
|
+
let progress = 0
|
|
51
|
+
if (direction === 'in') {
|
|
52
|
+
progress = (fadeFor + t - world.t) / fadeFor || 0
|
|
53
|
+
} else {
|
|
54
|
+
progress = (world.t - t) / fadeFor || 1
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return easeOutCubic(1 - clamp(0, progress, 1))
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const FAKE_WORDS = [5, 3, 4, 4, 2, 4, 7, 6, 8, 6, 3, 1, 6]
|
|
61
|
+
|
|
62
|
+
const makeWordDistribution = (line: number, em: number, space: number) => {
|
|
63
|
+
let marker = 0
|
|
64
|
+
let i = 0
|
|
65
|
+
let wordslen = 0
|
|
66
|
+
const chunks: [number, number][] = []
|
|
67
|
+
|
|
68
|
+
do {
|
|
69
|
+
const endOfWord = M.min(line, marker + FAKE_WORDS[i++ % FAKE_WORDS.length]! * em)
|
|
70
|
+
wordslen += endOfWord - marker
|
|
71
|
+
chunks.push([marker, (marker = endOfWord)])
|
|
72
|
+
} while ((marker += space) < line)
|
|
73
|
+
|
|
74
|
+
if (chunks.length >= 0) chunks[chunks.length - 1]![1] = line
|
|
75
|
+
|
|
76
|
+
return (t: number) => {
|
|
77
|
+
const w = t * wordslen
|
|
78
|
+
let m = 0
|
|
79
|
+
for (const [start, end] of chunks) {
|
|
80
|
+
const wordLength = end - start
|
|
81
|
+
if (m < w && w <= m + wordLength) return start + w - m
|
|
82
|
+
m += wordLength
|
|
83
|
+
}
|
|
84
|
+
return 0
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const getVar = (props: { get(name: string): unknown }, name: string) => {
|
|
89
|
+
const val = props.get(name)
|
|
90
|
+
if (typeof val === 'string') return val
|
|
91
|
+
return String(val ?? '')
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
class HnSpoilerWorklet {
|
|
95
|
+
static get contextOptions() {
|
|
96
|
+
return { alpha: true }
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
static get inputProperties() {
|
|
100
|
+
return [
|
|
101
|
+
'--hn-nz-t',
|
|
102
|
+
'--hn-nz-stop',
|
|
103
|
+
'--hn-nz-fade',
|
|
104
|
+
'--hn-nz-gap',
|
|
105
|
+
'--hn-nz-accent',
|
|
106
|
+
'--hn-nz-words',
|
|
107
|
+
'--hn-nz-density',
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
paint(
|
|
112
|
+
ctx: CanvasRenderingContext2D,
|
|
113
|
+
size: { width: number; height: number },
|
|
114
|
+
props: { get(name: string): unknown },
|
|
115
|
+
) {
|
|
116
|
+
const rand = lcgrand(4011505)
|
|
117
|
+
|
|
118
|
+
const accent = (getVar(props, '--hn-nz-accent') || '0 0% 0%').split(' ')
|
|
119
|
+
const mimicWords = getVar(props, '--hn-nz-words').trim() === 'true'
|
|
120
|
+
const vmin = 2
|
|
121
|
+
const vmax = 12
|
|
122
|
+
const width = size.width
|
|
123
|
+
const height = size.height
|
|
124
|
+
const gaps = (getVar(props, '--hn-nz-gap') || '0px 0px').split(' ').map(parseFloat)
|
|
125
|
+
const hgap = gaps[0] ?? 0
|
|
126
|
+
const vgap = gaps[1] ?? 0
|
|
127
|
+
const density = parseFloat(getVar(props, '--hn-nz-density')) || 0.08
|
|
128
|
+
const sizedev = (globalThis as { devicePixelRatio?: number }).devicePixelRatio! > 1 ? 0.5 : 0
|
|
129
|
+
const fadeDuration = parseFloat(getVar(props, '--hn-nz-fade')) || 0
|
|
130
|
+
|
|
131
|
+
const world: World = {
|
|
132
|
+
t: parseFloat(getVar(props, '--hn-nz-t') || '0'),
|
|
133
|
+
tStop: parseFloat(getVar(props, '--hn-nz-stop') || 'Infinity'),
|
|
134
|
+
tStart: 0,
|
|
135
|
+
n: M.round(M.min(5000, density * (width - 2 * hgap) * (height - 2 * vgap))),
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const lineWidth = width - 2 * hgap
|
|
139
|
+
const lineHeight = height - 2 * vgap
|
|
140
|
+
|
|
141
|
+
const wordDist = mimicWords
|
|
142
|
+
? makeWordDistribution(lineWidth, lineHeight, M.max(12, lineHeight / 4))
|
|
143
|
+
: (x: number) => x * (width - 2 * hgap)
|
|
144
|
+
|
|
145
|
+
ctx.clearRect(0, 0, size.width, size.height)
|
|
146
|
+
|
|
147
|
+
for (let i = 0; i < world.n; ++i) {
|
|
148
|
+
const x0 = hgap + wordDist(rand())
|
|
149
|
+
const y0 = rand(vgap, height - vgap)
|
|
150
|
+
const v0mag = rand(vmin, vmax)
|
|
151
|
+
const size0 = rand(1, 1 + sizedev)
|
|
152
|
+
|
|
153
|
+
const l = parseInt(accent[2] ?? '0')
|
|
154
|
+
const ldir = l > 50 ? -1 : 1
|
|
155
|
+
const lightness = M.floor(clamp(0, l + ldir * rand(0, 30), 100))
|
|
156
|
+
|
|
157
|
+
const v0 = pol2vec(v0mag, rand(0, M.PI * 2))
|
|
158
|
+
const vx0 = v0[0]
|
|
159
|
+
const vy0 = v0[1]
|
|
160
|
+
vecnorm(v0)
|
|
161
|
+
|
|
162
|
+
const shape = rand() > 0.5 ? 'square' : 'circle'
|
|
163
|
+
const lifetime = rand(0.3, 1.5)
|
|
164
|
+
const respawn = rand(0, 1)
|
|
165
|
+
const visibilityFn = trapezoidalWave(lifetime, 0.15, 0.3)
|
|
166
|
+
const phase = rand(0, lifetime + respawn)
|
|
167
|
+
|
|
168
|
+
const cantSpawnNoMore =
|
|
169
|
+
M.floor((world.tStop + phase) / (lifetime + respawn)) <
|
|
170
|
+
M.floor((world.t + phase) / (lifetime + respawn))
|
|
171
|
+
if (cantSpawnNoMore) continue
|
|
172
|
+
|
|
173
|
+
const t = M.min(lifetime, (world.t + phase) % (lifetime + respawn))
|
|
174
|
+
const x = x0 + vx0 * t
|
|
175
|
+
const y = y0 + vy0 * t
|
|
176
|
+
|
|
177
|
+
const fade = animateFadeInOut(world, i, fadeDuration)
|
|
178
|
+
const alpha = fade * (1 - t / lifetime)
|
|
179
|
+
const psize = fade * (size0 * visibilityFn(t))
|
|
180
|
+
|
|
181
|
+
for (const [wx, wy] of cycleBounds([x, y], [width, height], psize / 2)) {
|
|
182
|
+
ctx.beginPath()
|
|
183
|
+
ctx.fillStyle = `hsl(${accent[0]} ${accent[1]} ${lightness}% / ${M.round(alpha * 100)}%)`
|
|
184
|
+
if (shape === 'square') {
|
|
185
|
+
ctx.rect(wx!, wy!, psize, psize)
|
|
186
|
+
} else {
|
|
187
|
+
ctx.arc(wx!, wy!, psize / 2, 0, M.PI * 2)
|
|
188
|
+
}
|
|
189
|
+
ctx.closePath()
|
|
190
|
+
ctx.fill()
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
registerPaint('hn-spoiler', HnSpoilerWorklet)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export const workletSource = `(${workletMain.toString()})()`
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { DURATION } from '../motion'
|
|
2
|
+
|
|
3
|
+
export type ToastTone = 'neutral' | 'success' | 'danger' | 'warning' | 'info' | 'loading'
|
|
4
|
+
|
|
5
|
+
export type ToasterPosition =
|
|
6
|
+
'bottom-end' | 'bottom-start' | 'bottom-center' | 'top-end' | 'top-start' | 'top-center'
|
|
7
|
+
|
|
8
|
+
export interface ToastAction {
|
|
9
|
+
label: string
|
|
10
|
+
onClick?: () => void
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ToastItem<C = unknown> {
|
|
14
|
+
id: number | string
|
|
15
|
+
tone: ToastTone
|
|
16
|
+
message: string
|
|
17
|
+
description?: string
|
|
18
|
+
duration: number
|
|
19
|
+
open: boolean
|
|
20
|
+
action?: ToastAction
|
|
21
|
+
cancel?: ToastAction
|
|
22
|
+
component?: C
|
|
23
|
+
componentProps?: Record<string, unknown>
|
|
24
|
+
onDismiss?: (id: number | string) => void
|
|
25
|
+
onAutoClose?: (id: number | string) => void
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ToastOptions {
|
|
29
|
+
id?: number | string
|
|
30
|
+
tone?: ToastTone
|
|
31
|
+
description?: string
|
|
32
|
+
duration?: number
|
|
33
|
+
action?: ToastAction
|
|
34
|
+
cancel?: ToastAction
|
|
35
|
+
onDismiss?: (id: number | string) => void
|
|
36
|
+
onAutoClose?: (id: number | string) => void
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type MessageInput<T> = string | { message: string; description?: string } | T
|
|
40
|
+
|
|
41
|
+
export interface ToastPromiseMessages<T> {
|
|
42
|
+
loading: string
|
|
43
|
+
success: MessageInput<(value: T) => string | { message: string; description?: string }>
|
|
44
|
+
error: MessageInput<(reason: unknown) => string | { message: string; description?: string }>
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type ToastTonedOptions = Omit<ToastOptions, 'tone'>
|
|
48
|
+
|
|
49
|
+
export interface ToastStoreOptions<C> {
|
|
50
|
+
state: { items: ToastItem<C>[] }
|
|
51
|
+
raw?: (component: C) => C
|
|
52
|
+
notify?: () => void
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const MAX_VISIBLE = 5
|
|
56
|
+
const SETTLE_DELAY = (DURATION.exit + 0.06) * 1000
|
|
57
|
+
|
|
58
|
+
interface Timer {
|
|
59
|
+
handle: ReturnType<typeof setTimeout> | undefined
|
|
60
|
+
remaining: number
|
|
61
|
+
startedAt: number
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
interface InternalOptions<C> extends ToastOptions {
|
|
65
|
+
component?: C
|
|
66
|
+
componentProps?: Record<string, unknown>
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function defaultDuration(tone: ToastTone) {
|
|
70
|
+
return tone === 'loading' ? 0 : 4000
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function resolveMessage(
|
|
74
|
+
input: MessageInput<(v: never) => string | { message: string; description?: string }>,
|
|
75
|
+
value: unknown,
|
|
76
|
+
): { message: string; description?: string } {
|
|
77
|
+
const raw = typeof input === 'function' ? (input as (v: unknown) => unknown)(value) : input
|
|
78
|
+
if (typeof raw === 'string') return { message: raw }
|
|
79
|
+
return raw as { message: string; description?: string }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function createToastStore<C>(options: ToastStoreOptions<C>) {
|
|
83
|
+
const state = options.state
|
|
84
|
+
const wrap = options.raw ?? ((component: C) => component)
|
|
85
|
+
const notify = options.notify ?? (() => {})
|
|
86
|
+
|
|
87
|
+
let seed = 0
|
|
88
|
+
const timers = new Map<number | string, Timer>()
|
|
89
|
+
const pauseReasons = new Set<string>()
|
|
90
|
+
|
|
91
|
+
function fire(id: number | string) {
|
|
92
|
+
timers.delete(id)
|
|
93
|
+
const item = state.items.find(t => t.id === id)
|
|
94
|
+
if (item) close(item, 'auto')
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function startTimer(item: ToastItem<C>) {
|
|
98
|
+
stopTimer(item.id)
|
|
99
|
+
if (item.duration <= 0) return
|
|
100
|
+
const timer: Timer = { handle: undefined, remaining: item.duration, startedAt: Date.now() }
|
|
101
|
+
timers.set(item.id, timer)
|
|
102
|
+
if (pauseReasons.size === 0) timer.handle = setTimeout(() => fire(item.id), timer.remaining)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function stopTimer(id: number | string) {
|
|
106
|
+
const timer = timers.get(id)
|
|
107
|
+
if (timer?.handle) clearTimeout(timer.handle)
|
|
108
|
+
timers.delete(id)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function pauseTimers(reason: string) {
|
|
112
|
+
if (pauseReasons.has(reason)) return
|
|
113
|
+
const wasRunning = pauseReasons.size === 0
|
|
114
|
+
pauseReasons.add(reason)
|
|
115
|
+
if (!wasRunning) return
|
|
116
|
+
for (const timer of timers.values()) {
|
|
117
|
+
if (!timer.handle) continue
|
|
118
|
+
clearTimeout(timer.handle)
|
|
119
|
+
timer.handle = undefined
|
|
120
|
+
timer.remaining = Math.max(0, timer.remaining - (Date.now() - timer.startedAt))
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function resumeTimers(reason: string) {
|
|
125
|
+
pauseReasons.delete(reason)
|
|
126
|
+
if (pauseReasons.size > 0) return
|
|
127
|
+
for (const [id, timer] of timers) {
|
|
128
|
+
if (timer.handle) continue
|
|
129
|
+
timer.startedAt = Date.now()
|
|
130
|
+
timer.handle = setTimeout(() => fire(id), timer.remaining)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function settle(item: ToastItem<C>) {
|
|
135
|
+
const index = state.items.indexOf(item)
|
|
136
|
+
if (index >= 0) state.items.splice(index, 1)
|
|
137
|
+
notify()
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function close(item: ToastItem<C>, source: 'manual' | 'auto') {
|
|
141
|
+
if (!item.open) return
|
|
142
|
+
item.open = false
|
|
143
|
+
stopTimer(item.id)
|
|
144
|
+
notify()
|
|
145
|
+
if (source === 'auto') item.onAutoClose?.(item.id)
|
|
146
|
+
item.onDismiss?.(item.id)
|
|
147
|
+
setTimeout(() => settle(item), SETTLE_DELAY)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function dismiss(id?: number | string) {
|
|
151
|
+
for (const item of state.items) {
|
|
152
|
+
if (id !== undefined && item.id !== id) continue
|
|
153
|
+
close(item, 'manual')
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function push(message: string, options: InternalOptions<C> = {}) {
|
|
158
|
+
const tone = options.tone ?? 'neutral'
|
|
159
|
+
const existing =
|
|
160
|
+
options.id !== undefined ? state.items.find(t => t.id === options.id) : undefined
|
|
161
|
+
|
|
162
|
+
if (existing && existing.open) {
|
|
163
|
+
existing.tone = tone
|
|
164
|
+
existing.message = message
|
|
165
|
+
existing.description = options.description
|
|
166
|
+
existing.duration = options.duration ?? defaultDuration(tone)
|
|
167
|
+
existing.action = options.action
|
|
168
|
+
existing.cancel = options.cancel
|
|
169
|
+
existing.component = options.component ? wrap(options.component) : undefined
|
|
170
|
+
existing.componentProps = options.componentProps
|
|
171
|
+
if (options.onDismiss) existing.onDismiss = options.onDismiss
|
|
172
|
+
if (options.onAutoClose) existing.onAutoClose = options.onAutoClose
|
|
173
|
+
startTimer(existing)
|
|
174
|
+
notify()
|
|
175
|
+
return existing.id
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (existing) settle(existing)
|
|
179
|
+
|
|
180
|
+
const item: ToastItem<C> = {
|
|
181
|
+
id: options.id ?? ++seed,
|
|
182
|
+
tone,
|
|
183
|
+
message,
|
|
184
|
+
description: options.description,
|
|
185
|
+
duration: options.duration ?? defaultDuration(tone),
|
|
186
|
+
open: true,
|
|
187
|
+
action: options.action,
|
|
188
|
+
cancel: options.cancel,
|
|
189
|
+
component: options.component ? wrap(options.component) : undefined,
|
|
190
|
+
componentProps: options.componentProps,
|
|
191
|
+
onDismiss: options.onDismiss,
|
|
192
|
+
onAutoClose: options.onAutoClose,
|
|
193
|
+
}
|
|
194
|
+
state.items.push(item)
|
|
195
|
+
startTimer(item)
|
|
196
|
+
notify()
|
|
197
|
+
|
|
198
|
+
const visible = state.items.filter(t => t.open)
|
|
199
|
+
for (const stale of visible.slice(0, Math.max(0, visible.length - MAX_VISIBLE))) {
|
|
200
|
+
close(stale, 'manual')
|
|
201
|
+
}
|
|
202
|
+
return item.id
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function promiseToast<T>(
|
|
206
|
+
promise: Promise<T>,
|
|
207
|
+
messages: ToastPromiseMessages<T>,
|
|
208
|
+
options: ToastTonedOptions = {},
|
|
209
|
+
): Promise<T> {
|
|
210
|
+
const id = push(messages.loading, { ...options, tone: 'loading', duration: 0 })
|
|
211
|
+
promise
|
|
212
|
+
.then(value => {
|
|
213
|
+
const done = resolveMessage(messages.success, value)
|
|
214
|
+
push(done.message, { ...options, id, tone: 'success', description: done.description })
|
|
215
|
+
})
|
|
216
|
+
.catch(reason => {
|
|
217
|
+
const done = resolveMessage(messages.error, reason)
|
|
218
|
+
push(done.message, { ...options, id, tone: 'danger', description: done.description })
|
|
219
|
+
})
|
|
220
|
+
return promise
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const toast = Object.assign((message: string, options?: ToastOptions) => push(message, options), {
|
|
224
|
+
success: (message: string, options?: ToastTonedOptions) =>
|
|
225
|
+
push(message, { ...options, tone: 'success' }),
|
|
226
|
+
danger: (message: string, options?: ToastTonedOptions) =>
|
|
227
|
+
push(message, { ...options, tone: 'danger' }),
|
|
228
|
+
warning: (message: string, options?: ToastTonedOptions) =>
|
|
229
|
+
push(message, { ...options, tone: 'warning' }),
|
|
230
|
+
info: (message: string, options?: ToastTonedOptions) =>
|
|
231
|
+
push(message, { ...options, tone: 'info' }),
|
|
232
|
+
loading: (message: string, options?: ToastTonedOptions) =>
|
|
233
|
+
push(message, { ...options, tone: 'loading' }),
|
|
234
|
+
custom: (component: C, options?: ToastTonedOptions & { props?: Record<string, unknown> }) => {
|
|
235
|
+
const { props: componentProps, ...rest } = options ?? {}
|
|
236
|
+
return push('', { ...rest, component, componentProps })
|
|
237
|
+
},
|
|
238
|
+
promise: promiseToast,
|
|
239
|
+
dismiss,
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
return { toast, dismiss, pauseTimers, resumeTimers }
|
|
243
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { prefersReducedMotion } from '../motion'
|
|
2
|
+
|
|
3
|
+
export interface AnchorItem {
|
|
4
|
+
id: string
|
|
5
|
+
label: string
|
|
6
|
+
children?: AnchorItem[]
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type AnchorSlotItem<T extends AnchorItem> =
|
|
10
|
+
T | (T extends { children?: AnchorItem[] } ? NonNullable<T['children']>[number] : never)
|
|
11
|
+
|
|
12
|
+
export interface SpyEntry {
|
|
13
|
+
id: string
|
|
14
|
+
label: string
|
|
15
|
+
depth: number
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface AnchorEntry<T extends AnchorItem> extends SpyEntry {
|
|
19
|
+
item: AnchorSlotItem<T>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const SCROLL_SPY_OPTIONS = {
|
|
23
|
+
rootMargin: '0px 0px -15% 0px',
|
|
24
|
+
threshold: [0, Number.EPSILON],
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function anchorEntries<T extends AnchorItem>(items: T[]): AnchorEntry<T>[] {
|
|
28
|
+
return items.flatMap(item => [
|
|
29
|
+
{ id: item.id, label: item.label, depth: 0, item: item as AnchorSlotItem<T> },
|
|
30
|
+
...(item.children ?? []).map(child => ({
|
|
31
|
+
id: child.id,
|
|
32
|
+
label: child.label,
|
|
33
|
+
depth: 1,
|
|
34
|
+
item: child as AnchorSlotItem<T>,
|
|
35
|
+
})),
|
|
36
|
+
])
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function coveredEntries<E extends SpyEntry>(entries: E[], visible: ReadonlySet<string>) {
|
|
40
|
+
return entries.filter(entry => visible.has(entry.id))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function coveredSpan(entries: SpyEntry[], visible: ReadonlySet<string>) {
|
|
44
|
+
const rows = entries.flatMap((entry, index) => (visible.has(entry.id) ? [index] : []))
|
|
45
|
+
return rows.length ? `${rows[0]! + 1} / ${rows.at(-1)! + 2}` : undefined
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function sameTargets(next: SpyEntry[], previous: SpyEntry[]) {
|
|
49
|
+
return (
|
|
50
|
+
next.length === previous.length &&
|
|
51
|
+
next.every((entry, index) => entry.id === previous[index]?.id)
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function hashTarget(entries: SpyEntry[]) {
|
|
56
|
+
const hash = decodeURIComponent(location.hash.slice(1))
|
|
57
|
+
return hash && entries.some(entry => entry.id === hash) ? hash : undefined
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function spyTargets(entries: SpyEntry[]) {
|
|
61
|
+
return entries.map(({ id }) => document.getElementById(id))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function applyIntersections(
|
|
65
|
+
intersecting: Set<string>,
|
|
66
|
+
observed: IntersectionObserverEntry[],
|
|
67
|
+
current: string | undefined,
|
|
68
|
+
): ReadonlySet<string> {
|
|
69
|
+
for (const entry of observed) {
|
|
70
|
+
if (entry.isIntersecting && entry.intersectionRatio > 0) intersecting.add(entry.target.id)
|
|
71
|
+
else intersecting.delete(entry.target.id)
|
|
72
|
+
}
|
|
73
|
+
return intersecting.size ? new Set(intersecting) : new Set(current ? [current] : [])
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function jumpToAnchor(event: { preventDefault(): void }, id: string) {
|
|
77
|
+
const el = document.getElementById(id)
|
|
78
|
+
if (!el) return false
|
|
79
|
+
event.preventDefault()
|
|
80
|
+
el.scrollIntoView({ behavior: prefersReducedMotion() ? 'auto' : 'smooth', block: 'start' })
|
|
81
|
+
history.replaceState(history.state, '', `#${id}`)
|
|
82
|
+
return true
|
|
83
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type SlideDirection = 1 | -1
|
|
2
|
+
|
|
3
|
+
export function stepBetween(previous: number, next: number, count: number): SlideDirection {
|
|
4
|
+
if (count < 2) return 1
|
|
5
|
+
const from = ((previous % count) + count) % count
|
|
6
|
+
const to = ((next % count) + count) % count
|
|
7
|
+
if (to === (from + 1) % count) return 1
|
|
8
|
+
if (to === (from - 1 + count) % count) return -1
|
|
9
|
+
return to > from ? 1 : -1
|
|
10
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getLocalTimeZone, type DateValue } from '@internationalized/date'
|
|
2
|
+
|
|
3
|
+
const local = (date: DateValue) => date.toDate(getLocalTimeZone())
|
|
4
|
+
|
|
5
|
+
export function formatMonthHeading(tag: string, date: DateValue) {
|
|
6
|
+
return new Intl.DateTimeFormat(tag, { year: 'numeric', month: 'long' }).format(local(date))
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function formatYearHeading(tag: string, date: DateValue) {
|
|
10
|
+
return new Intl.DateTimeFormat(tag, { year: 'numeric' }).format(local(date))
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function formatMonthName(tag: string, date: DateValue) {
|
|
14
|
+
return new Intl.DateTimeFormat(tag, { month: 'short' }).format(local(date))
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function formatDigits(tag: string, value: number) {
|
|
18
|
+
return new Intl.NumberFormat(tag, { useGrouping: false }).format(value)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function formatYearsHeading(tag: string, cells: DateValue[]) {
|
|
22
|
+
return `${formatDigits(tag, cells[0]!.year)} – ${formatDigits(tag, cells.at(-1)!.year)}`
|
|
23
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const MIRRORED = [
|
|
2
|
+
'font-family',
|
|
3
|
+
'font-size',
|
|
4
|
+
'font-weight',
|
|
5
|
+
'font-style',
|
|
6
|
+
'font-variant',
|
|
7
|
+
'font-feature-settings',
|
|
8
|
+
'line-height',
|
|
9
|
+
'letter-spacing',
|
|
10
|
+
'word-spacing',
|
|
11
|
+
'text-indent',
|
|
12
|
+
'text-transform',
|
|
13
|
+
'tab-size',
|
|
14
|
+
'direction',
|
|
15
|
+
'padding-top',
|
|
16
|
+
'padding-right',
|
|
17
|
+
'padding-bottom',
|
|
18
|
+
'padding-left',
|
|
19
|
+
'border-top-width',
|
|
20
|
+
'border-right-width',
|
|
21
|
+
'border-bottom-width',
|
|
22
|
+
'border-left-width',
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
export function caretTop(node: HTMLTextAreaElement, at = node.selectionEnd): number {
|
|
26
|
+
const style = getComputedStyle(node)
|
|
27
|
+
const mirror = node.ownerDocument.createElement('div')
|
|
28
|
+
for (const prop of MIRRORED) mirror.style.setProperty(prop, style.getPropertyValue(prop))
|
|
29
|
+
Object.assign(mirror.style, {
|
|
30
|
+
position: 'absolute',
|
|
31
|
+
top: '0',
|
|
32
|
+
insetInlineStart: '-9999px',
|
|
33
|
+
visibility: 'hidden',
|
|
34
|
+
pointerEvents: 'none',
|
|
35
|
+
boxSizing: 'border-box',
|
|
36
|
+
width: `${node.offsetWidth}px`,
|
|
37
|
+
whiteSpace: 'pre-wrap',
|
|
38
|
+
overflowWrap: 'break-word',
|
|
39
|
+
})
|
|
40
|
+
mirror.textContent = node.value.slice(0, at)
|
|
41
|
+
const marker = node.ownerDocument.createElement('span')
|
|
42
|
+
marker.textContent = node.value.slice(at) || ''
|
|
43
|
+
mirror.append(marker)
|
|
44
|
+
node.ownerDocument.body.append(mirror)
|
|
45
|
+
const top = marker.offsetTop
|
|
46
|
+
mirror.remove()
|
|
47
|
+
return top
|
|
48
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type CollapseAxis = 'y' | 'x'
|
|
2
|
+
|
|
3
|
+
export function collapseGapOf(parent: Element | null, axis: CollapseAxis = 'y') {
|
|
4
|
+
if (!parent) return '0px'
|
|
5
|
+
const style = getComputedStyle(parent)
|
|
6
|
+
const stacked = style.display.includes('flex') || style.display.includes('grid')
|
|
7
|
+
const gap = axis === 'y' ? style.rowGap : style.columnGap
|
|
8
|
+
return stacked && gap !== 'normal' ? gap : '0px'
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function writeCollapseGap(el: Element, parent: Element | null, axis: CollapseAxis = 'y') {
|
|
12
|
+
;(el as HTMLElement).style.setProperty('--hn-collapse-gap', collapseGapOf(parent, axis))
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function collapseHooks(axis: CollapseAxis = 'y', parentOf?: () => Element | null) {
|
|
16
|
+
function beforeEnter(el: Element) {
|
|
17
|
+
writeCollapseGap(el, el.parentElement ?? parentOf?.() ?? null, axis)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function beforeLeave(el: Element) {
|
|
21
|
+
writeCollapseGap(el, el.parentElement, axis)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function afterEnter(el: Element) {
|
|
25
|
+
;(el as HTMLElement).style.removeProperty('--hn-collapse-gap')
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return { beforeEnter, afterEnter, beforeLeave }
|
|
29
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface Hotkey {
|
|
2
|
+
key: string
|
|
3
|
+
mod: boolean
|
|
4
|
+
shift: boolean
|
|
5
|
+
alt: boolean
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function parseHotkey(spec: string): Hotkey {
|
|
9
|
+
const parts = spec
|
|
10
|
+
.toLowerCase()
|
|
11
|
+
.split('+')
|
|
12
|
+
.map(part => part.trim())
|
|
13
|
+
.filter(Boolean)
|
|
14
|
+
const modifiers = parts.slice(0, -1)
|
|
15
|
+
return {
|
|
16
|
+
key: parts.at(-1) ?? '',
|
|
17
|
+
mod: modifiers.includes('mod'),
|
|
18
|
+
shift: modifiers.includes('shift'),
|
|
19
|
+
alt: modifiers.includes('alt'),
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function matchesHotkey(event: KeyboardEvent, hotkey: Hotkey): boolean {
|
|
24
|
+
if (event.key.toLowerCase() !== hotkey.key) return false
|
|
25
|
+
const mod = event.metaKey || event.ctrlKey
|
|
26
|
+
return mod === hotkey.mod && event.shiftKey === hotkey.shift && event.altKey === hotkey.alt
|
|
27
|
+
}
|