texlite 0.8.3 → 0.9.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/DESIGN.md +83 -9
- package/OPERATIONS.md +19 -2
- package/dist/client/assets/AdminUsers-3CHb5012.js +1 -0
- package/dist/client/assets/CitationLibraryDialog-zPpsUhWJ.js +1 -0
- package/dist/client/assets/Dashboard-CWfSLzD3.js +2 -0
- package/dist/client/assets/GitDialog-BUU2U_LV.js +3 -0
- package/dist/client/assets/HistoryDialog-B6aopsrw.js +7 -0
- package/dist/client/assets/{LatexEditor-2BD2xa8h.js → LatexEditor-CM445Tk0.js} +2 -2
- package/dist/client/assets/PdfPreview-BFVNczSk.js +1 -0
- package/dist/client/assets/ProjectIconPickerDialog-Cf0zBf8u.js +1 -0
- package/dist/client/assets/ProjectNavigationDialogs-TPbe11iR.js +1 -0
- package/dist/client/assets/ProjectSettings-CDQvIlQ4.js +1 -0
- package/dist/client/assets/ProjectWorkspace-C6GrvKN6.js +27 -0
- package/dist/client/assets/SelectionHistoryDialog-CyE0_YDs.js +3 -0
- package/dist/client/assets/SystemMetricsDialog-CuqHPUnn.js +1 -0
- package/dist/client/assets/TagManagementDialog-gRLM3lLx.js +1 -0
- package/dist/client/assets/WordCountDialog-B4PI0vEk.js +1 -0
- package/dist/client/assets/check-BXvzrdoz.js +1 -0
- package/dist/client/assets/chevron-left-BB5MYb7g.js +1 -0
- package/dist/client/assets/citationLibrary-ZeQPCv5O.js +26 -0
- package/dist/client/assets/hard-drive-6uYFyezl.js +1 -0
- package/dist/client/assets/index-BRT5O-Hg.js +5 -0
- package/dist/client/assets/index-C0t11tlT.js +14 -0
- package/dist/client/assets/index-DXWp2bzM.css +1 -0
- package/dist/client/assets/key-round-DOAxDSfz.js +1 -0
- package/dist/client/assets/minimize-2-BWtbag2I.js +1 -0
- package/dist/client/assets/{minus-DK3ejRQp.js → minus-9eVJnugf.js} +1 -1
- package/dist/client/assets/plus-BGXipRoG.js +1 -0
- package/dist/client/assets/{react-BoEjKzFZ.js → react-BVUjbTTn.js} +1 -1
- package/dist/client/assets/refresh-cw-Dvp3O90f.js +1 -0
- package/dist/client/assets/search-b1ORp1k8.js +1 -0
- package/dist/client/assets/sigma-Bk0_MzWi.js +1 -0
- package/dist/client/assets/{spellCheck-BAgtQ60E.js → spellCheck-BJjWgnef.js} +1 -1
- package/dist/client/assets/tags-JAkbmWns.js +1 -0
- package/dist/client/assets/type-CE2DYkPH.js +1 -0
- package/dist/client/assets/user-plus-CKalKSsw.js +1 -0
- package/dist/client/assets/x-Bq29njHL.js +1 -0
- package/dist/client/index.html +3 -3
- package/dist/server/app.js +45 -4
- package/dist/server/cli.js +4 -0
- package/dist/server/collaboration.js +231 -12
- package/dist/server/commentMentions.js +139 -0
- package/dist/server/config.js +9 -2
- package/dist/server/db.js +63 -1
- package/dist/server/editHistory.js +411 -0
- package/dist/server/editHistoryRetry.js +90 -0
- package/dist/server/history.js +136 -20
- package/dist/server/historyRetention.js +37 -0
- package/dist/server/i18n.js +4 -0
- package/dist/server/index.js +6 -0
- package/dist/server/latexCompletion.js +37 -10
- package/dist/server/logRotation.js +82 -0
- package/dist/server/lucideIcons.js +37 -38
- package/dist/server/pm2.js +7 -0
- package/dist/server/projects.js +34 -12
- package/dist/server/routes/comments.js +107 -16
- package/dist/server/routes/projectHistory.js +93 -7
- package/dist/server/routes/projectShared.js +2 -1
- package/dist/server/routes/projects.js +3 -1
- package/dist/shared/lucide-icons/a-arrow-down.svg +1 -0
- package/dist/shared/lucide-icons/a-arrow-up.svg +1 -0
- package/dist/shared/lucide-icons/a-large-small.svg +1 -0
- package/dist/shared/lucide-icons/accessibility.svg +1 -0
- package/dist/shared/lucide-icons/activity.svg +1 -0
- package/dist/shared/lucide-icons/air-vent.svg +1 -0
- package/dist/shared/lucide-icons/airplay.svg +1 -0
- package/dist/shared/lucide-icons/alarm-clock-check.svg +1 -0
- package/dist/shared/lucide-icons/alarm-clock-minus.svg +1 -0
- package/dist/shared/lucide-icons/alarm-clock-off.svg +1 -0
- package/dist/shared/lucide-icons/alarm-clock-plus.svg +1 -0
- package/dist/shared/lucide-icons/alarm-clock.svg +1 -0
- package/dist/shared/lucide-icons/alarm-smoke.svg +1 -0
- package/dist/shared/lucide-icons/album.svg +1 -0
- package/dist/shared/lucide-icons/align-center-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/align-center-vertical.svg +1 -0
- package/dist/shared/lucide-icons/align-center.svg +1 -0
- package/dist/shared/lucide-icons/align-end-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/align-end-vertical.svg +1 -0
- package/dist/shared/lucide-icons/align-horizontal-distribute-center.svg +1 -0
- package/dist/shared/lucide-icons/align-horizontal-distribute-end.svg +1 -0
- package/dist/shared/lucide-icons/align-horizontal-distribute-start.svg +1 -0
- package/dist/shared/lucide-icons/align-horizontal-justify-center.svg +1 -0
- package/dist/shared/lucide-icons/align-horizontal-justify-end.svg +1 -0
- package/dist/shared/lucide-icons/align-horizontal-justify-start.svg +1 -0
- package/dist/shared/lucide-icons/align-horizontal-space-around.svg +1 -0
- package/dist/shared/lucide-icons/align-horizontal-space-between.svg +1 -0
- package/dist/shared/lucide-icons/align-justify.svg +1 -0
- package/dist/shared/lucide-icons/align-left.svg +1 -0
- package/dist/shared/lucide-icons/align-right.svg +1 -0
- package/dist/shared/lucide-icons/align-start-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/align-start-vertical.svg +1 -0
- package/dist/shared/lucide-icons/align-vertical-distribute-center.svg +1 -0
- package/dist/shared/lucide-icons/align-vertical-distribute-end.svg +1 -0
- package/dist/shared/lucide-icons/align-vertical-distribute-start.svg +1 -0
- package/dist/shared/lucide-icons/align-vertical-justify-center.svg +1 -0
- package/dist/shared/lucide-icons/align-vertical-justify-end.svg +1 -0
- package/dist/shared/lucide-icons/align-vertical-justify-start.svg +1 -0
- package/dist/shared/lucide-icons/align-vertical-space-around.svg +1 -0
- package/dist/shared/lucide-icons/align-vertical-space-between.svg +1 -0
- package/dist/shared/lucide-icons/ambulance.svg +1 -0
- package/dist/shared/lucide-icons/ampersand.svg +1 -0
- package/dist/shared/lucide-icons/ampersands.svg +1 -0
- package/dist/shared/lucide-icons/amphora.svg +1 -0
- package/dist/shared/lucide-icons/anchor.svg +1 -0
- package/dist/shared/lucide-icons/angry.svg +1 -0
- package/dist/shared/lucide-icons/annoyed.svg +1 -0
- package/dist/shared/lucide-icons/antenna.svg +1 -0
- package/dist/shared/lucide-icons/anvil.svg +1 -0
- package/dist/shared/lucide-icons/aperture.svg +1 -0
- package/dist/shared/lucide-icons/app-window-mac.svg +1 -0
- package/dist/shared/lucide-icons/app-window.svg +1 -0
- package/dist/shared/lucide-icons/apple.svg +1 -0
- package/dist/shared/lucide-icons/archive-restore.svg +1 -0
- package/dist/shared/lucide-icons/archive-x.svg +1 -0
- package/dist/shared/lucide-icons/archive.svg +1 -0
- package/dist/shared/lucide-icons/armchair.svg +1 -0
- package/dist/shared/lucide-icons/arrow-big-down-dash.svg +1 -0
- package/dist/shared/lucide-icons/arrow-big-down.svg +1 -0
- package/dist/shared/lucide-icons/arrow-big-left-dash.svg +1 -0
- package/dist/shared/lucide-icons/arrow-big-left.svg +1 -0
- package/dist/shared/lucide-icons/arrow-big-right-dash.svg +1 -0
- package/dist/shared/lucide-icons/arrow-big-right.svg +1 -0
- package/dist/shared/lucide-icons/arrow-big-up-dash.svg +1 -0
- package/dist/shared/lucide-icons/arrow-big-up.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down-az.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down-from-line.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down-left.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down-narrow-wide.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down-right.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down-to-dot.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down-to-line.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down-up.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down-wide-narrow.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down-za.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down01.svg +1 -0
- package/dist/shared/lucide-icons/arrow-down10.svg +1 -0
- package/dist/shared/lucide-icons/arrow-left-from-line.svg +1 -0
- package/dist/shared/lucide-icons/arrow-left-right.svg +1 -0
- package/dist/shared/lucide-icons/arrow-left-to-line.svg +1 -0
- package/dist/shared/lucide-icons/arrow-left.svg +1 -0
- package/dist/shared/lucide-icons/arrow-right-from-line.svg +1 -0
- package/dist/shared/lucide-icons/arrow-right-left.svg +1 -0
- package/dist/shared/lucide-icons/arrow-right-to-line.svg +1 -0
- package/dist/shared/lucide-icons/arrow-right.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up-az.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up-down.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up-from-dot.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up-from-line.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up-left.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up-narrow-wide.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up-right.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up-to-line.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up-wide-narrow.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up-za.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up01.svg +1 -0
- package/dist/shared/lucide-icons/arrow-up10.svg +1 -0
- package/dist/shared/lucide-icons/arrows-up-from-line.svg +1 -0
- package/dist/shared/lucide-icons/asterisk.svg +1 -0
- package/dist/shared/lucide-icons/at-sign.svg +1 -0
- package/dist/shared/lucide-icons/atom.svg +1 -0
- package/dist/shared/lucide-icons/audio-lines.svg +1 -0
- package/dist/shared/lucide-icons/audio-waveform.svg +1 -0
- package/dist/shared/lucide-icons/award.svg +1 -0
- package/dist/shared/lucide-icons/axe.svg +1 -0
- package/dist/shared/lucide-icons/axis3d.svg +1 -0
- package/dist/shared/lucide-icons/baby.svg +1 -0
- package/dist/shared/lucide-icons/backpack.svg +1 -0
- package/dist/shared/lucide-icons/badge-alert.svg +1 -0
- package/dist/shared/lucide-icons/badge-cent.svg +1 -0
- package/dist/shared/lucide-icons/badge-check.svg +1 -0
- package/dist/shared/lucide-icons/badge-dollar-sign.svg +1 -0
- package/dist/shared/lucide-icons/badge-euro.svg +1 -0
- package/dist/shared/lucide-icons/badge-help.svg +1 -0
- package/dist/shared/lucide-icons/badge-indian-rupee.svg +1 -0
- package/dist/shared/lucide-icons/badge-info.svg +1 -0
- package/dist/shared/lucide-icons/badge-japanese-yen.svg +1 -0
- package/dist/shared/lucide-icons/badge-minus.svg +1 -0
- package/dist/shared/lucide-icons/badge-percent.svg +1 -0
- package/dist/shared/lucide-icons/badge-plus.svg +1 -0
- package/dist/shared/lucide-icons/badge-pound-sterling.svg +1 -0
- package/dist/shared/lucide-icons/badge-russian-ruble.svg +1 -0
- package/dist/shared/lucide-icons/badge-swiss-franc.svg +1 -0
- package/dist/shared/lucide-icons/badge-x.svg +1 -0
- package/dist/shared/lucide-icons/badge.svg +1 -0
- package/dist/shared/lucide-icons/baggage-claim.svg +1 -0
- package/dist/shared/lucide-icons/ban.svg +1 -0
- package/dist/shared/lucide-icons/banana.svg +1 -0
- package/dist/shared/lucide-icons/bandage.svg +1 -0
- package/dist/shared/lucide-icons/banknote.svg +1 -0
- package/dist/shared/lucide-icons/barcode.svg +1 -0
- package/dist/shared/lucide-icons/baseline.svg +1 -0
- package/dist/shared/lucide-icons/bath.svg +1 -0
- package/dist/shared/lucide-icons/battery-charging.svg +1 -0
- package/dist/shared/lucide-icons/battery-full.svg +1 -0
- package/dist/shared/lucide-icons/battery-low.svg +1 -0
- package/dist/shared/lucide-icons/battery-medium.svg +1 -0
- package/dist/shared/lucide-icons/battery-warning.svg +1 -0
- package/dist/shared/lucide-icons/battery.svg +1 -0
- package/dist/shared/lucide-icons/beaker.svg +1 -0
- package/dist/shared/lucide-icons/bean-off.svg +1 -0
- package/dist/shared/lucide-icons/bean.svg +1 -0
- package/dist/shared/lucide-icons/bed-double.svg +1 -0
- package/dist/shared/lucide-icons/bed-single.svg +1 -0
- package/dist/shared/lucide-icons/bed.svg +1 -0
- package/dist/shared/lucide-icons/beef.svg +1 -0
- package/dist/shared/lucide-icons/beer-off.svg +1 -0
- package/dist/shared/lucide-icons/beer.svg +1 -0
- package/dist/shared/lucide-icons/bell-dot.svg +1 -0
- package/dist/shared/lucide-icons/bell-electric.svg +1 -0
- package/dist/shared/lucide-icons/bell-minus.svg +1 -0
- package/dist/shared/lucide-icons/bell-off.svg +1 -0
- package/dist/shared/lucide-icons/bell-plus.svg +1 -0
- package/dist/shared/lucide-icons/bell-ring.svg +1 -0
- package/dist/shared/lucide-icons/bell.svg +1 -0
- package/dist/shared/lucide-icons/between-horizontal-end.svg +1 -0
- package/dist/shared/lucide-icons/between-horizontal-start.svg +1 -0
- package/dist/shared/lucide-icons/between-vertical-end.svg +1 -0
- package/dist/shared/lucide-icons/between-vertical-start.svg +1 -0
- package/dist/shared/lucide-icons/biceps-flexed.svg +1 -0
- package/dist/shared/lucide-icons/bike.svg +1 -0
- package/dist/shared/lucide-icons/binary.svg +1 -0
- package/dist/shared/lucide-icons/binoculars.svg +1 -0
- package/dist/shared/lucide-icons/biohazard.svg +1 -0
- package/dist/shared/lucide-icons/bird.svg +1 -0
- package/dist/shared/lucide-icons/bitcoin.svg +1 -0
- package/dist/shared/lucide-icons/blend.svg +1 -0
- package/dist/shared/lucide-icons/blinds.svg +1 -0
- package/dist/shared/lucide-icons/blocks.svg +1 -0
- package/dist/shared/lucide-icons/bluetooth-connected.svg +1 -0
- package/dist/shared/lucide-icons/bluetooth-off.svg +1 -0
- package/dist/shared/lucide-icons/bluetooth-searching.svg +1 -0
- package/dist/shared/lucide-icons/bluetooth.svg +1 -0
- package/dist/shared/lucide-icons/bold.svg +1 -0
- package/dist/shared/lucide-icons/bolt.svg +1 -0
- package/dist/shared/lucide-icons/bomb.svg +1 -0
- package/dist/shared/lucide-icons/bone.svg +1 -0
- package/dist/shared/lucide-icons/book-a.svg +1 -0
- package/dist/shared/lucide-icons/book-audio.svg +1 -0
- package/dist/shared/lucide-icons/book-check.svg +1 -0
- package/dist/shared/lucide-icons/book-copy.svg +1 -0
- package/dist/shared/lucide-icons/book-dashed.svg +1 -0
- package/dist/shared/lucide-icons/book-down.svg +1 -0
- package/dist/shared/lucide-icons/book-headphones.svg +1 -0
- package/dist/shared/lucide-icons/book-heart.svg +1 -0
- package/dist/shared/lucide-icons/book-image.svg +1 -0
- package/dist/shared/lucide-icons/book-key.svg +1 -0
- package/dist/shared/lucide-icons/book-lock.svg +1 -0
- package/dist/shared/lucide-icons/book-marked.svg +1 -0
- package/dist/shared/lucide-icons/book-minus.svg +1 -0
- package/dist/shared/lucide-icons/book-open-check.svg +1 -0
- package/dist/shared/lucide-icons/book-open-text.svg +1 -0
- package/dist/shared/lucide-icons/book-open.svg +1 -0
- package/dist/shared/lucide-icons/book-plus.svg +1 -0
- package/dist/shared/lucide-icons/book-text.svg +1 -0
- package/dist/shared/lucide-icons/book-type.svg +1 -0
- package/dist/shared/lucide-icons/book-up.svg +1 -0
- package/dist/shared/lucide-icons/book-up2.svg +1 -0
- package/dist/shared/lucide-icons/book-user.svg +1 -0
- package/dist/shared/lucide-icons/book-x.svg +1 -0
- package/dist/shared/lucide-icons/book.svg +1 -0
- package/dist/shared/lucide-icons/bookmark-check.svg +1 -0
- package/dist/shared/lucide-icons/bookmark-minus.svg +1 -0
- package/dist/shared/lucide-icons/bookmark-plus.svg +1 -0
- package/dist/shared/lucide-icons/bookmark-x.svg +1 -0
- package/dist/shared/lucide-icons/bookmark.svg +1 -0
- package/dist/shared/lucide-icons/boom-box.svg +1 -0
- package/dist/shared/lucide-icons/bot-message-square.svg +1 -0
- package/dist/shared/lucide-icons/bot-off.svg +1 -0
- package/dist/shared/lucide-icons/bot.svg +1 -0
- package/dist/shared/lucide-icons/box.svg +1 -0
- package/dist/shared/lucide-icons/boxes.svg +1 -0
- package/dist/shared/lucide-icons/braces.svg +1 -0
- package/dist/shared/lucide-icons/brackets.svg +1 -0
- package/dist/shared/lucide-icons/brain-circuit.svg +1 -0
- package/dist/shared/lucide-icons/brain-cog.svg +1 -0
- package/dist/shared/lucide-icons/brain.svg +1 -0
- package/dist/shared/lucide-icons/brick-wall.svg +1 -0
- package/dist/shared/lucide-icons/briefcase-business.svg +1 -0
- package/dist/shared/lucide-icons/briefcase-conveyor-belt.svg +1 -0
- package/dist/shared/lucide-icons/briefcase-medical.svg +1 -0
- package/dist/shared/lucide-icons/briefcase.svg +1 -0
- package/dist/shared/lucide-icons/bring-to-front.svg +1 -0
- package/dist/shared/lucide-icons/brush.svg +1 -0
- package/dist/shared/lucide-icons/bug-off.svg +1 -0
- package/dist/shared/lucide-icons/bug-play.svg +1 -0
- package/dist/shared/lucide-icons/bug.svg +1 -0
- package/dist/shared/lucide-icons/building.svg +1 -0
- package/dist/shared/lucide-icons/building2.svg +1 -0
- package/dist/shared/lucide-icons/bus-front.svg +1 -0
- package/dist/shared/lucide-icons/bus.svg +1 -0
- package/dist/shared/lucide-icons/cable-car.svg +1 -0
- package/dist/shared/lucide-icons/cable.svg +1 -0
- package/dist/shared/lucide-icons/cake-slice.svg +1 -0
- package/dist/shared/lucide-icons/cake.svg +1 -0
- package/dist/shared/lucide-icons/calculator.svg +1 -0
- package/dist/shared/lucide-icons/calendar-arrow-down.svg +1 -0
- package/dist/shared/lucide-icons/calendar-arrow-up.svg +1 -0
- package/dist/shared/lucide-icons/calendar-check.svg +1 -0
- package/dist/shared/lucide-icons/calendar-check2.svg +1 -0
- package/dist/shared/lucide-icons/calendar-clock.svg +1 -0
- package/dist/shared/lucide-icons/calendar-cog.svg +1 -0
- package/dist/shared/lucide-icons/calendar-days.svg +1 -0
- package/dist/shared/lucide-icons/calendar-fold.svg +1 -0
- package/dist/shared/lucide-icons/calendar-heart.svg +1 -0
- package/dist/shared/lucide-icons/calendar-minus.svg +1 -0
- package/dist/shared/lucide-icons/calendar-minus2.svg +1 -0
- package/dist/shared/lucide-icons/calendar-off.svg +1 -0
- package/dist/shared/lucide-icons/calendar-plus.svg +1 -0
- package/dist/shared/lucide-icons/calendar-plus2.svg +1 -0
- package/dist/shared/lucide-icons/calendar-range.svg +1 -0
- package/dist/shared/lucide-icons/calendar-search.svg +1 -0
- package/dist/shared/lucide-icons/calendar-sync.svg +1 -0
- package/dist/shared/lucide-icons/calendar-x.svg +1 -0
- package/dist/shared/lucide-icons/calendar-x2.svg +1 -0
- package/dist/shared/lucide-icons/calendar.svg +1 -0
- package/dist/shared/lucide-icons/calendar1.svg +1 -0
- package/dist/shared/lucide-icons/camera-off.svg +1 -0
- package/dist/shared/lucide-icons/camera.svg +1 -0
- package/dist/shared/lucide-icons/candy-cane.svg +1 -0
- package/dist/shared/lucide-icons/candy-off.svg +1 -0
- package/dist/shared/lucide-icons/candy.svg +1 -0
- package/dist/shared/lucide-icons/cannabis.svg +1 -0
- package/dist/shared/lucide-icons/captions-off.svg +1 -0
- package/dist/shared/lucide-icons/captions.svg +1 -0
- package/dist/shared/lucide-icons/car-front.svg +1 -0
- package/dist/shared/lucide-icons/car-taxi-front.svg +1 -0
- package/dist/shared/lucide-icons/car.svg +1 -0
- package/dist/shared/lucide-icons/caravan.svg +1 -0
- package/dist/shared/lucide-icons/carrot.svg +1 -0
- package/dist/shared/lucide-icons/case-lower.svg +1 -0
- package/dist/shared/lucide-icons/case-sensitive.svg +1 -0
- package/dist/shared/lucide-icons/case-upper.svg +1 -0
- package/dist/shared/lucide-icons/cassette-tape.svg +1 -0
- package/dist/shared/lucide-icons/cast.svg +1 -0
- package/dist/shared/lucide-icons/castle.svg +1 -0
- package/dist/shared/lucide-icons/cat.svg +1 -0
- package/dist/shared/lucide-icons/cctv.svg +1 -0
- package/dist/shared/lucide-icons/chart-area.svg +1 -0
- package/dist/shared/lucide-icons/chart-bar-big.svg +1 -0
- package/dist/shared/lucide-icons/chart-bar-decreasing.svg +1 -0
- package/dist/shared/lucide-icons/chart-bar-increasing.svg +1 -0
- package/dist/shared/lucide-icons/chart-bar-stacked.svg +1 -0
- package/dist/shared/lucide-icons/chart-bar.svg +1 -0
- package/dist/shared/lucide-icons/chart-candlestick.svg +1 -0
- package/dist/shared/lucide-icons/chart-column-big.svg +1 -0
- package/dist/shared/lucide-icons/chart-column-decreasing.svg +1 -0
- package/dist/shared/lucide-icons/chart-column-increasing.svg +1 -0
- package/dist/shared/lucide-icons/chart-column-stacked.svg +1 -0
- package/dist/shared/lucide-icons/chart-column.svg +1 -0
- package/dist/shared/lucide-icons/chart-gantt.svg +1 -0
- package/dist/shared/lucide-icons/chart-line.svg +1 -0
- package/dist/shared/lucide-icons/chart-network.svg +1 -0
- package/dist/shared/lucide-icons/chart-no-axes-column-decreasing.svg +1 -0
- package/dist/shared/lucide-icons/chart-no-axes-column-increasing.svg +1 -0
- package/dist/shared/lucide-icons/chart-no-axes-column.svg +1 -0
- package/dist/shared/lucide-icons/chart-no-axes-combined.svg +1 -0
- package/dist/shared/lucide-icons/chart-no-axes-gantt.svg +1 -0
- package/dist/shared/lucide-icons/chart-pie.svg +1 -0
- package/dist/shared/lucide-icons/chart-scatter.svg +1 -0
- package/dist/shared/lucide-icons/chart-spline.svg +1 -0
- package/dist/shared/lucide-icons/check-check.svg +1 -0
- package/dist/shared/lucide-icons/check.svg +1 -0
- package/dist/shared/lucide-icons/chef-hat.svg +1 -0
- package/dist/shared/lucide-icons/cherry.svg +1 -0
- package/dist/shared/lucide-icons/chevron-down.svg +1 -0
- package/dist/shared/lucide-icons/chevron-first.svg +1 -0
- package/dist/shared/lucide-icons/chevron-last.svg +1 -0
- package/dist/shared/lucide-icons/chevron-left.svg +1 -0
- package/dist/shared/lucide-icons/chevron-right.svg +1 -0
- package/dist/shared/lucide-icons/chevron-up.svg +1 -0
- package/dist/shared/lucide-icons/chevrons-down-up.svg +1 -0
- package/dist/shared/lucide-icons/chevrons-down.svg +1 -0
- package/dist/shared/lucide-icons/chevrons-left-right-ellipsis.svg +1 -0
- package/dist/shared/lucide-icons/chevrons-left-right.svg +1 -0
- package/dist/shared/lucide-icons/chevrons-left.svg +1 -0
- package/dist/shared/lucide-icons/chevrons-right-left.svg +1 -0
- package/dist/shared/lucide-icons/chevrons-right.svg +1 -0
- package/dist/shared/lucide-icons/chevrons-up-down.svg +1 -0
- package/dist/shared/lucide-icons/chevrons-up.svg +1 -0
- package/dist/shared/lucide-icons/chrome.svg +1 -0
- package/dist/shared/lucide-icons/church.svg +1 -0
- package/dist/shared/lucide-icons/cigarette-off.svg +1 -0
- package/dist/shared/lucide-icons/cigarette.svg +1 -0
- package/dist/shared/lucide-icons/circle-alert.svg +1 -0
- package/dist/shared/lucide-icons/circle-arrow-down.svg +1 -0
- package/dist/shared/lucide-icons/circle-arrow-left.svg +1 -0
- package/dist/shared/lucide-icons/circle-arrow-out-down-left.svg +1 -0
- package/dist/shared/lucide-icons/circle-arrow-out-down-right.svg +1 -0
- package/dist/shared/lucide-icons/circle-arrow-out-up-left.svg +1 -0
- package/dist/shared/lucide-icons/circle-arrow-out-up-right.svg +1 -0
- package/dist/shared/lucide-icons/circle-arrow-right.svg +1 -0
- package/dist/shared/lucide-icons/circle-arrow-up.svg +1 -0
- package/dist/shared/lucide-icons/circle-check-big.svg +1 -0
- package/dist/shared/lucide-icons/circle-check.svg +1 -0
- package/dist/shared/lucide-icons/circle-chevron-down.svg +1 -0
- package/dist/shared/lucide-icons/circle-chevron-left.svg +1 -0
- package/dist/shared/lucide-icons/circle-chevron-right.svg +1 -0
- package/dist/shared/lucide-icons/circle-chevron-up.svg +1 -0
- package/dist/shared/lucide-icons/circle-dashed.svg +1 -0
- package/dist/shared/lucide-icons/circle-divide.svg +1 -0
- package/dist/shared/lucide-icons/circle-dollar-sign.svg +1 -0
- package/dist/shared/lucide-icons/circle-dot-dashed.svg +1 -0
- package/dist/shared/lucide-icons/circle-dot.svg +1 -0
- package/dist/shared/lucide-icons/circle-ellipsis.svg +1 -0
- package/dist/shared/lucide-icons/circle-equal.svg +1 -0
- package/dist/shared/lucide-icons/circle-fading-arrow-up.svg +1 -0
- package/dist/shared/lucide-icons/circle-fading-plus.svg +1 -0
- package/dist/shared/lucide-icons/circle-gauge.svg +1 -0
- package/dist/shared/lucide-icons/circle-help.svg +1 -0
- package/dist/shared/lucide-icons/circle-minus.svg +1 -0
- package/dist/shared/lucide-icons/circle-off.svg +1 -0
- package/dist/shared/lucide-icons/circle-parking-off.svg +1 -0
- package/dist/shared/lucide-icons/circle-parking.svg +1 -0
- package/dist/shared/lucide-icons/circle-pause.svg +1 -0
- package/dist/shared/lucide-icons/circle-percent.svg +1 -0
- package/dist/shared/lucide-icons/circle-play.svg +1 -0
- package/dist/shared/lucide-icons/circle-plus.svg +1 -0
- package/dist/shared/lucide-icons/circle-power.svg +1 -0
- package/dist/shared/lucide-icons/circle-slash.svg +1 -0
- package/dist/shared/lucide-icons/circle-slash2.svg +1 -0
- package/dist/shared/lucide-icons/circle-stop.svg +1 -0
- package/dist/shared/lucide-icons/circle-user-round.svg +1 -0
- package/dist/shared/lucide-icons/circle-user.svg +1 -0
- package/dist/shared/lucide-icons/circle-x.svg +1 -0
- package/dist/shared/lucide-icons/circle.svg +1 -0
- package/dist/shared/lucide-icons/circuit-board.svg +1 -0
- package/dist/shared/lucide-icons/citrus.svg +1 -0
- package/dist/shared/lucide-icons/clapperboard.svg +1 -0
- package/dist/shared/lucide-icons/clipboard-check.svg +1 -0
- package/dist/shared/lucide-icons/clipboard-copy.svg +1 -0
- package/dist/shared/lucide-icons/clipboard-list.svg +1 -0
- package/dist/shared/lucide-icons/clipboard-minus.svg +1 -0
- package/dist/shared/lucide-icons/clipboard-paste.svg +1 -0
- package/dist/shared/lucide-icons/clipboard-pen-line.svg +1 -0
- package/dist/shared/lucide-icons/clipboard-pen.svg +1 -0
- package/dist/shared/lucide-icons/clipboard-plus.svg +1 -0
- package/dist/shared/lucide-icons/clipboard-type.svg +1 -0
- package/dist/shared/lucide-icons/clipboard-x.svg +1 -0
- package/dist/shared/lucide-icons/clipboard.svg +1 -0
- package/dist/shared/lucide-icons/clock-alert.svg +1 -0
- package/dist/shared/lucide-icons/clock-arrow-down.svg +1 -0
- package/dist/shared/lucide-icons/clock-arrow-up.svg +1 -0
- package/dist/shared/lucide-icons/clock.svg +1 -0
- package/dist/shared/lucide-icons/clock1.svg +1 -0
- package/dist/shared/lucide-icons/clock10.svg +1 -0
- package/dist/shared/lucide-icons/clock11.svg +1 -0
- package/dist/shared/lucide-icons/clock12.svg +1 -0
- package/dist/shared/lucide-icons/clock2.svg +1 -0
- package/dist/shared/lucide-icons/clock3.svg +1 -0
- package/dist/shared/lucide-icons/clock4.svg +1 -0
- package/dist/shared/lucide-icons/clock5.svg +1 -0
- package/dist/shared/lucide-icons/clock6.svg +1 -0
- package/dist/shared/lucide-icons/clock7.svg +1 -0
- package/dist/shared/lucide-icons/clock8.svg +1 -0
- package/dist/shared/lucide-icons/clock9.svg +1 -0
- package/dist/shared/lucide-icons/cloud-alert.svg +1 -0
- package/dist/shared/lucide-icons/cloud-cog.svg +1 -0
- package/dist/shared/lucide-icons/cloud-download.svg +1 -0
- package/dist/shared/lucide-icons/cloud-drizzle.svg +1 -0
- package/dist/shared/lucide-icons/cloud-fog.svg +1 -0
- package/dist/shared/lucide-icons/cloud-hail.svg +1 -0
- package/dist/shared/lucide-icons/cloud-lightning.svg +1 -0
- package/dist/shared/lucide-icons/cloud-moon-rain.svg +1 -0
- package/dist/shared/lucide-icons/cloud-moon.svg +1 -0
- package/dist/shared/lucide-icons/cloud-off.svg +1 -0
- package/dist/shared/lucide-icons/cloud-rain-wind.svg +1 -0
- package/dist/shared/lucide-icons/cloud-rain.svg +1 -0
- package/dist/shared/lucide-icons/cloud-snow.svg +1 -0
- package/dist/shared/lucide-icons/cloud-sun-rain.svg +1 -0
- package/dist/shared/lucide-icons/cloud-sun.svg +1 -0
- package/dist/shared/lucide-icons/cloud-upload.svg +1 -0
- package/dist/shared/lucide-icons/cloud.svg +1 -0
- package/dist/shared/lucide-icons/cloudy.svg +1 -0
- package/dist/shared/lucide-icons/clover.svg +1 -0
- package/dist/shared/lucide-icons/club.svg +1 -0
- package/dist/shared/lucide-icons/code-xml.svg +1 -0
- package/dist/shared/lucide-icons/code.svg +1 -0
- package/dist/shared/lucide-icons/codepen.svg +1 -0
- package/dist/shared/lucide-icons/codesandbox.svg +1 -0
- package/dist/shared/lucide-icons/coffee.svg +1 -0
- package/dist/shared/lucide-icons/cog.svg +1 -0
- package/dist/shared/lucide-icons/coins.svg +1 -0
- package/dist/shared/lucide-icons/columns2.svg +1 -0
- package/dist/shared/lucide-icons/columns3.svg +1 -0
- package/dist/shared/lucide-icons/columns4.svg +1 -0
- package/dist/shared/lucide-icons/combine.svg +1 -0
- package/dist/shared/lucide-icons/command.svg +1 -0
- package/dist/shared/lucide-icons/compass.svg +1 -0
- package/dist/shared/lucide-icons/component.svg +1 -0
- package/dist/shared/lucide-icons/computer.svg +1 -0
- package/dist/shared/lucide-icons/concierge-bell.svg +1 -0
- package/dist/shared/lucide-icons/cone.svg +1 -0
- package/dist/shared/lucide-icons/construction.svg +1 -0
- package/dist/shared/lucide-icons/contact-round.svg +1 -0
- package/dist/shared/lucide-icons/contact.svg +1 -0
- package/dist/shared/lucide-icons/container.svg +1 -0
- package/dist/shared/lucide-icons/contrast.svg +1 -0
- package/dist/shared/lucide-icons/cookie.svg +1 -0
- package/dist/shared/lucide-icons/cooking-pot.svg +1 -0
- package/dist/shared/lucide-icons/copy-check.svg +1 -0
- package/dist/shared/lucide-icons/copy-minus.svg +1 -0
- package/dist/shared/lucide-icons/copy-plus.svg +1 -0
- package/dist/shared/lucide-icons/copy-slash.svg +1 -0
- package/dist/shared/lucide-icons/copy-x.svg +1 -0
- package/dist/shared/lucide-icons/copy.svg +1 -0
- package/dist/shared/lucide-icons/copyleft.svg +1 -0
- package/dist/shared/lucide-icons/copyright.svg +1 -0
- package/dist/shared/lucide-icons/corner-down-left.svg +1 -0
- package/dist/shared/lucide-icons/corner-down-right.svg +1 -0
- package/dist/shared/lucide-icons/corner-left-down.svg +1 -0
- package/dist/shared/lucide-icons/corner-left-up.svg +1 -0
- package/dist/shared/lucide-icons/corner-right-down.svg +1 -0
- package/dist/shared/lucide-icons/corner-right-up.svg +1 -0
- package/dist/shared/lucide-icons/corner-up-left.svg +1 -0
- package/dist/shared/lucide-icons/corner-up-right.svg +1 -0
- package/dist/shared/lucide-icons/cpu.svg +1 -0
- package/dist/shared/lucide-icons/creative-commons.svg +1 -0
- package/dist/shared/lucide-icons/credit-card.svg +1 -0
- package/dist/shared/lucide-icons/croissant.svg +1 -0
- package/dist/shared/lucide-icons/crop.svg +1 -0
- package/dist/shared/lucide-icons/cross.svg +1 -0
- package/dist/shared/lucide-icons/crosshair.svg +1 -0
- package/dist/shared/lucide-icons/crown.svg +1 -0
- package/dist/shared/lucide-icons/cuboid.svg +1 -0
- package/dist/shared/lucide-icons/cup-soda.svg +1 -0
- package/dist/shared/lucide-icons/currency.svg +1 -0
- package/dist/shared/lucide-icons/cylinder.svg +1 -0
- package/dist/shared/lucide-icons/dam.svg +1 -0
- package/dist/shared/lucide-icons/database-backup.svg +1 -0
- package/dist/shared/lucide-icons/database-zap.svg +1 -0
- package/dist/shared/lucide-icons/database.svg +1 -0
- package/dist/shared/lucide-icons/delete.svg +1 -0
- package/dist/shared/lucide-icons/dessert.svg +1 -0
- package/dist/shared/lucide-icons/diameter.svg +1 -0
- package/dist/shared/lucide-icons/diamond-minus.svg +1 -0
- package/dist/shared/lucide-icons/diamond-percent.svg +1 -0
- package/dist/shared/lucide-icons/diamond-plus.svg +1 -0
- package/dist/shared/lucide-icons/diamond.svg +1 -0
- package/dist/shared/lucide-icons/dice1.svg +1 -0
- package/dist/shared/lucide-icons/dice2.svg +1 -0
- package/dist/shared/lucide-icons/dice3.svg +1 -0
- package/dist/shared/lucide-icons/dice4.svg +1 -0
- package/dist/shared/lucide-icons/dice5.svg +1 -0
- package/dist/shared/lucide-icons/dice6.svg +1 -0
- package/dist/shared/lucide-icons/dices.svg +1 -0
- package/dist/shared/lucide-icons/diff.svg +1 -0
- package/dist/shared/lucide-icons/disc-album.svg +1 -0
- package/dist/shared/lucide-icons/disc.svg +1 -0
- package/dist/shared/lucide-icons/disc2.svg +1 -0
- package/dist/shared/lucide-icons/disc3.svg +1 -0
- package/dist/shared/lucide-icons/divide.svg +1 -0
- package/dist/shared/lucide-icons/dna-off.svg +1 -0
- package/dist/shared/lucide-icons/dna.svg +1 -0
- package/dist/shared/lucide-icons/dock.svg +1 -0
- package/dist/shared/lucide-icons/dog.svg +1 -0
- package/dist/shared/lucide-icons/dollar-sign.svg +1 -0
- package/dist/shared/lucide-icons/donut.svg +1 -0
- package/dist/shared/lucide-icons/door-closed.svg +1 -0
- package/dist/shared/lucide-icons/door-open.svg +1 -0
- package/dist/shared/lucide-icons/dot.svg +1 -0
- package/dist/shared/lucide-icons/download.svg +1 -0
- package/dist/shared/lucide-icons/drafting-compass.svg +1 -0
- package/dist/shared/lucide-icons/drama.svg +1 -0
- package/dist/shared/lucide-icons/dribbble.svg +1 -0
- package/dist/shared/lucide-icons/drill.svg +1 -0
- package/dist/shared/lucide-icons/droplet-off.svg +1 -0
- package/dist/shared/lucide-icons/droplet.svg +1 -0
- package/dist/shared/lucide-icons/droplets.svg +1 -0
- package/dist/shared/lucide-icons/drum.svg +1 -0
- package/dist/shared/lucide-icons/drumstick.svg +1 -0
- package/dist/shared/lucide-icons/dumbbell.svg +1 -0
- package/dist/shared/lucide-icons/ear-off.svg +1 -0
- package/dist/shared/lucide-icons/ear.svg +1 -0
- package/dist/shared/lucide-icons/earth-lock.svg +1 -0
- package/dist/shared/lucide-icons/earth.svg +1 -0
- package/dist/shared/lucide-icons/eclipse.svg +1 -0
- package/dist/shared/lucide-icons/egg-fried.svg +1 -0
- package/dist/shared/lucide-icons/egg-off.svg +1 -0
- package/dist/shared/lucide-icons/egg.svg +1 -0
- package/dist/shared/lucide-icons/ellipsis-vertical.svg +1 -0
- package/dist/shared/lucide-icons/ellipsis.svg +1 -0
- package/dist/shared/lucide-icons/equal-approximately.svg +1 -0
- package/dist/shared/lucide-icons/equal-not.svg +1 -0
- package/dist/shared/lucide-icons/equal.svg +1 -0
- package/dist/shared/lucide-icons/eraser.svg +1 -0
- package/dist/shared/lucide-icons/ethernet-port.svg +1 -0
- package/dist/shared/lucide-icons/euro.svg +1 -0
- package/dist/shared/lucide-icons/expand.svg +1 -0
- package/dist/shared/lucide-icons/external-link.svg +1 -0
- package/dist/shared/lucide-icons/eye-closed.svg +1 -0
- package/dist/shared/lucide-icons/eye-off.svg +1 -0
- package/dist/shared/lucide-icons/eye.svg +1 -0
- package/dist/shared/lucide-icons/facebook.svg +1 -0
- package/dist/shared/lucide-icons/factory.svg +1 -0
- package/dist/shared/lucide-icons/fan.svg +1 -0
- package/dist/shared/lucide-icons/fast-forward.svg +1 -0
- package/dist/shared/lucide-icons/feather.svg +1 -0
- package/dist/shared/lucide-icons/fence.svg +1 -0
- package/dist/shared/lucide-icons/ferris-wheel.svg +1 -0
- package/dist/shared/lucide-icons/figma.svg +1 -0
- package/dist/shared/lucide-icons/file-archive.svg +1 -0
- package/dist/shared/lucide-icons/file-audio.svg +1 -0
- package/dist/shared/lucide-icons/file-audio2.svg +1 -0
- package/dist/shared/lucide-icons/file-axis3d.svg +1 -0
- package/dist/shared/lucide-icons/file-badge.svg +1 -0
- package/dist/shared/lucide-icons/file-badge2.svg +1 -0
- package/dist/shared/lucide-icons/file-box.svg +1 -0
- package/dist/shared/lucide-icons/file-chart-column-increasing.svg +1 -0
- package/dist/shared/lucide-icons/file-chart-column.svg +1 -0
- package/dist/shared/lucide-icons/file-chart-line.svg +1 -0
- package/dist/shared/lucide-icons/file-chart-pie.svg +1 -0
- package/dist/shared/lucide-icons/file-check.svg +1 -0
- package/dist/shared/lucide-icons/file-check2.svg +1 -0
- package/dist/shared/lucide-icons/file-clock.svg +1 -0
- package/dist/shared/lucide-icons/file-code.svg +1 -0
- package/dist/shared/lucide-icons/file-code2.svg +1 -0
- package/dist/shared/lucide-icons/file-cog.svg +1 -0
- package/dist/shared/lucide-icons/file-diff.svg +1 -0
- package/dist/shared/lucide-icons/file-digit.svg +1 -0
- package/dist/shared/lucide-icons/file-down.svg +1 -0
- package/dist/shared/lucide-icons/file-heart.svg +1 -0
- package/dist/shared/lucide-icons/file-image.svg +1 -0
- package/dist/shared/lucide-icons/file-input.svg +1 -0
- package/dist/shared/lucide-icons/file-json.svg +1 -0
- package/dist/shared/lucide-icons/file-json2.svg +1 -0
- package/dist/shared/lucide-icons/file-key.svg +1 -0
- package/dist/shared/lucide-icons/file-key2.svg +1 -0
- package/dist/shared/lucide-icons/file-lock.svg +1 -0
- package/dist/shared/lucide-icons/file-lock2.svg +1 -0
- package/dist/shared/lucide-icons/file-minus.svg +1 -0
- package/dist/shared/lucide-icons/file-minus2.svg +1 -0
- package/dist/shared/lucide-icons/file-music.svg +1 -0
- package/dist/shared/lucide-icons/file-output.svg +1 -0
- package/dist/shared/lucide-icons/file-pen-line.svg +1 -0
- package/dist/shared/lucide-icons/file-pen.svg +1 -0
- package/dist/shared/lucide-icons/file-plus.svg +1 -0
- package/dist/shared/lucide-icons/file-plus2.svg +1 -0
- package/dist/shared/lucide-icons/file-question.svg +1 -0
- package/dist/shared/lucide-icons/file-scan.svg +1 -0
- package/dist/shared/lucide-icons/file-search.svg +1 -0
- package/dist/shared/lucide-icons/file-search2.svg +1 -0
- package/dist/shared/lucide-icons/file-sliders.svg +1 -0
- package/dist/shared/lucide-icons/file-spreadsheet.svg +1 -0
- package/dist/shared/lucide-icons/file-stack.svg +1 -0
- package/dist/shared/lucide-icons/file-symlink.svg +1 -0
- package/dist/shared/lucide-icons/file-terminal.svg +1 -0
- package/dist/shared/lucide-icons/file-text.svg +1 -0
- package/dist/shared/lucide-icons/file-type.svg +1 -0
- package/dist/shared/lucide-icons/file-type2.svg +1 -0
- package/dist/shared/lucide-icons/file-up.svg +1 -0
- package/dist/shared/lucide-icons/file-user.svg +1 -0
- package/dist/shared/lucide-icons/file-video.svg +1 -0
- package/dist/shared/lucide-icons/file-video2.svg +1 -0
- package/dist/shared/lucide-icons/file-volume.svg +1 -0
- package/dist/shared/lucide-icons/file-volume2.svg +1 -0
- package/dist/shared/lucide-icons/file-warning.svg +1 -0
- package/dist/shared/lucide-icons/file-x.svg +1 -0
- package/dist/shared/lucide-icons/file-x2.svg +1 -0
- package/dist/shared/lucide-icons/file.svg +1 -0
- package/dist/shared/lucide-icons/files.svg +1 -0
- package/dist/shared/lucide-icons/film.svg +1 -0
- package/dist/shared/lucide-icons/filter-x.svg +1 -0
- package/dist/shared/lucide-icons/filter.svg +1 -0
- package/dist/shared/lucide-icons/fingerprint.svg +1 -0
- package/dist/shared/lucide-icons/fire-extinguisher.svg +1 -0
- package/dist/shared/lucide-icons/fish-off.svg +1 -0
- package/dist/shared/lucide-icons/fish-symbol.svg +1 -0
- package/dist/shared/lucide-icons/fish.svg +1 -0
- package/dist/shared/lucide-icons/flag-off.svg +1 -0
- package/dist/shared/lucide-icons/flag-triangle-left.svg +1 -0
- package/dist/shared/lucide-icons/flag-triangle-right.svg +1 -0
- package/dist/shared/lucide-icons/flag.svg +1 -0
- package/dist/shared/lucide-icons/flame-kindling.svg +1 -0
- package/dist/shared/lucide-icons/flame.svg +1 -0
- package/dist/shared/lucide-icons/flashlight-off.svg +1 -0
- package/dist/shared/lucide-icons/flashlight.svg +1 -0
- package/dist/shared/lucide-icons/flask-conical-off.svg +1 -0
- package/dist/shared/lucide-icons/flask-conical.svg +1 -0
- package/dist/shared/lucide-icons/flask-round.svg +1 -0
- package/dist/shared/lucide-icons/flip-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/flip-horizontal2.svg +1 -0
- package/dist/shared/lucide-icons/flip-vertical.svg +1 -0
- package/dist/shared/lucide-icons/flip-vertical2.svg +1 -0
- package/dist/shared/lucide-icons/flower.svg +1 -0
- package/dist/shared/lucide-icons/flower2.svg +1 -0
- package/dist/shared/lucide-icons/focus.svg +1 -0
- package/dist/shared/lucide-icons/fold-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/fold-vertical.svg +1 -0
- package/dist/shared/lucide-icons/folder-archive.svg +1 -0
- package/dist/shared/lucide-icons/folder-check.svg +1 -0
- package/dist/shared/lucide-icons/folder-clock.svg +1 -0
- package/dist/shared/lucide-icons/folder-closed.svg +1 -0
- package/dist/shared/lucide-icons/folder-code.svg +1 -0
- package/dist/shared/lucide-icons/folder-cog.svg +1 -0
- package/dist/shared/lucide-icons/folder-dot.svg +1 -0
- package/dist/shared/lucide-icons/folder-down.svg +1 -0
- package/dist/shared/lucide-icons/folder-git.svg +1 -0
- package/dist/shared/lucide-icons/folder-git2.svg +1 -0
- package/dist/shared/lucide-icons/folder-heart.svg +1 -0
- package/dist/shared/lucide-icons/folder-input.svg +1 -0
- package/dist/shared/lucide-icons/folder-kanban.svg +1 -0
- package/dist/shared/lucide-icons/folder-key.svg +1 -0
- package/dist/shared/lucide-icons/folder-lock.svg +1 -0
- package/dist/shared/lucide-icons/folder-minus.svg +1 -0
- package/dist/shared/lucide-icons/folder-open-dot.svg +1 -0
- package/dist/shared/lucide-icons/folder-open.svg +1 -0
- package/dist/shared/lucide-icons/folder-output.svg +1 -0
- package/dist/shared/lucide-icons/folder-pen.svg +1 -0
- package/dist/shared/lucide-icons/folder-plus.svg +1 -0
- package/dist/shared/lucide-icons/folder-root.svg +1 -0
- package/dist/shared/lucide-icons/folder-search.svg +1 -0
- package/dist/shared/lucide-icons/folder-search2.svg +1 -0
- package/dist/shared/lucide-icons/folder-symlink.svg +1 -0
- package/dist/shared/lucide-icons/folder-sync.svg +1 -0
- package/dist/shared/lucide-icons/folder-tree.svg +1 -0
- package/dist/shared/lucide-icons/folder-up.svg +1 -0
- package/dist/shared/lucide-icons/folder-x.svg +1 -0
- package/dist/shared/lucide-icons/folder.svg +1 -0
- package/dist/shared/lucide-icons/folders.svg +1 -0
- package/dist/shared/lucide-icons/footprints.svg +1 -0
- package/dist/shared/lucide-icons/forklift.svg +1 -0
- package/dist/shared/lucide-icons/forward.svg +1 -0
- package/dist/shared/lucide-icons/frame.svg +1 -0
- package/dist/shared/lucide-icons/framer.svg +1 -0
- package/dist/shared/lucide-icons/frown.svg +1 -0
- package/dist/shared/lucide-icons/fuel.svg +1 -0
- package/dist/shared/lucide-icons/fullscreen.svg +1 -0
- package/dist/shared/lucide-icons/gallery-horizontal-end.svg +1 -0
- package/dist/shared/lucide-icons/gallery-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/gallery-thumbnails.svg +1 -0
- package/dist/shared/lucide-icons/gallery-vertical-end.svg +1 -0
- package/dist/shared/lucide-icons/gallery-vertical.svg +1 -0
- package/dist/shared/lucide-icons/gamepad.svg +1 -0
- package/dist/shared/lucide-icons/gamepad2.svg +1 -0
- package/dist/shared/lucide-icons/gauge.svg +1 -0
- package/dist/shared/lucide-icons/gavel.svg +1 -0
- package/dist/shared/lucide-icons/gem.svg +1 -0
- package/dist/shared/lucide-icons/ghost.svg +1 -0
- package/dist/shared/lucide-icons/gift.svg +1 -0
- package/dist/shared/lucide-icons/git-branch-plus.svg +1 -0
- package/dist/shared/lucide-icons/git-branch.svg +1 -0
- package/dist/shared/lucide-icons/git-commit-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/git-commit-vertical.svg +1 -0
- package/dist/shared/lucide-icons/git-compare-arrows.svg +1 -0
- package/dist/shared/lucide-icons/git-compare.svg +1 -0
- package/dist/shared/lucide-icons/git-fork.svg +1 -0
- package/dist/shared/lucide-icons/git-graph.svg +1 -0
- package/dist/shared/lucide-icons/git-merge.svg +1 -0
- package/dist/shared/lucide-icons/git-pull-request-arrow.svg +1 -0
- package/dist/shared/lucide-icons/git-pull-request-closed.svg +1 -0
- package/dist/shared/lucide-icons/git-pull-request-create-arrow.svg +1 -0
- package/dist/shared/lucide-icons/git-pull-request-create.svg +1 -0
- package/dist/shared/lucide-icons/git-pull-request-draft.svg +1 -0
- package/dist/shared/lucide-icons/git-pull-request.svg +1 -0
- package/dist/shared/lucide-icons/github.svg +1 -0
- package/dist/shared/lucide-icons/gitlab.svg +1 -0
- package/dist/shared/lucide-icons/glass-water.svg +1 -0
- package/dist/shared/lucide-icons/glasses.svg +1 -0
- package/dist/shared/lucide-icons/globe-lock.svg +1 -0
- package/dist/shared/lucide-icons/globe.svg +1 -0
- package/dist/shared/lucide-icons/goal.svg +1 -0
- package/dist/shared/lucide-icons/grab.svg +1 -0
- package/dist/shared/lucide-icons/graduation-cap.svg +1 -0
- package/dist/shared/lucide-icons/grape.svg +1 -0
- package/dist/shared/lucide-icons/grid2x2-check.svg +1 -0
- package/dist/shared/lucide-icons/grid2x2-plus.svg +1 -0
- package/dist/shared/lucide-icons/grid2x2-x.svg +1 -0
- package/dist/shared/lucide-icons/grid2x2.svg +1 -0
- package/dist/shared/lucide-icons/grid3x3.svg +1 -0
- package/dist/shared/lucide-icons/grip-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/grip-vertical.svg +1 -0
- package/dist/shared/lucide-icons/grip.svg +1 -0
- package/dist/shared/lucide-icons/group.svg +1 -0
- package/dist/shared/lucide-icons/guitar.svg +1 -0
- package/dist/shared/lucide-icons/ham.svg +1 -0
- package/dist/shared/lucide-icons/hammer.svg +1 -0
- package/dist/shared/lucide-icons/hand-coins.svg +1 -0
- package/dist/shared/lucide-icons/hand-heart.svg +1 -0
- package/dist/shared/lucide-icons/hand-helping.svg +1 -0
- package/dist/shared/lucide-icons/hand-metal.svg +1 -0
- package/dist/shared/lucide-icons/hand-platter.svg +1 -0
- package/dist/shared/lucide-icons/hand.svg +1 -0
- package/dist/shared/lucide-icons/handshake.svg +1 -0
- package/dist/shared/lucide-icons/hard-drive-download.svg +1 -0
- package/dist/shared/lucide-icons/hard-drive-upload.svg +1 -0
- package/dist/shared/lucide-icons/hard-drive.svg +1 -0
- package/dist/shared/lucide-icons/hard-hat.svg +1 -0
- package/dist/shared/lucide-icons/hash.svg +1 -0
- package/dist/shared/lucide-icons/haze.svg +1 -0
- package/dist/shared/lucide-icons/hdmi-port.svg +1 -0
- package/dist/shared/lucide-icons/heading.svg +1 -0
- package/dist/shared/lucide-icons/heading1.svg +1 -0
- package/dist/shared/lucide-icons/heading2.svg +1 -0
- package/dist/shared/lucide-icons/heading3.svg +1 -0
- package/dist/shared/lucide-icons/heading4.svg +1 -0
- package/dist/shared/lucide-icons/heading5.svg +1 -0
- package/dist/shared/lucide-icons/heading6.svg +1 -0
- package/dist/shared/lucide-icons/headphone-off.svg +1 -0
- package/dist/shared/lucide-icons/headphones.svg +1 -0
- package/dist/shared/lucide-icons/headset.svg +1 -0
- package/dist/shared/lucide-icons/heart-crack.svg +1 -0
- package/dist/shared/lucide-icons/heart-handshake.svg +1 -0
- package/dist/shared/lucide-icons/heart-off.svg +1 -0
- package/dist/shared/lucide-icons/heart-pulse.svg +1 -0
- package/dist/shared/lucide-icons/heart.svg +1 -0
- package/dist/shared/lucide-icons/heater.svg +1 -0
- package/dist/shared/lucide-icons/hexagon.svg +1 -0
- package/dist/shared/lucide-icons/highlighter.svg +1 -0
- package/dist/shared/lucide-icons/history.svg +1 -0
- package/dist/shared/lucide-icons/hop-off.svg +1 -0
- package/dist/shared/lucide-icons/hop.svg +1 -0
- package/dist/shared/lucide-icons/hospital.svg +1 -0
- package/dist/shared/lucide-icons/hotel.svg +1 -0
- package/dist/shared/lucide-icons/hourglass.svg +1 -0
- package/dist/shared/lucide-icons/house-plug.svg +1 -0
- package/dist/shared/lucide-icons/house-plus.svg +1 -0
- package/dist/shared/lucide-icons/house.svg +1 -0
- package/dist/shared/lucide-icons/ice-cream-bowl.svg +1 -0
- package/dist/shared/lucide-icons/ice-cream-cone.svg +1 -0
- package/dist/shared/lucide-icons/id-card.svg +1 -0
- package/dist/shared/lucide-icons/image-down.svg +1 -0
- package/dist/shared/lucide-icons/image-minus.svg +1 -0
- package/dist/shared/lucide-icons/image-off.svg +1 -0
- package/dist/shared/lucide-icons/image-play.svg +1 -0
- package/dist/shared/lucide-icons/image-plus.svg +1 -0
- package/dist/shared/lucide-icons/image-up.svg +1 -0
- package/dist/shared/lucide-icons/image-upscale.svg +1 -0
- package/dist/shared/lucide-icons/image.svg +1 -0
- package/dist/shared/lucide-icons/images.svg +1 -0
- package/dist/shared/lucide-icons/import.svg +1 -0
- package/dist/shared/lucide-icons/inbox.svg +1 -0
- package/dist/shared/lucide-icons/indent-decrease.svg +1 -0
- package/dist/shared/lucide-icons/indent-increase.svg +1 -0
- package/dist/shared/lucide-icons/indian-rupee.svg +1 -0
- package/dist/shared/lucide-icons/infinity.svg +1 -0
- package/dist/shared/lucide-icons/info.svg +1 -0
- package/dist/shared/lucide-icons/inspection-panel.svg +1 -0
- package/dist/shared/lucide-icons/instagram.svg +1 -0
- package/dist/shared/lucide-icons/italic.svg +1 -0
- package/dist/shared/lucide-icons/iteration-ccw.svg +1 -0
- package/dist/shared/lucide-icons/iteration-cw.svg +1 -0
- package/dist/shared/lucide-icons/japanese-yen.svg +1 -0
- package/dist/shared/lucide-icons/joystick.svg +1 -0
- package/dist/shared/lucide-icons/kanban.svg +1 -0
- package/dist/shared/lucide-icons/key-round.svg +1 -0
- package/dist/shared/lucide-icons/key-square.svg +1 -0
- package/dist/shared/lucide-icons/key.svg +1 -0
- package/dist/shared/lucide-icons/keyboard-music.svg +1 -0
- package/dist/shared/lucide-icons/keyboard-off.svg +1 -0
- package/dist/shared/lucide-icons/keyboard.svg +1 -0
- package/dist/shared/lucide-icons/lamp-ceiling.svg +1 -0
- package/dist/shared/lucide-icons/lamp-desk.svg +1 -0
- package/dist/shared/lucide-icons/lamp-floor.svg +1 -0
- package/dist/shared/lucide-icons/lamp-wall-down.svg +1 -0
- package/dist/shared/lucide-icons/lamp-wall-up.svg +1 -0
- package/dist/shared/lucide-icons/lamp.svg +1 -0
- package/dist/shared/lucide-icons/land-plot.svg +1 -0
- package/dist/shared/lucide-icons/landmark.svg +1 -0
- package/dist/shared/lucide-icons/languages.svg +1 -0
- package/dist/shared/lucide-icons/laptop-minimal-check.svg +1 -0
- package/dist/shared/lucide-icons/laptop-minimal.svg +1 -0
- package/dist/shared/lucide-icons/laptop.svg +1 -0
- package/dist/shared/lucide-icons/lasso-select.svg +1 -0
- package/dist/shared/lucide-icons/lasso.svg +1 -0
- package/dist/shared/lucide-icons/laugh.svg +1 -0
- package/dist/shared/lucide-icons/layers.svg +1 -0
- package/dist/shared/lucide-icons/layers2.svg +1 -0
- package/dist/shared/lucide-icons/layout-dashboard.svg +1 -0
- package/dist/shared/lucide-icons/layout-grid.svg +1 -0
- package/dist/shared/lucide-icons/layout-list.svg +1 -0
- package/dist/shared/lucide-icons/layout-panel-left.svg +1 -0
- package/dist/shared/lucide-icons/layout-panel-top.svg +1 -0
- package/dist/shared/lucide-icons/layout-template.svg +1 -0
- package/dist/shared/lucide-icons/leaf.svg +1 -0
- package/dist/shared/lucide-icons/leafy-green.svg +1 -0
- package/dist/shared/lucide-icons/lectern.svg +1 -0
- package/dist/shared/lucide-icons/letter-text.svg +1 -0
- package/dist/shared/lucide-icons/library-big.svg +1 -0
- package/dist/shared/lucide-icons/library.svg +1 -0
- package/dist/shared/lucide-icons/life-buoy.svg +1 -0
- package/dist/shared/lucide-icons/ligature.svg +1 -0
- package/dist/shared/lucide-icons/lightbulb-off.svg +1 -0
- package/dist/shared/lucide-icons/lightbulb.svg +1 -0
- package/dist/shared/lucide-icons/link.svg +1 -0
- package/dist/shared/lucide-icons/link2-off.svg +1 -0
- package/dist/shared/lucide-icons/link2.svg +1 -0
- package/dist/shared/lucide-icons/linkedin.svg +1 -0
- package/dist/shared/lucide-icons/list-check.svg +1 -0
- package/dist/shared/lucide-icons/list-checks.svg +1 -0
- package/dist/shared/lucide-icons/list-collapse.svg +1 -0
- package/dist/shared/lucide-icons/list-end.svg +1 -0
- package/dist/shared/lucide-icons/list-filter-plus.svg +1 -0
- package/dist/shared/lucide-icons/list-filter.svg +1 -0
- package/dist/shared/lucide-icons/list-minus.svg +1 -0
- package/dist/shared/lucide-icons/list-music.svg +1 -0
- package/dist/shared/lucide-icons/list-ordered.svg +1 -0
- package/dist/shared/lucide-icons/list-plus.svg +1 -0
- package/dist/shared/lucide-icons/list-restart.svg +1 -0
- package/dist/shared/lucide-icons/list-start.svg +1 -0
- package/dist/shared/lucide-icons/list-todo.svg +1 -0
- package/dist/shared/lucide-icons/list-tree.svg +1 -0
- package/dist/shared/lucide-icons/list-video.svg +1 -0
- package/dist/shared/lucide-icons/list-x.svg +1 -0
- package/dist/shared/lucide-icons/list.svg +1 -0
- package/dist/shared/lucide-icons/loader-circle.svg +1 -0
- package/dist/shared/lucide-icons/loader-pinwheel.svg +1 -0
- package/dist/shared/lucide-icons/loader.svg +1 -0
- package/dist/shared/lucide-icons/locate-fixed.svg +1 -0
- package/dist/shared/lucide-icons/locate-off.svg +1 -0
- package/dist/shared/lucide-icons/locate.svg +1 -0
- package/dist/shared/lucide-icons/lock-keyhole-open.svg +1 -0
- package/dist/shared/lucide-icons/lock-keyhole.svg +1 -0
- package/dist/shared/lucide-icons/lock-open.svg +1 -0
- package/dist/shared/lucide-icons/lock.svg +1 -0
- package/dist/shared/lucide-icons/log-in.svg +1 -0
- package/dist/shared/lucide-icons/log-out.svg +1 -0
- package/dist/shared/lucide-icons/logs.svg +1 -0
- package/dist/shared/lucide-icons/lollipop.svg +1 -0
- package/dist/shared/lucide-icons/luggage.svg +1 -0
- package/dist/shared/lucide-icons/magnet.svg +1 -0
- package/dist/shared/lucide-icons/mail-check.svg +1 -0
- package/dist/shared/lucide-icons/mail-minus.svg +1 -0
- package/dist/shared/lucide-icons/mail-open.svg +1 -0
- package/dist/shared/lucide-icons/mail-plus.svg +1 -0
- package/dist/shared/lucide-icons/mail-question.svg +1 -0
- package/dist/shared/lucide-icons/mail-search.svg +1 -0
- package/dist/shared/lucide-icons/mail-warning.svg +1 -0
- package/dist/shared/lucide-icons/mail-x.svg +1 -0
- package/dist/shared/lucide-icons/mail.svg +1 -0
- package/dist/shared/lucide-icons/mailbox.svg +1 -0
- package/dist/shared/lucide-icons/mails.svg +1 -0
- package/dist/shared/lucide-icons/manifest.json +1 -0
- package/dist/shared/lucide-icons/map-pin-check-inside.svg +1 -0
- package/dist/shared/lucide-icons/map-pin-check.svg +1 -0
- package/dist/shared/lucide-icons/map-pin-house.svg +1 -0
- package/dist/shared/lucide-icons/map-pin-minus-inside.svg +1 -0
- package/dist/shared/lucide-icons/map-pin-minus.svg +1 -0
- package/dist/shared/lucide-icons/map-pin-off.svg +1 -0
- package/dist/shared/lucide-icons/map-pin-plus-inside.svg +1 -0
- package/dist/shared/lucide-icons/map-pin-plus.svg +1 -0
- package/dist/shared/lucide-icons/map-pin-x-inside.svg +1 -0
- package/dist/shared/lucide-icons/map-pin-x.svg +1 -0
- package/dist/shared/lucide-icons/map-pin.svg +1 -0
- package/dist/shared/lucide-icons/map-pinned.svg +1 -0
- package/dist/shared/lucide-icons/map.svg +1 -0
- package/dist/shared/lucide-icons/martini.svg +1 -0
- package/dist/shared/lucide-icons/maximize.svg +1 -0
- package/dist/shared/lucide-icons/maximize2.svg +1 -0
- package/dist/shared/lucide-icons/medal.svg +1 -0
- package/dist/shared/lucide-icons/megaphone-off.svg +1 -0
- package/dist/shared/lucide-icons/megaphone.svg +1 -0
- package/dist/shared/lucide-icons/meh.svg +1 -0
- package/dist/shared/lucide-icons/memory-stick.svg +1 -0
- package/dist/shared/lucide-icons/menu.svg +1 -0
- package/dist/shared/lucide-icons/merge.svg +1 -0
- package/dist/shared/lucide-icons/message-circle-code.svg +1 -0
- package/dist/shared/lucide-icons/message-circle-dashed.svg +1 -0
- package/dist/shared/lucide-icons/message-circle-heart.svg +1 -0
- package/dist/shared/lucide-icons/message-circle-more.svg +1 -0
- package/dist/shared/lucide-icons/message-circle-off.svg +1 -0
- package/dist/shared/lucide-icons/message-circle-plus.svg +1 -0
- package/dist/shared/lucide-icons/message-circle-question.svg +1 -0
- package/dist/shared/lucide-icons/message-circle-reply.svg +1 -0
- package/dist/shared/lucide-icons/message-circle-warning.svg +1 -0
- package/dist/shared/lucide-icons/message-circle-x.svg +1 -0
- package/dist/shared/lucide-icons/message-circle.svg +1 -0
- package/dist/shared/lucide-icons/message-square-code.svg +1 -0
- package/dist/shared/lucide-icons/message-square-dashed.svg +1 -0
- package/dist/shared/lucide-icons/message-square-diff.svg +1 -0
- package/dist/shared/lucide-icons/message-square-dot.svg +1 -0
- package/dist/shared/lucide-icons/message-square-heart.svg +1 -0
- package/dist/shared/lucide-icons/message-square-lock.svg +1 -0
- package/dist/shared/lucide-icons/message-square-more.svg +1 -0
- package/dist/shared/lucide-icons/message-square-off.svg +1 -0
- package/dist/shared/lucide-icons/message-square-plus.svg +1 -0
- package/dist/shared/lucide-icons/message-square-quote.svg +1 -0
- package/dist/shared/lucide-icons/message-square-reply.svg +1 -0
- package/dist/shared/lucide-icons/message-square-share.svg +1 -0
- package/dist/shared/lucide-icons/message-square-text.svg +1 -0
- package/dist/shared/lucide-icons/message-square-warning.svg +1 -0
- package/dist/shared/lucide-icons/message-square-x.svg +1 -0
- package/dist/shared/lucide-icons/message-square.svg +1 -0
- package/dist/shared/lucide-icons/messages-square.svg +1 -0
- package/dist/shared/lucide-icons/mic-off.svg +1 -0
- package/dist/shared/lucide-icons/mic-vocal.svg +1 -0
- package/dist/shared/lucide-icons/mic.svg +1 -0
- package/dist/shared/lucide-icons/microchip.svg +1 -0
- package/dist/shared/lucide-icons/microscope.svg +1 -0
- package/dist/shared/lucide-icons/microwave.svg +1 -0
- package/dist/shared/lucide-icons/milestone.svg +1 -0
- package/dist/shared/lucide-icons/milk-off.svg +1 -0
- package/dist/shared/lucide-icons/milk.svg +1 -0
- package/dist/shared/lucide-icons/minimize.svg +1 -0
- package/dist/shared/lucide-icons/minimize2.svg +1 -0
- package/dist/shared/lucide-icons/minus.svg +1 -0
- package/dist/shared/lucide-icons/monitor-check.svg +1 -0
- package/dist/shared/lucide-icons/monitor-cog.svg +1 -0
- package/dist/shared/lucide-icons/monitor-dot.svg +1 -0
- package/dist/shared/lucide-icons/monitor-down.svg +1 -0
- package/dist/shared/lucide-icons/monitor-off.svg +1 -0
- package/dist/shared/lucide-icons/monitor-pause.svg +1 -0
- package/dist/shared/lucide-icons/monitor-play.svg +1 -0
- package/dist/shared/lucide-icons/monitor-smartphone.svg +1 -0
- package/dist/shared/lucide-icons/monitor-speaker.svg +1 -0
- package/dist/shared/lucide-icons/monitor-stop.svg +1 -0
- package/dist/shared/lucide-icons/monitor-up.svg +1 -0
- package/dist/shared/lucide-icons/monitor-x.svg +1 -0
- package/dist/shared/lucide-icons/monitor.svg +1 -0
- package/dist/shared/lucide-icons/moon-star.svg +1 -0
- package/dist/shared/lucide-icons/moon.svg +1 -0
- package/dist/shared/lucide-icons/mountain-snow.svg +1 -0
- package/dist/shared/lucide-icons/mountain.svg +1 -0
- package/dist/shared/lucide-icons/mouse-off.svg +1 -0
- package/dist/shared/lucide-icons/mouse-pointer-ban.svg +1 -0
- package/dist/shared/lucide-icons/mouse-pointer-click.svg +1 -0
- package/dist/shared/lucide-icons/mouse-pointer.svg +1 -0
- package/dist/shared/lucide-icons/mouse-pointer2.svg +1 -0
- package/dist/shared/lucide-icons/mouse.svg +1 -0
- package/dist/shared/lucide-icons/move-diagonal.svg +1 -0
- package/dist/shared/lucide-icons/move-diagonal2.svg +1 -0
- package/dist/shared/lucide-icons/move-down-left.svg +1 -0
- package/dist/shared/lucide-icons/move-down-right.svg +1 -0
- package/dist/shared/lucide-icons/move-down.svg +1 -0
- package/dist/shared/lucide-icons/move-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/move-left.svg +1 -0
- package/dist/shared/lucide-icons/move-right.svg +1 -0
- package/dist/shared/lucide-icons/move-up-left.svg +1 -0
- package/dist/shared/lucide-icons/move-up-right.svg +1 -0
- package/dist/shared/lucide-icons/move-up.svg +1 -0
- package/dist/shared/lucide-icons/move-vertical.svg +1 -0
- package/dist/shared/lucide-icons/move.svg +1 -0
- package/dist/shared/lucide-icons/move3d.svg +1 -0
- package/dist/shared/lucide-icons/music.svg +1 -0
- package/dist/shared/lucide-icons/music2.svg +1 -0
- package/dist/shared/lucide-icons/music3.svg +1 -0
- package/dist/shared/lucide-icons/music4.svg +1 -0
- package/dist/shared/lucide-icons/navigation-off.svg +1 -0
- package/dist/shared/lucide-icons/navigation.svg +1 -0
- package/dist/shared/lucide-icons/navigation2-off.svg +1 -0
- package/dist/shared/lucide-icons/navigation2.svg +1 -0
- package/dist/shared/lucide-icons/network.svg +1 -0
- package/dist/shared/lucide-icons/newspaper.svg +1 -0
- package/dist/shared/lucide-icons/nfc.svg +1 -0
- package/dist/shared/lucide-icons/notebook-pen.svg +1 -0
- package/dist/shared/lucide-icons/notebook-tabs.svg +1 -0
- package/dist/shared/lucide-icons/notebook-text.svg +1 -0
- package/dist/shared/lucide-icons/notebook.svg +1 -0
- package/dist/shared/lucide-icons/notepad-text-dashed.svg +1 -0
- package/dist/shared/lucide-icons/notepad-text.svg +1 -0
- package/dist/shared/lucide-icons/nut-off.svg +1 -0
- package/dist/shared/lucide-icons/nut.svg +1 -0
- package/dist/shared/lucide-icons/octagon-alert.svg +1 -0
- package/dist/shared/lucide-icons/octagon-minus.svg +1 -0
- package/dist/shared/lucide-icons/octagon-pause.svg +1 -0
- package/dist/shared/lucide-icons/octagon-x.svg +1 -0
- package/dist/shared/lucide-icons/octagon.svg +1 -0
- package/dist/shared/lucide-icons/omega.svg +1 -0
- package/dist/shared/lucide-icons/option.svg +1 -0
- package/dist/shared/lucide-icons/orbit.svg +1 -0
- package/dist/shared/lucide-icons/origami.svg +1 -0
- package/dist/shared/lucide-icons/package-check.svg +1 -0
- package/dist/shared/lucide-icons/package-minus.svg +1 -0
- package/dist/shared/lucide-icons/package-open.svg +1 -0
- package/dist/shared/lucide-icons/package-plus.svg +1 -0
- package/dist/shared/lucide-icons/package-search.svg +1 -0
- package/dist/shared/lucide-icons/package-x.svg +1 -0
- package/dist/shared/lucide-icons/package.svg +1 -0
- package/dist/shared/lucide-icons/package2.svg +1 -0
- package/dist/shared/lucide-icons/paint-bucket.svg +1 -0
- package/dist/shared/lucide-icons/paint-roller.svg +1 -0
- package/dist/shared/lucide-icons/paintbrush-vertical.svg +1 -0
- package/dist/shared/lucide-icons/paintbrush.svg +1 -0
- package/dist/shared/lucide-icons/palette.svg +1 -0
- package/dist/shared/lucide-icons/panel-bottom-close.svg +1 -0
- package/dist/shared/lucide-icons/panel-bottom-dashed.svg +1 -0
- package/dist/shared/lucide-icons/panel-bottom-open.svg +1 -0
- package/dist/shared/lucide-icons/panel-bottom.svg +1 -0
- package/dist/shared/lucide-icons/panel-left-close.svg +1 -0
- package/dist/shared/lucide-icons/panel-left-dashed.svg +1 -0
- package/dist/shared/lucide-icons/panel-left-open.svg +1 -0
- package/dist/shared/lucide-icons/panel-left.svg +1 -0
- package/dist/shared/lucide-icons/panel-right-close.svg +1 -0
- package/dist/shared/lucide-icons/panel-right-dashed.svg +1 -0
- package/dist/shared/lucide-icons/panel-right-open.svg +1 -0
- package/dist/shared/lucide-icons/panel-right.svg +1 -0
- package/dist/shared/lucide-icons/panel-top-close.svg +1 -0
- package/dist/shared/lucide-icons/panel-top-dashed.svg +1 -0
- package/dist/shared/lucide-icons/panel-top-open.svg +1 -0
- package/dist/shared/lucide-icons/panel-top.svg +1 -0
- package/dist/shared/lucide-icons/panels-left-bottom.svg +1 -0
- package/dist/shared/lucide-icons/panels-right-bottom.svg +1 -0
- package/dist/shared/lucide-icons/panels-top-left.svg +1 -0
- package/dist/shared/lucide-icons/paperclip.svg +1 -0
- package/dist/shared/lucide-icons/parentheses.svg +1 -0
- package/dist/shared/lucide-icons/parking-meter.svg +1 -0
- package/dist/shared/lucide-icons/party-popper.svg +1 -0
- package/dist/shared/lucide-icons/pause.svg +1 -0
- package/dist/shared/lucide-icons/paw-print.svg +1 -0
- package/dist/shared/lucide-icons/pc-case.svg +1 -0
- package/dist/shared/lucide-icons/pen-line.svg +1 -0
- package/dist/shared/lucide-icons/pen-off.svg +1 -0
- package/dist/shared/lucide-icons/pen-tool.svg +1 -0
- package/dist/shared/lucide-icons/pen.svg +1 -0
- package/dist/shared/lucide-icons/pencil-line.svg +1 -0
- package/dist/shared/lucide-icons/pencil-off.svg +1 -0
- package/dist/shared/lucide-icons/pencil-ruler.svg +1 -0
- package/dist/shared/lucide-icons/pencil.svg +1 -0
- package/dist/shared/lucide-icons/pentagon.svg +1 -0
- package/dist/shared/lucide-icons/percent.svg +1 -0
- package/dist/shared/lucide-icons/person-standing.svg +1 -0
- package/dist/shared/lucide-icons/philippine-peso.svg +1 -0
- package/dist/shared/lucide-icons/phone-call.svg +1 -0
- package/dist/shared/lucide-icons/phone-forwarded.svg +1 -0
- package/dist/shared/lucide-icons/phone-incoming.svg +1 -0
- package/dist/shared/lucide-icons/phone-missed.svg +1 -0
- package/dist/shared/lucide-icons/phone-off.svg +1 -0
- package/dist/shared/lucide-icons/phone-outgoing.svg +1 -0
- package/dist/shared/lucide-icons/phone.svg +1 -0
- package/dist/shared/lucide-icons/pi.svg +1 -0
- package/dist/shared/lucide-icons/piano.svg +1 -0
- package/dist/shared/lucide-icons/pickaxe.svg +1 -0
- package/dist/shared/lucide-icons/picture-in-picture.svg +1 -0
- package/dist/shared/lucide-icons/picture-in-picture2.svg +1 -0
- package/dist/shared/lucide-icons/piggy-bank.svg +1 -0
- package/dist/shared/lucide-icons/pilcrow-left.svg +1 -0
- package/dist/shared/lucide-icons/pilcrow-right.svg +1 -0
- package/dist/shared/lucide-icons/pilcrow.svg +1 -0
- package/dist/shared/lucide-icons/pill-bottle.svg +1 -0
- package/dist/shared/lucide-icons/pill.svg +1 -0
- package/dist/shared/lucide-icons/pin-off.svg +1 -0
- package/dist/shared/lucide-icons/pin.svg +1 -0
- package/dist/shared/lucide-icons/pipette.svg +1 -0
- package/dist/shared/lucide-icons/pizza.svg +1 -0
- package/dist/shared/lucide-icons/plane-landing.svg +1 -0
- package/dist/shared/lucide-icons/plane-takeoff.svg +1 -0
- package/dist/shared/lucide-icons/plane.svg +1 -0
- package/dist/shared/lucide-icons/play.svg +1 -0
- package/dist/shared/lucide-icons/plug-zap.svg +1 -0
- package/dist/shared/lucide-icons/plug.svg +1 -0
- package/dist/shared/lucide-icons/plug2.svg +1 -0
- package/dist/shared/lucide-icons/plus.svg +1 -0
- package/dist/shared/lucide-icons/pocket-knife.svg +1 -0
- package/dist/shared/lucide-icons/pocket.svg +1 -0
- package/dist/shared/lucide-icons/podcast.svg +1 -0
- package/dist/shared/lucide-icons/pointer-off.svg +1 -0
- package/dist/shared/lucide-icons/pointer.svg +1 -0
- package/dist/shared/lucide-icons/popcorn.svg +1 -0
- package/dist/shared/lucide-icons/popsicle.svg +1 -0
- package/dist/shared/lucide-icons/pound-sterling.svg +1 -0
- package/dist/shared/lucide-icons/power-off.svg +1 -0
- package/dist/shared/lucide-icons/power.svg +1 -0
- package/dist/shared/lucide-icons/presentation.svg +1 -0
- package/dist/shared/lucide-icons/printer-check.svg +1 -0
- package/dist/shared/lucide-icons/printer.svg +1 -0
- package/dist/shared/lucide-icons/projector.svg +1 -0
- package/dist/shared/lucide-icons/proportions.svg +1 -0
- package/dist/shared/lucide-icons/puzzle.svg +1 -0
- package/dist/shared/lucide-icons/pyramid.svg +1 -0
- package/dist/shared/lucide-icons/qr-code.svg +1 -0
- package/dist/shared/lucide-icons/quote.svg +1 -0
- package/dist/shared/lucide-icons/rabbit.svg +1 -0
- package/dist/shared/lucide-icons/radar.svg +1 -0
- package/dist/shared/lucide-icons/radiation.svg +1 -0
- package/dist/shared/lucide-icons/radical.svg +1 -0
- package/dist/shared/lucide-icons/radio-receiver.svg +1 -0
- package/dist/shared/lucide-icons/radio-tower.svg +1 -0
- package/dist/shared/lucide-icons/radio.svg +1 -0
- package/dist/shared/lucide-icons/radius.svg +1 -0
- package/dist/shared/lucide-icons/rail-symbol.svg +1 -0
- package/dist/shared/lucide-icons/rainbow.svg +1 -0
- package/dist/shared/lucide-icons/rat.svg +1 -0
- package/dist/shared/lucide-icons/ratio.svg +1 -0
- package/dist/shared/lucide-icons/receipt-cent.svg +1 -0
- package/dist/shared/lucide-icons/receipt-euro.svg +1 -0
- package/dist/shared/lucide-icons/receipt-indian-rupee.svg +1 -0
- package/dist/shared/lucide-icons/receipt-japanese-yen.svg +1 -0
- package/dist/shared/lucide-icons/receipt-pound-sterling.svg +1 -0
- package/dist/shared/lucide-icons/receipt-russian-ruble.svg +1 -0
- package/dist/shared/lucide-icons/receipt-swiss-franc.svg +1 -0
- package/dist/shared/lucide-icons/receipt-text.svg +1 -0
- package/dist/shared/lucide-icons/receipt.svg +1 -0
- package/dist/shared/lucide-icons/rectangle-ellipsis.svg +1 -0
- package/dist/shared/lucide-icons/rectangle-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/rectangle-vertical.svg +1 -0
- package/dist/shared/lucide-icons/recycle.svg +1 -0
- package/dist/shared/lucide-icons/redo-dot.svg +1 -0
- package/dist/shared/lucide-icons/redo.svg +1 -0
- package/dist/shared/lucide-icons/redo2.svg +1 -0
- package/dist/shared/lucide-icons/refresh-ccw-dot.svg +1 -0
- package/dist/shared/lucide-icons/refresh-ccw.svg +1 -0
- package/dist/shared/lucide-icons/refresh-cw-off.svg +1 -0
- package/dist/shared/lucide-icons/refresh-cw.svg +1 -0
- package/dist/shared/lucide-icons/refrigerator.svg +1 -0
- package/dist/shared/lucide-icons/regex.svg +1 -0
- package/dist/shared/lucide-icons/remove-formatting.svg +1 -0
- package/dist/shared/lucide-icons/repeat.svg +1 -0
- package/dist/shared/lucide-icons/repeat1.svg +1 -0
- package/dist/shared/lucide-icons/repeat2.svg +1 -0
- package/dist/shared/lucide-icons/replace-all.svg +1 -0
- package/dist/shared/lucide-icons/replace.svg +1 -0
- package/dist/shared/lucide-icons/reply-all.svg +1 -0
- package/dist/shared/lucide-icons/reply.svg +1 -0
- package/dist/shared/lucide-icons/rewind.svg +1 -0
- package/dist/shared/lucide-icons/ribbon.svg +1 -0
- package/dist/shared/lucide-icons/rocket.svg +1 -0
- package/dist/shared/lucide-icons/rocking-chair.svg +1 -0
- package/dist/shared/lucide-icons/roller-coaster.svg +1 -0
- package/dist/shared/lucide-icons/rotate-ccw-square.svg +1 -0
- package/dist/shared/lucide-icons/rotate-ccw.svg +1 -0
- package/dist/shared/lucide-icons/rotate-cw-square.svg +1 -0
- package/dist/shared/lucide-icons/rotate-cw.svg +1 -0
- package/dist/shared/lucide-icons/rotate3d.svg +1 -0
- package/dist/shared/lucide-icons/route-off.svg +1 -0
- package/dist/shared/lucide-icons/route.svg +1 -0
- package/dist/shared/lucide-icons/router.svg +1 -0
- package/dist/shared/lucide-icons/rows2.svg +1 -0
- package/dist/shared/lucide-icons/rows3.svg +1 -0
- package/dist/shared/lucide-icons/rows4.svg +1 -0
- package/dist/shared/lucide-icons/rss.svg +1 -0
- package/dist/shared/lucide-icons/ruler.svg +1 -0
- package/dist/shared/lucide-icons/russian-ruble.svg +1 -0
- package/dist/shared/lucide-icons/sailboat.svg +1 -0
- package/dist/shared/lucide-icons/salad.svg +1 -0
- package/dist/shared/lucide-icons/sandwich.svg +1 -0
- package/dist/shared/lucide-icons/satellite-dish.svg +1 -0
- package/dist/shared/lucide-icons/satellite.svg +1 -0
- package/dist/shared/lucide-icons/save-all.svg +1 -0
- package/dist/shared/lucide-icons/save-off.svg +1 -0
- package/dist/shared/lucide-icons/save.svg +1 -0
- package/dist/shared/lucide-icons/scale.svg +1 -0
- package/dist/shared/lucide-icons/scale3d.svg +1 -0
- package/dist/shared/lucide-icons/scaling.svg +1 -0
- package/dist/shared/lucide-icons/scan-barcode.svg +1 -0
- package/dist/shared/lucide-icons/scan-eye.svg +1 -0
- package/dist/shared/lucide-icons/scan-face.svg +1 -0
- package/dist/shared/lucide-icons/scan-heart.svg +1 -0
- package/dist/shared/lucide-icons/scan-line.svg +1 -0
- package/dist/shared/lucide-icons/scan-qr-code.svg +1 -0
- package/dist/shared/lucide-icons/scan-search.svg +1 -0
- package/dist/shared/lucide-icons/scan-text.svg +1 -0
- package/dist/shared/lucide-icons/scan.svg +1 -0
- package/dist/shared/lucide-icons/school.svg +1 -0
- package/dist/shared/lucide-icons/scissors-line-dashed.svg +1 -0
- package/dist/shared/lucide-icons/scissors.svg +1 -0
- package/dist/shared/lucide-icons/screen-share-off.svg +1 -0
- package/dist/shared/lucide-icons/screen-share.svg +1 -0
- package/dist/shared/lucide-icons/scroll-text.svg +1 -0
- package/dist/shared/lucide-icons/scroll.svg +1 -0
- package/dist/shared/lucide-icons/search-check.svg +1 -0
- package/dist/shared/lucide-icons/search-code.svg +1 -0
- package/dist/shared/lucide-icons/search-slash.svg +1 -0
- package/dist/shared/lucide-icons/search-x.svg +1 -0
- package/dist/shared/lucide-icons/search.svg +1 -0
- package/dist/shared/lucide-icons/section.svg +1 -0
- package/dist/shared/lucide-icons/send-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/send-to-back.svg +1 -0
- package/dist/shared/lucide-icons/send.svg +1 -0
- package/dist/shared/lucide-icons/separator-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/separator-vertical.svg +1 -0
- package/dist/shared/lucide-icons/server-cog.svg +1 -0
- package/dist/shared/lucide-icons/server-crash.svg +1 -0
- package/dist/shared/lucide-icons/server-off.svg +1 -0
- package/dist/shared/lucide-icons/server.svg +1 -0
- package/dist/shared/lucide-icons/settings.svg +1 -0
- package/dist/shared/lucide-icons/settings2.svg +1 -0
- package/dist/shared/lucide-icons/shapes.svg +1 -0
- package/dist/shared/lucide-icons/share.svg +1 -0
- package/dist/shared/lucide-icons/share2.svg +1 -0
- package/dist/shared/lucide-icons/sheet.svg +1 -0
- package/dist/shared/lucide-icons/shell.svg +1 -0
- package/dist/shared/lucide-icons/shield-alert.svg +1 -0
- package/dist/shared/lucide-icons/shield-ban.svg +1 -0
- package/dist/shared/lucide-icons/shield-check.svg +1 -0
- package/dist/shared/lucide-icons/shield-ellipsis.svg +1 -0
- package/dist/shared/lucide-icons/shield-half.svg +1 -0
- package/dist/shared/lucide-icons/shield-minus.svg +1 -0
- package/dist/shared/lucide-icons/shield-off.svg +1 -0
- package/dist/shared/lucide-icons/shield-plus.svg +1 -0
- package/dist/shared/lucide-icons/shield-question.svg +1 -0
- package/dist/shared/lucide-icons/shield-x.svg +1 -0
- package/dist/shared/lucide-icons/shield.svg +1 -0
- package/dist/shared/lucide-icons/ship-wheel.svg +1 -0
- package/dist/shared/lucide-icons/ship.svg +1 -0
- package/dist/shared/lucide-icons/shirt.svg +1 -0
- package/dist/shared/lucide-icons/shopping-bag.svg +1 -0
- package/dist/shared/lucide-icons/shopping-basket.svg +1 -0
- package/dist/shared/lucide-icons/shopping-cart.svg +1 -0
- package/dist/shared/lucide-icons/shovel.svg +1 -0
- package/dist/shared/lucide-icons/shower-head.svg +1 -0
- package/dist/shared/lucide-icons/shrink.svg +1 -0
- package/dist/shared/lucide-icons/shrub.svg +1 -0
- package/dist/shared/lucide-icons/shuffle.svg +1 -0
- package/dist/shared/lucide-icons/sigma.svg +1 -0
- package/dist/shared/lucide-icons/signal-high.svg +1 -0
- package/dist/shared/lucide-icons/signal-low.svg +1 -0
- package/dist/shared/lucide-icons/signal-medium.svg +1 -0
- package/dist/shared/lucide-icons/signal-zero.svg +1 -0
- package/dist/shared/lucide-icons/signal.svg +1 -0
- package/dist/shared/lucide-icons/signature.svg +1 -0
- package/dist/shared/lucide-icons/signpost-big.svg +1 -0
- package/dist/shared/lucide-icons/signpost.svg +1 -0
- package/dist/shared/lucide-icons/siren.svg +1 -0
- package/dist/shared/lucide-icons/skip-back.svg +1 -0
- package/dist/shared/lucide-icons/skip-forward.svg +1 -0
- package/dist/shared/lucide-icons/skull.svg +1 -0
- package/dist/shared/lucide-icons/slack.svg +1 -0
- package/dist/shared/lucide-icons/slash.svg +1 -0
- package/dist/shared/lucide-icons/slice.svg +1 -0
- package/dist/shared/lucide-icons/sliders-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/sliders-vertical.svg +1 -0
- package/dist/shared/lucide-icons/smartphone-charging.svg +1 -0
- package/dist/shared/lucide-icons/smartphone-nfc.svg +1 -0
- package/dist/shared/lucide-icons/smartphone.svg +1 -0
- package/dist/shared/lucide-icons/smile-plus.svg +1 -0
- package/dist/shared/lucide-icons/smile.svg +1 -0
- package/dist/shared/lucide-icons/snail.svg +1 -0
- package/dist/shared/lucide-icons/snowflake.svg +1 -0
- package/dist/shared/lucide-icons/sofa.svg +1 -0
- package/dist/shared/lucide-icons/soup.svg +1 -0
- package/dist/shared/lucide-icons/space.svg +1 -0
- package/dist/shared/lucide-icons/spade.svg +1 -0
- package/dist/shared/lucide-icons/sparkle.svg +1 -0
- package/dist/shared/lucide-icons/sparkles.svg +1 -0
- package/dist/shared/lucide-icons/speaker.svg +1 -0
- package/dist/shared/lucide-icons/speech.svg +1 -0
- package/dist/shared/lucide-icons/spell-check.svg +1 -0
- package/dist/shared/lucide-icons/spell-check2.svg +1 -0
- package/dist/shared/lucide-icons/spline.svg +1 -0
- package/dist/shared/lucide-icons/split.svg +1 -0
- package/dist/shared/lucide-icons/spray-can.svg +1 -0
- package/dist/shared/lucide-icons/sprout.svg +1 -0
- package/dist/shared/lucide-icons/square-activity.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-down-left.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-down-right.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-down.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-left.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-out-down-left.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-out-down-right.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-out-up-left.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-out-up-right.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-right.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-up-left.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-up-right.svg +1 -0
- package/dist/shared/lucide-icons/square-arrow-up.svg +1 -0
- package/dist/shared/lucide-icons/square-asterisk.svg +1 -0
- package/dist/shared/lucide-icons/square-bottom-dashed-scissors.svg +1 -0
- package/dist/shared/lucide-icons/square-chart-gantt.svg +1 -0
- package/dist/shared/lucide-icons/square-check-big.svg +1 -0
- package/dist/shared/lucide-icons/square-check.svg +1 -0
- package/dist/shared/lucide-icons/square-chevron-down.svg +1 -0
- package/dist/shared/lucide-icons/square-chevron-left.svg +1 -0
- package/dist/shared/lucide-icons/square-chevron-right.svg +1 -0
- package/dist/shared/lucide-icons/square-chevron-up.svg +1 -0
- package/dist/shared/lucide-icons/square-code.svg +1 -0
- package/dist/shared/lucide-icons/square-dashed-bottom-code.svg +1 -0
- package/dist/shared/lucide-icons/square-dashed-bottom.svg +1 -0
- package/dist/shared/lucide-icons/square-dashed-kanban.svg +1 -0
- package/dist/shared/lucide-icons/square-dashed-mouse-pointer.svg +1 -0
- package/dist/shared/lucide-icons/square-dashed.svg +1 -0
- package/dist/shared/lucide-icons/square-divide.svg +1 -0
- package/dist/shared/lucide-icons/square-dot.svg +1 -0
- package/dist/shared/lucide-icons/square-equal.svg +1 -0
- package/dist/shared/lucide-icons/square-function.svg +1 -0
- package/dist/shared/lucide-icons/square-kanban.svg +1 -0
- package/dist/shared/lucide-icons/square-library.svg +1 -0
- package/dist/shared/lucide-icons/square-m.svg +1 -0
- package/dist/shared/lucide-icons/square-menu.svg +1 -0
- package/dist/shared/lucide-icons/square-minus.svg +1 -0
- package/dist/shared/lucide-icons/square-mouse-pointer.svg +1 -0
- package/dist/shared/lucide-icons/square-parking-off.svg +1 -0
- package/dist/shared/lucide-icons/square-parking.svg +1 -0
- package/dist/shared/lucide-icons/square-pen.svg +1 -0
- package/dist/shared/lucide-icons/square-percent.svg +1 -0
- package/dist/shared/lucide-icons/square-pi.svg +1 -0
- package/dist/shared/lucide-icons/square-pilcrow.svg +1 -0
- package/dist/shared/lucide-icons/square-play.svg +1 -0
- package/dist/shared/lucide-icons/square-plus.svg +1 -0
- package/dist/shared/lucide-icons/square-power.svg +1 -0
- package/dist/shared/lucide-icons/square-radical.svg +1 -0
- package/dist/shared/lucide-icons/square-scissors.svg +1 -0
- package/dist/shared/lucide-icons/square-sigma.svg +1 -0
- package/dist/shared/lucide-icons/square-slash.svg +1 -0
- package/dist/shared/lucide-icons/square-split-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/square-split-vertical.svg +1 -0
- package/dist/shared/lucide-icons/square-square.svg +1 -0
- package/dist/shared/lucide-icons/square-stack.svg +1 -0
- package/dist/shared/lucide-icons/square-terminal.svg +1 -0
- package/dist/shared/lucide-icons/square-user-round.svg +1 -0
- package/dist/shared/lucide-icons/square-user.svg +1 -0
- package/dist/shared/lucide-icons/square-x.svg +1 -0
- package/dist/shared/lucide-icons/square.svg +1 -0
- package/dist/shared/lucide-icons/squircle.svg +1 -0
- package/dist/shared/lucide-icons/squirrel.svg +1 -0
- package/dist/shared/lucide-icons/stamp.svg +1 -0
- package/dist/shared/lucide-icons/star-half.svg +1 -0
- package/dist/shared/lucide-icons/star-off.svg +1 -0
- package/dist/shared/lucide-icons/star.svg +1 -0
- package/dist/shared/lucide-icons/step-back.svg +1 -0
- package/dist/shared/lucide-icons/step-forward.svg +1 -0
- package/dist/shared/lucide-icons/stethoscope.svg +1 -0
- package/dist/shared/lucide-icons/sticker.svg +1 -0
- package/dist/shared/lucide-icons/sticky-note.svg +1 -0
- package/dist/shared/lucide-icons/store.svg +1 -0
- package/dist/shared/lucide-icons/stretch-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/stretch-vertical.svg +1 -0
- package/dist/shared/lucide-icons/strikethrough.svg +1 -0
- package/dist/shared/lucide-icons/subscript.svg +1 -0
- package/dist/shared/lucide-icons/sun-dim.svg +1 -0
- package/dist/shared/lucide-icons/sun-medium.svg +1 -0
- package/dist/shared/lucide-icons/sun-moon.svg +1 -0
- package/dist/shared/lucide-icons/sun-snow.svg +1 -0
- package/dist/shared/lucide-icons/sun.svg +1 -0
- package/dist/shared/lucide-icons/sunrise.svg +1 -0
- package/dist/shared/lucide-icons/sunset.svg +1 -0
- package/dist/shared/lucide-icons/superscript.svg +1 -0
- package/dist/shared/lucide-icons/swatch-book.svg +1 -0
- package/dist/shared/lucide-icons/swiss-franc.svg +1 -0
- package/dist/shared/lucide-icons/switch-camera.svg +1 -0
- package/dist/shared/lucide-icons/sword.svg +1 -0
- package/dist/shared/lucide-icons/swords.svg +1 -0
- package/dist/shared/lucide-icons/syringe.svg +1 -0
- package/dist/shared/lucide-icons/table-cells-merge.svg +1 -0
- package/dist/shared/lucide-icons/table-cells-split.svg +1 -0
- package/dist/shared/lucide-icons/table-columns-split.svg +1 -0
- package/dist/shared/lucide-icons/table-of-contents.svg +1 -0
- package/dist/shared/lucide-icons/table-properties.svg +1 -0
- package/dist/shared/lucide-icons/table-rows-split.svg +1 -0
- package/dist/shared/lucide-icons/table.svg +1 -0
- package/dist/shared/lucide-icons/table2.svg +1 -0
- package/dist/shared/lucide-icons/tablet-smartphone.svg +1 -0
- package/dist/shared/lucide-icons/tablet.svg +1 -0
- package/dist/shared/lucide-icons/tablets.svg +1 -0
- package/dist/shared/lucide-icons/tag.svg +1 -0
- package/dist/shared/lucide-icons/tags.svg +1 -0
- package/dist/shared/lucide-icons/tally1.svg +1 -0
- package/dist/shared/lucide-icons/tally2.svg +1 -0
- package/dist/shared/lucide-icons/tally3.svg +1 -0
- package/dist/shared/lucide-icons/tally4.svg +1 -0
- package/dist/shared/lucide-icons/tally5.svg +1 -0
- package/dist/shared/lucide-icons/tangent.svg +1 -0
- package/dist/shared/lucide-icons/target.svg +1 -0
- package/dist/shared/lucide-icons/telescope.svg +1 -0
- package/dist/shared/lucide-icons/tent-tree.svg +1 -0
- package/dist/shared/lucide-icons/tent.svg +1 -0
- package/dist/shared/lucide-icons/terminal.svg +1 -0
- package/dist/shared/lucide-icons/test-tube-diagonal.svg +1 -0
- package/dist/shared/lucide-icons/test-tube.svg +1 -0
- package/dist/shared/lucide-icons/test-tubes.svg +1 -0
- package/dist/shared/lucide-icons/text-cursor-input.svg +1 -0
- package/dist/shared/lucide-icons/text-cursor.svg +1 -0
- package/dist/shared/lucide-icons/text-quote.svg +1 -0
- package/dist/shared/lucide-icons/text-search.svg +1 -0
- package/dist/shared/lucide-icons/text-select.svg +1 -0
- package/dist/shared/lucide-icons/text.svg +1 -0
- package/dist/shared/lucide-icons/theater.svg +1 -0
- package/dist/shared/lucide-icons/thermometer-snowflake.svg +1 -0
- package/dist/shared/lucide-icons/thermometer-sun.svg +1 -0
- package/dist/shared/lucide-icons/thermometer.svg +1 -0
- package/dist/shared/lucide-icons/thumbs-down.svg +1 -0
- package/dist/shared/lucide-icons/thumbs-up.svg +1 -0
- package/dist/shared/lucide-icons/ticket-check.svg +1 -0
- package/dist/shared/lucide-icons/ticket-minus.svg +1 -0
- package/dist/shared/lucide-icons/ticket-percent.svg +1 -0
- package/dist/shared/lucide-icons/ticket-plus.svg +1 -0
- package/dist/shared/lucide-icons/ticket-slash.svg +1 -0
- package/dist/shared/lucide-icons/ticket-x.svg +1 -0
- package/dist/shared/lucide-icons/ticket.svg +1 -0
- package/dist/shared/lucide-icons/tickets-plane.svg +1 -0
- package/dist/shared/lucide-icons/tickets.svg +1 -0
- package/dist/shared/lucide-icons/timer-off.svg +1 -0
- package/dist/shared/lucide-icons/timer-reset.svg +1 -0
- package/dist/shared/lucide-icons/timer.svg +1 -0
- package/dist/shared/lucide-icons/toggle-left.svg +1 -0
- package/dist/shared/lucide-icons/toggle-right.svg +1 -0
- package/dist/shared/lucide-icons/toilet.svg +1 -0
- package/dist/shared/lucide-icons/tornado.svg +1 -0
- package/dist/shared/lucide-icons/torus.svg +1 -0
- package/dist/shared/lucide-icons/touchpad-off.svg +1 -0
- package/dist/shared/lucide-icons/touchpad.svg +1 -0
- package/dist/shared/lucide-icons/tower-control.svg +1 -0
- package/dist/shared/lucide-icons/toy-brick.svg +1 -0
- package/dist/shared/lucide-icons/tractor.svg +1 -0
- package/dist/shared/lucide-icons/traffic-cone.svg +1 -0
- package/dist/shared/lucide-icons/train-front-tunnel.svg +1 -0
- package/dist/shared/lucide-icons/train-front.svg +1 -0
- package/dist/shared/lucide-icons/train-track.svg +1 -0
- package/dist/shared/lucide-icons/tram-front.svg +1 -0
- package/dist/shared/lucide-icons/trash.svg +1 -0
- package/dist/shared/lucide-icons/trash2.svg +1 -0
- package/dist/shared/lucide-icons/tree-deciduous.svg +1 -0
- package/dist/shared/lucide-icons/tree-palm.svg +1 -0
- package/dist/shared/lucide-icons/tree-pine.svg +1 -0
- package/dist/shared/lucide-icons/trees.svg +1 -0
- package/dist/shared/lucide-icons/trello.svg +1 -0
- package/dist/shared/lucide-icons/trending-down.svg +1 -0
- package/dist/shared/lucide-icons/trending-up-down.svg +1 -0
- package/dist/shared/lucide-icons/trending-up.svg +1 -0
- package/dist/shared/lucide-icons/triangle-alert.svg +1 -0
- package/dist/shared/lucide-icons/triangle-right.svg +1 -0
- package/dist/shared/lucide-icons/triangle.svg +1 -0
- package/dist/shared/lucide-icons/trophy.svg +1 -0
- package/dist/shared/lucide-icons/truck.svg +1 -0
- package/dist/shared/lucide-icons/turtle.svg +1 -0
- package/dist/shared/lucide-icons/tv-minimal-play.svg +1 -0
- package/dist/shared/lucide-icons/tv-minimal.svg +1 -0
- package/dist/shared/lucide-icons/tv.svg +1 -0
- package/dist/shared/lucide-icons/twitch.svg +1 -0
- package/dist/shared/lucide-icons/twitter.svg +1 -0
- package/dist/shared/lucide-icons/type-outline.svg +1 -0
- package/dist/shared/lucide-icons/type.svg +1 -0
- package/dist/shared/lucide-icons/umbrella-off.svg +1 -0
- package/dist/shared/lucide-icons/umbrella.svg +1 -0
- package/dist/shared/lucide-icons/underline.svg +1 -0
- package/dist/shared/lucide-icons/undo-dot.svg +1 -0
- package/dist/shared/lucide-icons/undo.svg +1 -0
- package/dist/shared/lucide-icons/undo2.svg +1 -0
- package/dist/shared/lucide-icons/unfold-horizontal.svg +1 -0
- package/dist/shared/lucide-icons/unfold-vertical.svg +1 -0
- package/dist/shared/lucide-icons/ungroup.svg +1 -0
- package/dist/shared/lucide-icons/university.svg +1 -0
- package/dist/shared/lucide-icons/unlink.svg +1 -0
- package/dist/shared/lucide-icons/unlink2.svg +1 -0
- package/dist/shared/lucide-icons/unplug.svg +1 -0
- package/dist/shared/lucide-icons/upload.svg +1 -0
- package/dist/shared/lucide-icons/usb.svg +1 -0
- package/dist/shared/lucide-icons/user-check.svg +1 -0
- package/dist/shared/lucide-icons/user-cog.svg +1 -0
- package/dist/shared/lucide-icons/user-minus.svg +1 -0
- package/dist/shared/lucide-icons/user-pen.svg +1 -0
- package/dist/shared/lucide-icons/user-plus.svg +1 -0
- package/dist/shared/lucide-icons/user-round-check.svg +1 -0
- package/dist/shared/lucide-icons/user-round-cog.svg +1 -0
- package/dist/shared/lucide-icons/user-round-minus.svg +1 -0
- package/dist/shared/lucide-icons/user-round-pen.svg +1 -0
- package/dist/shared/lucide-icons/user-round-plus.svg +1 -0
- package/dist/shared/lucide-icons/user-round-search.svg +1 -0
- package/dist/shared/lucide-icons/user-round-x.svg +1 -0
- package/dist/shared/lucide-icons/user-round.svg +1 -0
- package/dist/shared/lucide-icons/user-search.svg +1 -0
- package/dist/shared/lucide-icons/user-x.svg +1 -0
- package/dist/shared/lucide-icons/user.svg +1 -0
- package/dist/shared/lucide-icons/users-round.svg +1 -0
- package/dist/shared/lucide-icons/users.svg +1 -0
- package/dist/shared/lucide-icons/utensils-crossed.svg +1 -0
- package/dist/shared/lucide-icons/utensils.svg +1 -0
- package/dist/shared/lucide-icons/utility-pole.svg +1 -0
- package/dist/shared/lucide-icons/variable.svg +1 -0
- package/dist/shared/lucide-icons/vault.svg +1 -0
- package/dist/shared/lucide-icons/vegan.svg +1 -0
- package/dist/shared/lucide-icons/venetian-mask.svg +1 -0
- package/dist/shared/lucide-icons/vibrate-off.svg +1 -0
- package/dist/shared/lucide-icons/vibrate.svg +1 -0
- package/dist/shared/lucide-icons/video-off.svg +1 -0
- package/dist/shared/lucide-icons/video.svg +1 -0
- package/dist/shared/lucide-icons/videotape.svg +1 -0
- package/dist/shared/lucide-icons/view.svg +1 -0
- package/dist/shared/lucide-icons/voicemail.svg +1 -0
- package/dist/shared/lucide-icons/volleyball.svg +1 -0
- package/dist/shared/lucide-icons/volume-off.svg +1 -0
- package/dist/shared/lucide-icons/volume-x.svg +1 -0
- package/dist/shared/lucide-icons/volume.svg +1 -0
- package/dist/shared/lucide-icons/volume1.svg +1 -0
- package/dist/shared/lucide-icons/volume2.svg +1 -0
- package/dist/shared/lucide-icons/vote.svg +1 -0
- package/dist/shared/lucide-icons/wallet-cards.svg +1 -0
- package/dist/shared/lucide-icons/wallet-minimal.svg +1 -0
- package/dist/shared/lucide-icons/wallet.svg +1 -0
- package/dist/shared/lucide-icons/wallpaper.svg +1 -0
- package/dist/shared/lucide-icons/wand-sparkles.svg +1 -0
- package/dist/shared/lucide-icons/wand.svg +1 -0
- package/dist/shared/lucide-icons/warehouse.svg +1 -0
- package/dist/shared/lucide-icons/washing-machine.svg +1 -0
- package/dist/shared/lucide-icons/watch.svg +1 -0
- package/dist/shared/lucide-icons/waves-ladder.svg +1 -0
- package/dist/shared/lucide-icons/waves.svg +1 -0
- package/dist/shared/lucide-icons/waypoints.svg +1 -0
- package/dist/shared/lucide-icons/webcam.svg +1 -0
- package/dist/shared/lucide-icons/webhook-off.svg +1 -0
- package/dist/shared/lucide-icons/webhook.svg +1 -0
- package/dist/shared/lucide-icons/weight.svg +1 -0
- package/dist/shared/lucide-icons/wheat-off.svg +1 -0
- package/dist/shared/lucide-icons/wheat.svg +1 -0
- package/dist/shared/lucide-icons/whole-word.svg +1 -0
- package/dist/shared/lucide-icons/wifi-high.svg +1 -0
- package/dist/shared/lucide-icons/wifi-low.svg +1 -0
- package/dist/shared/lucide-icons/wifi-off.svg +1 -0
- package/dist/shared/lucide-icons/wifi-zero.svg +1 -0
- package/dist/shared/lucide-icons/wifi.svg +1 -0
- package/dist/shared/lucide-icons/wind-arrow-down.svg +1 -0
- package/dist/shared/lucide-icons/wind.svg +1 -0
- package/dist/shared/lucide-icons/wine-off.svg +1 -0
- package/dist/shared/lucide-icons/wine.svg +1 -0
- package/dist/shared/lucide-icons/workflow.svg +1 -0
- package/dist/shared/lucide-icons/worm.svg +1 -0
- package/dist/shared/lucide-icons/wrap-text.svg +1 -0
- package/dist/shared/lucide-icons/wrench.svg +1 -0
- package/dist/shared/lucide-icons/x.svg +1 -0
- package/dist/shared/lucide-icons/youtube.svg +1 -0
- package/dist/shared/lucide-icons/zap-off.svg +1 -0
- package/dist/shared/lucide-icons/zap.svg +1 -0
- package/dist/shared/lucide-icons/zoom-in.svg +1 -0
- package/dist/shared/lucide-icons/zoom-out.svg +1 -0
- package/dist/{server → shared}/projectIcons.js +2 -2
- package/package.json +6 -4
- package/texlite.config.example.json +4 -1
- package/dist/client/assets/GitDialog-Ds1IhVJ3.js +0 -3
- package/dist/client/assets/HistoryDialog-BOLQxHvV.js +0 -5
- package/dist/client/assets/PdfPreview-DwKlkGl9.js +0 -1
- package/dist/client/assets/ProjectNavigationDialogs-D6grphxz.js +0 -1
- package/dist/client/assets/SystemMetricsDialog-CxiyDnsC.js +0 -1
- package/dist/client/assets/index-BoLY1azn.js +0 -64
- package/dist/client/assets/index-DzzqNm9b.css +0 -1
package/dist/server/app.js
CHANGED
|
@@ -16,6 +16,9 @@ import { ProjectMutationCoordinator } from "./projectMutations.js";
|
|
|
16
16
|
import { ProjectGitService } from "./git.js";
|
|
17
17
|
import { LatexCompletionService } from "./latexCompletion.js";
|
|
18
18
|
import { ProjectHistoryService } from "./history.js";
|
|
19
|
+
import { ProjectEditHistoryService } from "./editHistory.js";
|
|
20
|
+
import { HistoryRetentionScheduler } from "./historyRetention.js";
|
|
21
|
+
import { EditHistoryRetry } from "./editHistoryRetry.js";
|
|
19
22
|
import { ProjectOutlineService } from "./projectOutline.js";
|
|
20
23
|
import { MetricRegistry } from "./metrics.js";
|
|
21
24
|
import { apiError, HttpError } from "./http.js";
|
|
@@ -49,6 +52,10 @@ export async function buildApp(config, db, options = {}) {
|
|
|
49
52
|
const eventLoopDelay = monitorEventLoopDelay({ resolution: 20 });
|
|
50
53
|
eventLoopDelay.enable();
|
|
51
54
|
const history = new ProjectHistoryService(config, db);
|
|
55
|
+
const editHistory = new ProjectEditHistoryService(db, config.editHistoryMaxStorageBytes);
|
|
56
|
+
const historyRetention = new HistoryRetentionScheduler(history, {
|
|
57
|
+
onError: (error, projectId) => app.log.error({ err: error, projectId }, "Failed to enforce project history retention")
|
|
58
|
+
});
|
|
52
59
|
const latexCompletions = new LatexCompletionService(config);
|
|
53
60
|
const projectOutlines = new ProjectOutlineService(config);
|
|
54
61
|
const harper = new HarperService();
|
|
@@ -56,18 +63,47 @@ export async function buildApp(config, db, options = {}) {
|
|
|
56
63
|
// Probe the optional host Harper CLI without delaying startup. Its absence is
|
|
57
64
|
// supported: the browser spellchecker remains the writing-check fallback.
|
|
58
65
|
void harper.preload().catch((error) => app.log.info({ err: error }, "Optional Harper CLI is unavailable"));
|
|
66
|
+
const failedSnapshots = new Set();
|
|
67
|
+
const failedEdits = new Map();
|
|
68
|
+
const signalHistory = (id) => collaboration.setHistoryWarning(id, failedSnapshots.has(id) || failedEdits.has(id));
|
|
69
|
+
const editRetry = new EditHistoryRetry((id, edits) => editHistory.record(id, edits), (id) => Boolean(db.prepare("SELECT 1 FROM projects WHERE id = ?").get(id)), (id, state, error) => {
|
|
70
|
+
if (state === "discarded") {
|
|
71
|
+
failedEdits.delete(id);
|
|
72
|
+
failedSnapshots.delete(id);
|
|
73
|
+
signalHistory(id);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (failedEdits.get(id) !== "incomplete") {
|
|
77
|
+
if (state === "ok")
|
|
78
|
+
failedEdits.delete(id);
|
|
79
|
+
else
|
|
80
|
+
failedEdits.set(id, state);
|
|
81
|
+
}
|
|
82
|
+
if (error)
|
|
83
|
+
app.log.error({ err: error, projectId: id }, "Failed to record project edit history");
|
|
84
|
+
signalHistory(id);
|
|
85
|
+
});
|
|
59
86
|
const recordHistory = (projectId, userId, reason, paths) => {
|
|
60
87
|
try {
|
|
61
|
-
|
|
88
|
+
const version = history.record(projectId, userId, reason, failedSnapshots.has(projectId) ? undefined : paths, { deferRetention: reason === "autosave" });
|
|
89
|
+
if (failedSnapshots.delete(projectId))
|
|
90
|
+
signalHistory(projectId);
|
|
91
|
+
if (version && reason === "autosave")
|
|
92
|
+
historyRetention.schedule(projectId);
|
|
93
|
+
return version;
|
|
62
94
|
}
|
|
63
95
|
catch (error) {
|
|
96
|
+
failedSnapshots.add(projectId);
|
|
97
|
+
signalHistory(projectId);
|
|
64
98
|
app.log.error({ err: error, projectId }, "Failed to record project history");
|
|
65
99
|
return null;
|
|
66
100
|
}
|
|
67
101
|
};
|
|
68
|
-
const collaboration = new CollaborationService(config, db, ({ projectId, userId, paths, durationMs }) => {
|
|
69
|
-
|
|
102
|
+
const collaboration = new CollaborationService(config, db, ({ projectId, userId, paths, edits, durationMs }) => {
|
|
103
|
+
const started = performance.now();
|
|
104
|
+
editRetry.save(projectId, edits);
|
|
70
105
|
recordHistory(projectId, userId, "autosave", paths);
|
|
106
|
+
metrics.record("collaboration.persist", durationMs + performance.now() - started);
|
|
71
107
|
});
|
|
72
108
|
const projectMutations = new ProjectMutationCoordinator(collaboration);
|
|
73
109
|
const projectGit = new ProjectGitService(config, db, options.githubFetch);
|
|
@@ -103,11 +139,14 @@ export async function buildApp(config, db, options = {}) {
|
|
|
103
139
|
await pruneTrashDirectory(config);
|
|
104
140
|
for (const row of db.prepare("SELECT id FROM projects").all()) {
|
|
105
141
|
history.enforceRetention(row.id);
|
|
142
|
+
editHistory.enforceRetention(row.id);
|
|
106
143
|
pruneCompileRuns(row.id);
|
|
107
144
|
pruneOrphanedCompileRuns(config, row.id);
|
|
108
145
|
}
|
|
109
146
|
app.addHook("onClose", async () => {
|
|
110
147
|
eventLoopDelay.disable();
|
|
148
|
+
historyRetention.dispose();
|
|
149
|
+
editRetry.dispose();
|
|
111
150
|
await harper.dispose();
|
|
112
151
|
await texcount.dispose();
|
|
113
152
|
});
|
|
@@ -187,7 +226,9 @@ export async function buildApp(config, db, options = {}) {
|
|
|
187
226
|
metrics,
|
|
188
227
|
recordHistory
|
|
189
228
|
});
|
|
190
|
-
registerProjectHistoryRoutes(app, { config, db, history, projectMutations, recordHistory
|
|
229
|
+
registerProjectHistoryRoutes(app, { config, db, history, editHistory, projectMutations, recordHistory,
|
|
230
|
+
clearPendingEdits: (id) => { editRetry.clear(id); failedEdits.delete(id); signalHistory(id); },
|
|
231
|
+
scheduleHistoryRetention: (id) => historyRetention.schedule(id) });
|
|
191
232
|
registerProjectGitRoutes(app, { config, db, collaboration, projectMutations, projectGit, recordHistory });
|
|
192
233
|
registerProjectCatalogRoutes(app, {
|
|
193
234
|
config,
|
package/dist/server/cli.js
CHANGED
|
@@ -117,6 +117,9 @@ function writeInitialConfig(configPath, siteName, adminEmail) {
|
|
|
117
117
|
maxVersions: CONFIG_DEFAULTS.historyMaxVersions,
|
|
118
118
|
maxStorageMB: CONFIG_DEFAULTS.historyMaxStorageMB
|
|
119
119
|
},
|
|
120
|
+
editHistory: {
|
|
121
|
+
maxStorageMB: CONFIG_DEFAULTS.editHistoryMaxStorageMB
|
|
122
|
+
},
|
|
120
123
|
git: {
|
|
121
124
|
binary: CONFIG_DEFAULTS.git,
|
|
122
125
|
operationTimeoutSeconds: CONFIG_DEFAULTS.gitOperationTimeoutSeconds,
|
|
@@ -289,6 +292,7 @@ async function printConfig(options) {
|
|
|
289
292
|
pdfRangeThresholdMB: config.pdfRangeThresholdBytes / (1024 * 1024),
|
|
290
293
|
historyMaxVersions: config.historyMaxVersions,
|
|
291
294
|
historyMaxStorageBytes: config.historyMaxStorageBytes,
|
|
295
|
+
editHistoryMaxStorageBytes: config.editHistoryMaxStorageBytes,
|
|
292
296
|
git: config.git
|
|
293
297
|
}, null, 2));
|
|
294
298
|
}
|
|
@@ -9,8 +9,9 @@ import * as decoding from "lib0/decoding";
|
|
|
9
9
|
import * as syncProtocol from "y-protocols/sync";
|
|
10
10
|
import { Awareness, applyAwarenessUpdate, encodeAwarenessUpdate, modifyAwarenessUpdate, removeAwarenessStates } from "y-protocols/awareness";
|
|
11
11
|
import { listProjectFilesAsync, outputRoot, resolveSourcePath, safeRelativePath, sourceRoot } from "./files.js";
|
|
12
|
-
import {
|
|
12
|
+
import { collaborationProjectAccessFromStatement, canEdit, prepareCollaborationProjectAccessStatement } from "./projects.js";
|
|
13
13
|
import { reanchorFileComments } from "./anchors.js";
|
|
14
|
+
import { hashText } from "./editHistory.js";
|
|
14
15
|
const MESSAGE_SYNC = 0;
|
|
15
16
|
const MESSAGE_AWARENESS = 1;
|
|
16
17
|
const MESSAGE_QUERY_AWARENESS = 3;
|
|
@@ -43,11 +44,17 @@ const STATE_SAVE_DELAY_MS = 750;
|
|
|
43
44
|
const ROOM_IDLE_MS = 30_000;
|
|
44
45
|
const FORMAT_LEASE_TTL_MS = 45_000;
|
|
45
46
|
const MAX_FORMAT_LEASE_WAITERS = MAX_PROJECT_SESSIONS * 2;
|
|
47
|
+
// A normal typing burst produces a few small Yjs updates. Keep adjacent
|
|
48
|
+
// updates from the same user together without ever merging across another
|
|
49
|
+
// collaborator's edit, so the resulting record remains attributable.
|
|
50
|
+
const EDIT_SEGMENT_IDLE_MS = 30_000;
|
|
51
|
+
const MAX_EDIT_SPANS_PER_STEP = 96;
|
|
52
|
+
const MAX_EDIT_PREVIEW_CHARS = 1_200;
|
|
46
53
|
// Completion notifications are useful only to browsers that were already
|
|
47
54
|
// present when the operation finished. The database and retained manifests
|
|
48
55
|
// are the authority for a later workspace open.
|
|
49
56
|
const COMPLETED_COMPILE_STATE_TTL_MS = 60_000;
|
|
50
|
-
const EPHEMERAL_META_KEYS = ["compileStates", "filesEvent", "commentsRevision", "dictionaryRevision"];
|
|
57
|
+
const EPHEMERAL_META_KEYS = ["compileStates", "filesEvent", "commentsRevision", "dictionaryRevision", "historyWarning"];
|
|
51
58
|
const COLORS = [
|
|
52
59
|
["#1677c8", "#1677c833"], ["#d65745", "#d6574533"], ["#16866a", "#16866a33"],
|
|
53
60
|
["#9a58b5", "#9a58b533"], ["#d27b18", "#d27b1833"], ["#3f7d20", "#3f7d2033"],
|
|
@@ -64,18 +71,27 @@ export class CollaborationService {
|
|
|
64
71
|
projectGenerations = new Map();
|
|
65
72
|
snapshotBarriers = new Map();
|
|
66
73
|
pendingConnections = new Map();
|
|
74
|
+
/** Transient server-side status, restored into each newly opened room. */
|
|
75
|
+
historyWarnings = new Set();
|
|
67
76
|
closed = false;
|
|
77
|
+
userByIdStatement;
|
|
78
|
+
collaborationProjectAccessStatement;
|
|
68
79
|
constructor(config, db, onPersist) {
|
|
69
80
|
this.config = config;
|
|
70
81
|
this.db = db;
|
|
71
82
|
this.onPersist = onPersist;
|
|
83
|
+
this.userByIdStatement = db.prepare("SELECT * FROM users WHERE id = ?");
|
|
84
|
+
this.collaborationProjectAccessStatement = prepareCollaborationProjectAccessStatement(db);
|
|
85
|
+
}
|
|
86
|
+
lookupProjectAccess(projectId, user) {
|
|
87
|
+
return collaborationProjectAccessFromStatement(this.collaborationProjectAccessStatement, projectId, user);
|
|
72
88
|
}
|
|
73
89
|
async connect(socket, projectId, user) {
|
|
74
90
|
if (this.closed) {
|
|
75
91
|
socket.close(1012, "Collaboration service is shutting down");
|
|
76
92
|
return;
|
|
77
93
|
}
|
|
78
|
-
const project =
|
|
94
|
+
const project = this.lookupProjectAccess(projectId, user);
|
|
79
95
|
if (!project) {
|
|
80
96
|
socket.close(1008, "Project access denied");
|
|
81
97
|
return;
|
|
@@ -390,6 +406,16 @@ export class CollaborationService {
|
|
|
390
406
|
const filePath = filePathInput ? safeRelativePath(filePathInput) : "";
|
|
391
407
|
this.bumpFiles(room, { kind: "update", path: filePath });
|
|
392
408
|
}
|
|
409
|
+
setHistoryWarning(projectId, warning) {
|
|
410
|
+
if (warning)
|
|
411
|
+
this.historyWarnings.add(projectId);
|
|
412
|
+
else
|
|
413
|
+
this.historyWarnings.delete(projectId);
|
|
414
|
+
const room = this.rooms.get(projectId);
|
|
415
|
+
if (!room || room.meta.get("historyWarning") === warning)
|
|
416
|
+
return;
|
|
417
|
+
room.doc.transact(() => room.meta.set("historyWarning", warning), META_ORIGIN);
|
|
418
|
+
}
|
|
393
419
|
signalComments(projectId) {
|
|
394
420
|
const room = this.rooms.get(projectId);
|
|
395
421
|
if (!room)
|
|
@@ -558,6 +584,7 @@ export class CollaborationService {
|
|
|
558
584
|
this.roomInitializations.clear();
|
|
559
585
|
this.snapshotBarriers.clear();
|
|
560
586
|
this.pendingConnections.clear();
|
|
587
|
+
this.historyWarnings.clear();
|
|
561
588
|
}
|
|
562
589
|
initializeRoom(projectId, generation) {
|
|
563
590
|
const existing = this.rooms.get(projectId);
|
|
@@ -677,7 +704,9 @@ export class CollaborationService {
|
|
|
677
704
|
awarenessOwners: new Map(),
|
|
678
705
|
allowedPaths: new Set(),
|
|
679
706
|
persistedContent: new Map(),
|
|
707
|
+
observedContent: new Map(),
|
|
680
708
|
dirtyPaths: new Set(),
|
|
709
|
+
pendingEditSegments: [],
|
|
681
710
|
textObservers: new Map(),
|
|
682
711
|
saveTimer: null,
|
|
683
712
|
stateSaveTimer: null,
|
|
@@ -700,6 +729,12 @@ export class CollaborationService {
|
|
|
700
729
|
// longer exists. The database/source tree are authoritative after a
|
|
701
730
|
// restart; clear the markers before any browser can sync them back.
|
|
702
731
|
const recoveredMetadataChanged = bootstrap.recoveredState && this.clearRecoveredMetadata(room);
|
|
732
|
+
// History bookkeeping is not stored in a project Yjs document, but a
|
|
733
|
+
// temporary failure must remain visible if its room was idled out before
|
|
734
|
+
// the editor reconnects.
|
|
735
|
+
if (this.historyWarnings.has(projectId)) {
|
|
736
|
+
room.doc.transact(() => room.meta.set("historyWarning", true), META_ORIGIN);
|
|
737
|
+
}
|
|
703
738
|
this.sanitizeCompileStates(room);
|
|
704
739
|
let recoveredDirty = false;
|
|
705
740
|
const diskPaths = new Set();
|
|
@@ -720,13 +755,17 @@ export class CollaborationService {
|
|
|
720
755
|
else {
|
|
721
756
|
replaceText(text, file.content);
|
|
722
757
|
}
|
|
758
|
+
room.observedContent.set(file.path, text.toString());
|
|
723
759
|
}
|
|
724
760
|
for (const name of room.doc.share.keys()) {
|
|
725
761
|
if (!name.startsWith(SOURCE_PREFIX))
|
|
726
762
|
continue;
|
|
727
763
|
const filePath = name.slice(SOURCE_PREFIX.length);
|
|
728
|
-
if (!diskPaths.has(filePath))
|
|
729
|
-
|
|
764
|
+
if (!diskPaths.has(filePath)) {
|
|
765
|
+
const text = room.doc.getText(name);
|
|
766
|
+
replaceText(text, "");
|
|
767
|
+
room.observedContent.set(filePath, text.toString());
|
|
768
|
+
}
|
|
730
769
|
}
|
|
731
770
|
}, DISK_ORIGIN);
|
|
732
771
|
const rejectedRecoveredPaths = this.rejectOversizedTexts(room);
|
|
@@ -790,7 +829,7 @@ export class CollaborationService {
|
|
|
790
829
|
attachConnection(room, socket, user) {
|
|
791
830
|
if (socket.readyState !== WebSocket.OPEN)
|
|
792
831
|
return;
|
|
793
|
-
if (!
|
|
832
|
+
if (!this.lookupProjectAccess(room.projectId, user)) {
|
|
794
833
|
socket.close(1008, "Project access denied");
|
|
795
834
|
return;
|
|
796
835
|
}
|
|
@@ -832,9 +871,17 @@ export class CollaborationService {
|
|
|
832
871
|
const text = room.doc.getText(typeName(filePath));
|
|
833
872
|
if (room.textObservers.has(filePath))
|
|
834
873
|
return text;
|
|
835
|
-
const observer = (
|
|
836
|
-
|
|
874
|
+
const observer = (event, transaction) => {
|
|
875
|
+
const before = room.observedContent.get(filePath) ?? text.toString();
|
|
876
|
+
const after = text.toString();
|
|
877
|
+
if (transaction.origin === DISK_ORIGIN || transaction.origin === HTTP_ORIGIN || transaction.origin === META_ORIGIN) {
|
|
878
|
+
// Non-collaborative mutations deliberately reset the source chain.
|
|
879
|
+
// They are represented by recovery snapshots, not by a guessed user
|
|
880
|
+
// edit record; keeping this mirror current prevents later edits from
|
|
881
|
+
// being mapped across such a replacement.
|
|
882
|
+
room.observedContent.set(filePath, after);
|
|
837
883
|
return;
|
|
884
|
+
}
|
|
838
885
|
if (!room.allowedPaths.has(filePath)) {
|
|
839
886
|
// A client can still have the old Y.Text bound briefly after another
|
|
840
887
|
// session deletes or moves a file. Correct any late update immediately;
|
|
@@ -843,21 +890,69 @@ export class CollaborationService {
|
|
|
843
890
|
room.doc.transact(() => replaceText(text, ""), DISK_ORIGIN);
|
|
844
891
|
return;
|
|
845
892
|
}
|
|
893
|
+
if (isConnectionOrigin(transaction.origin) && before !== after) {
|
|
894
|
+
const connection = transaction.origin;
|
|
895
|
+
this.recordEditStep(room, filePath, connection, event, before, after);
|
|
896
|
+
}
|
|
897
|
+
room.observedContent.set(filePath, after);
|
|
846
898
|
room.dirtyPaths.add(filePath);
|
|
847
899
|
};
|
|
848
900
|
text.observe(observer);
|
|
849
901
|
room.textObservers.set(filePath, observer);
|
|
850
902
|
return text;
|
|
851
903
|
}
|
|
904
|
+
/**
|
|
905
|
+
* Keep live collaborative changes in short, author-isolated segments. The
|
|
906
|
+
* segment is only handed to the history service after `flushRoom()` has
|
|
907
|
+
* made the matching source content durable.
|
|
908
|
+
*/
|
|
909
|
+
recordEditStep(room, filePath, connection, event, before, after) {
|
|
910
|
+
const spans = editSpansFromYDelta(event.delta, before, after);
|
|
911
|
+
if (!spans.length)
|
|
912
|
+
return;
|
|
913
|
+
const createdAt = new Date().toISOString();
|
|
914
|
+
const activeLease = this.activeFormatLease(room, filePath);
|
|
915
|
+
const kind = activeLease?.connection === connection ? "format" : "edit";
|
|
916
|
+
const step = {
|
|
917
|
+
beforeHash: hashText(before),
|
|
918
|
+
afterHash: hashText(after),
|
|
919
|
+
createdAt,
|
|
920
|
+
spans
|
|
921
|
+
};
|
|
922
|
+
const previous = room.pendingEditSegments.at(-1);
|
|
923
|
+
const previousTime = previous ? Date.parse(previous.updatedAt) : Number.NaN;
|
|
924
|
+
if (previous
|
|
925
|
+
&& previous.filePath === filePath
|
|
926
|
+
&& previous.authorId === connection.user.id
|
|
927
|
+
&& previous.kind === kind
|
|
928
|
+
&& previous.afterHash === step.beforeHash
|
|
929
|
+
&& Number.isFinite(previousTime)
|
|
930
|
+
&& Date.parse(createdAt) - previousTime <= EDIT_SEGMENT_IDLE_MS) {
|
|
931
|
+
previous.steps.push(step);
|
|
932
|
+
previous.afterHash = step.afterHash;
|
|
933
|
+
previous.updatedAt = createdAt;
|
|
934
|
+
return;
|
|
935
|
+
}
|
|
936
|
+
room.pendingEditSegments.push({
|
|
937
|
+
filePath,
|
|
938
|
+
authorId: connection.user.id,
|
|
939
|
+
kind,
|
|
940
|
+
beforeHash: step.beforeHash,
|
|
941
|
+
afterHash: step.afterHash,
|
|
942
|
+
createdAt,
|
|
943
|
+
updatedAt: createdAt,
|
|
944
|
+
steps: [step]
|
|
945
|
+
});
|
|
946
|
+
}
|
|
852
947
|
handleMessage(room, connection, bytes) {
|
|
853
|
-
const refreshedUser = this.
|
|
948
|
+
const refreshedUser = this.userByIdStatement.get(connection.user.id);
|
|
854
949
|
if (!refreshedUser || refreshedUser.disabled) {
|
|
855
950
|
connection.socket.close(1008, "Project access revoked");
|
|
856
951
|
this.disconnect(room, connection);
|
|
857
952
|
return;
|
|
858
953
|
}
|
|
859
954
|
connection.user = refreshedUser;
|
|
860
|
-
const current =
|
|
955
|
+
const current = this.lookupProjectAccess(room.projectId, refreshedUser);
|
|
861
956
|
if (!current) {
|
|
862
957
|
connection.socket.close(1008, "Project access revoked");
|
|
863
958
|
return;
|
|
@@ -1280,21 +1375,24 @@ export class CollaborationService {
|
|
|
1280
1375
|
if (room.saveTimer)
|
|
1281
1376
|
clearTimeout(room.saveTimer);
|
|
1282
1377
|
room.saveTimer = null;
|
|
1283
|
-
this.rejectOversizedTexts(room);
|
|
1378
|
+
const rejectedDuringFlush = this.rejectOversizedTexts(room);
|
|
1284
1379
|
this.persistRoomState(room);
|
|
1285
1380
|
let changed = false;
|
|
1286
1381
|
const changedPaths = [];
|
|
1287
1382
|
const failedPaths = [...room.rejectedPaths];
|
|
1383
|
+
const finalizedPaths = new Set(rejectedDuringFlush);
|
|
1288
1384
|
const dirtyPaths = [...room.dirtyPaths];
|
|
1289
1385
|
for (const filePath of dirtyPaths) {
|
|
1290
1386
|
if (!room.allowedPaths.has(filePath)) {
|
|
1291
1387
|
room.dirtyPaths.delete(filePath);
|
|
1388
|
+
finalizedPaths.add(filePath);
|
|
1292
1389
|
continue;
|
|
1293
1390
|
}
|
|
1294
1391
|
const next = this.trackedText(room, filePath).toString();
|
|
1295
1392
|
const previous = room.persistedContent.get(filePath) ?? "";
|
|
1296
1393
|
if (next === previous) {
|
|
1297
1394
|
room.dirtyPaths.delete(filePath);
|
|
1395
|
+
finalizedPaths.add(filePath);
|
|
1298
1396
|
continue;
|
|
1299
1397
|
}
|
|
1300
1398
|
if (Buffer.byteLength(next, "utf8") > maxCollaborativeFileBytes(this.config)) {
|
|
@@ -1321,6 +1419,7 @@ export class CollaborationService {
|
|
|
1321
1419
|
}
|
|
1322
1420
|
room.persistedContent.set(filePath, next);
|
|
1323
1421
|
room.dirtyPaths.delete(filePath);
|
|
1422
|
+
finalizedPaths.add(filePath);
|
|
1324
1423
|
try {
|
|
1325
1424
|
reanchorFileComments(this.db, room.projectId, filePath, previous, next);
|
|
1326
1425
|
}
|
|
@@ -1328,6 +1427,13 @@ export class CollaborationService {
|
|
|
1328
1427
|
changed = true;
|
|
1329
1428
|
changedPaths.push(filePath);
|
|
1330
1429
|
}
|
|
1430
|
+
const persistedPaths = new Set(changedPaths);
|
|
1431
|
+
const edits = room.pendingEditSegments.filter((segment) => persistedPaths.has(segment.filePath));
|
|
1432
|
+
// A reverted edit or rejected oversized file did not produce a durable
|
|
1433
|
+
// source revision, so it must not become a misleading edit-history row.
|
|
1434
|
+
if (finalizedPaths.size > 0) {
|
|
1435
|
+
room.pendingEditSegments = room.pendingEditSegments.filter((segment) => !finalizedPaths.has(segment.filePath));
|
|
1436
|
+
}
|
|
1331
1437
|
if (changed && room.lastModifiedUserId) {
|
|
1332
1438
|
this.db.prepare("UPDATE projects SET updated_at = ?, last_modified_by = ? WHERE id = ?")
|
|
1333
1439
|
.run(new Date().toISOString(), room.lastModifiedUserId, room.projectId);
|
|
@@ -1336,7 +1442,7 @@ export class CollaborationService {
|
|
|
1336
1442
|
this.signalComments(room.projectId);
|
|
1337
1443
|
if (changed && this.onPersist) {
|
|
1338
1444
|
try {
|
|
1339
|
-
this.onPersist({ projectId: room.projectId, userId: room.lastModifiedUserId, paths: changedPaths, durationMs: performance.now() - startedAt });
|
|
1445
|
+
this.onPersist({ projectId: room.projectId, userId: room.lastModifiedUserId, paths: changedPaths, edits, durationMs: performance.now() - startedAt });
|
|
1340
1446
|
}
|
|
1341
1447
|
catch { /* Source durability must not depend on optional history bookkeeping. */ }
|
|
1342
1448
|
}
|
|
@@ -1513,6 +1619,119 @@ function replaceText(text, content) {
|
|
|
1513
1619
|
if (content)
|
|
1514
1620
|
text.insert(0, content);
|
|
1515
1621
|
}
|
|
1622
|
+
/**
|
|
1623
|
+
* Turn Y.Text's transaction delta into compact positional spans. We retain
|
|
1624
|
+
* lengths for exact range mapping, while previews keep a pasted/formatter
|
|
1625
|
+
* change from turning the edit-history database into a second source store.
|
|
1626
|
+
*/
|
|
1627
|
+
function editSpansFromYDelta(delta, before, after) {
|
|
1628
|
+
if (before === after)
|
|
1629
|
+
return [];
|
|
1630
|
+
let beforeOffset = 0;
|
|
1631
|
+
let afterOffset = 0;
|
|
1632
|
+
let invalid = false;
|
|
1633
|
+
const spans = [];
|
|
1634
|
+
let pending = null;
|
|
1635
|
+
const flushPending = () => {
|
|
1636
|
+
if (!pending)
|
|
1637
|
+
return;
|
|
1638
|
+
const deletedLength = pending.deleted.length;
|
|
1639
|
+
const insertedLength = pending.inserted.length;
|
|
1640
|
+
if (deletedLength || insertedLength) {
|
|
1641
|
+
spans.push(editSpan(pending.beforeStart, pending.beforeStart + deletedLength, pending.afterStart, pending.afterStart + insertedLength, pending.deleted, pending.inserted));
|
|
1642
|
+
}
|
|
1643
|
+
pending = null;
|
|
1644
|
+
};
|
|
1645
|
+
const startPending = () => {
|
|
1646
|
+
if (!pending)
|
|
1647
|
+
pending = { beforeStart: beforeOffset, afterStart: afterOffset, deleted: "", inserted: "" };
|
|
1648
|
+
return pending;
|
|
1649
|
+
};
|
|
1650
|
+
for (const raw of delta) {
|
|
1651
|
+
if (!raw || typeof raw !== "object") {
|
|
1652
|
+
invalid = true;
|
|
1653
|
+
break;
|
|
1654
|
+
}
|
|
1655
|
+
const operation = raw;
|
|
1656
|
+
if (typeof operation.retain === "number" && Number.isInteger(operation.retain) && operation.retain >= 0) {
|
|
1657
|
+
flushPending();
|
|
1658
|
+
beforeOffset += operation.retain;
|
|
1659
|
+
afterOffset += operation.retain;
|
|
1660
|
+
continue;
|
|
1661
|
+
}
|
|
1662
|
+
if (typeof operation.delete === "number" && Number.isInteger(operation.delete) && operation.delete >= 0) {
|
|
1663
|
+
const length = operation.delete;
|
|
1664
|
+
if (beforeOffset + length > before.length) {
|
|
1665
|
+
invalid = true;
|
|
1666
|
+
break;
|
|
1667
|
+
}
|
|
1668
|
+
startPending().deleted += before.slice(beforeOffset, beforeOffset + length);
|
|
1669
|
+
beforeOffset += length;
|
|
1670
|
+
continue;
|
|
1671
|
+
}
|
|
1672
|
+
if (typeof operation.insert === "string") {
|
|
1673
|
+
startPending().inserted += operation.insert;
|
|
1674
|
+
afterOffset += operation.insert.length;
|
|
1675
|
+
continue;
|
|
1676
|
+
}
|
|
1677
|
+
invalid = true;
|
|
1678
|
+
break;
|
|
1679
|
+
}
|
|
1680
|
+
flushPending();
|
|
1681
|
+
// Yjs normally emits retains for all unchanged text. Be defensive about
|
|
1682
|
+
// omitted trailing retains, then reject anything whose coordinate model does
|
|
1683
|
+
// not reconstruct the actual strings.
|
|
1684
|
+
const beforeRemaining = before.length - beforeOffset;
|
|
1685
|
+
const afterRemaining = after.length - afterOffset;
|
|
1686
|
+
if (beforeRemaining === afterRemaining && beforeRemaining >= 0) {
|
|
1687
|
+
beforeOffset = before.length;
|
|
1688
|
+
afterOffset = after.length;
|
|
1689
|
+
}
|
|
1690
|
+
if (invalid || beforeOffset !== before.length || afterOffset !== after.length || spans.length > MAX_EDIT_SPANS_PER_STEP) {
|
|
1691
|
+
return [wholeDocumentEditSpan(before, after)];
|
|
1692
|
+
}
|
|
1693
|
+
return spans.length ? spans : [wholeDocumentEditSpan(before, after)];
|
|
1694
|
+
}
|
|
1695
|
+
function wholeDocumentEditSpan(before, after) {
|
|
1696
|
+
const prefix = commonPrefixLength(before, after);
|
|
1697
|
+
const suffix = commonSuffixLength(before, after, prefix);
|
|
1698
|
+
return editSpan(prefix, before.length - suffix, prefix, after.length - suffix, before.slice(prefix, before.length - suffix), after.slice(prefix, after.length - suffix));
|
|
1699
|
+
}
|
|
1700
|
+
function editSpan(beforeStart, beforeEnd, afterStart, afterEnd, deleted, inserted) {
|
|
1701
|
+
const deletedPreview = previewEditText(deleted);
|
|
1702
|
+
const insertedPreview = previewEditText(inserted);
|
|
1703
|
+
return {
|
|
1704
|
+
beforeStart,
|
|
1705
|
+
beforeEnd,
|
|
1706
|
+
afterStart,
|
|
1707
|
+
afterEnd,
|
|
1708
|
+
deletedLength: deleted.length,
|
|
1709
|
+
insertedLength: inserted.length,
|
|
1710
|
+
deletedPreview,
|
|
1711
|
+
insertedPreview,
|
|
1712
|
+
truncated: deletedPreview.length < deleted.length || insertedPreview.length < inserted.length
|
|
1713
|
+
};
|
|
1714
|
+
}
|
|
1715
|
+
function previewEditText(value) {
|
|
1716
|
+
if (value.length <= MAX_EDIT_PREVIEW_CHARS)
|
|
1717
|
+
return value;
|
|
1718
|
+
const edge = Math.floor((MAX_EDIT_PREVIEW_CHARS - 1) / 2);
|
|
1719
|
+
return `${value.slice(0, edge)}…${value.slice(value.length - edge)}`;
|
|
1720
|
+
}
|
|
1721
|
+
function commonPrefixLength(left, right) {
|
|
1722
|
+
const max = Math.min(left.length, right.length);
|
|
1723
|
+
let index = 0;
|
|
1724
|
+
while (index < max && left.charCodeAt(index) === right.charCodeAt(index))
|
|
1725
|
+
index += 1;
|
|
1726
|
+
return index;
|
|
1727
|
+
}
|
|
1728
|
+
function commonSuffixLength(left, right, prefixLength) {
|
|
1729
|
+
const max = Math.min(left.length, right.length) - prefixLength;
|
|
1730
|
+
let index = 0;
|
|
1731
|
+
while (index < max && left.charCodeAt(left.length - 1 - index) === right.charCodeAt(right.length - 1 - index))
|
|
1732
|
+
index += 1;
|
|
1733
|
+
return index;
|
|
1734
|
+
}
|
|
1516
1735
|
function syncUpdateMessage(update) {
|
|
1517
1736
|
const encoder = encoding.createEncoder();
|
|
1518
1737
|
encoding.writeVarUint(encoder, MESSAGE_SYNC);
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* List active users who can access a project. The owner is included even
|
|
4
|
+
* though they have no project_members row. Callers can exclude the author
|
|
5
|
+
* when presenting a mention picker.
|
|
6
|
+
*/
|
|
7
|
+
export function mentionableUsersForProject(db, projectId, excludeUserId) {
|
|
8
|
+
const exclusion = excludeUserId ? "AND user.id <> ?" : "";
|
|
9
|
+
const parameters = excludeUserId ? [projectId, excludeUserId] : [projectId];
|
|
10
|
+
const rows = db.prepare(`SELECT DISTINCT user.id, user.username, user.display_name
|
|
11
|
+
FROM users user
|
|
12
|
+
JOIN projects project ON project.id = ?
|
|
13
|
+
LEFT JOIN project_members member ON member.project_id = project.id AND member.user_id = user.id
|
|
14
|
+
WHERE user.disabled = 0
|
|
15
|
+
AND (user.id = project.owner_id OR member.user_id IS NOT NULL)
|
|
16
|
+
${exclusion}
|
|
17
|
+
ORDER BY user.display_name COLLATE NOCASE, user.username COLLATE NOCASE`)
|
|
18
|
+
.all(...parameters);
|
|
19
|
+
return rows.map((user) => ({ id: user.id, username: user.username, displayName: user.display_name }));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract mention tokens without taking ownership of ordinary `@` text.
|
|
23
|
+
* The surrounding-character rule intentionally excludes e-mail addresses;
|
|
24
|
+
* the candidate lookup below then makes a token a mention only when it is an
|
|
25
|
+
* exact, currently accessible username.
|
|
26
|
+
*/
|
|
27
|
+
export function mentionedUsernames(content, candidates) {
|
|
28
|
+
const available = new Map(candidates.map((candidate) => [candidate.username.toLocaleLowerCase(), candidate.username]));
|
|
29
|
+
const usernames = new Set();
|
|
30
|
+
const pattern = /(^|[^\p{L}\p{N}_.-])@([\p{L}\p{N}_.-]+)/gu;
|
|
31
|
+
for (const match of content.matchAll(pattern)) {
|
|
32
|
+
let token = match[2];
|
|
33
|
+
let username = available.get(token.toLocaleLowerCase());
|
|
34
|
+
// A sentence-ending period or comma is not part of the mention, even
|
|
35
|
+
// though a username itself is allowed to contain dots and hyphens.
|
|
36
|
+
while (!username && /[.,;:!?)}\]\u201d\u2019]$/u.test(token)) {
|
|
37
|
+
token = token.slice(0, -1);
|
|
38
|
+
username = available.get(token.toLocaleLowerCase());
|
|
39
|
+
}
|
|
40
|
+
if (username)
|
|
41
|
+
usernames.add(username);
|
|
42
|
+
}
|
|
43
|
+
return [...usernames];
|
|
44
|
+
}
|
|
45
|
+
/** Persist first-class notifications for exact mentions in one comment item. */
|
|
46
|
+
export function createCommentMentions(db, input) {
|
|
47
|
+
const candidates = mentionableUsersForProject(db, input.projectId);
|
|
48
|
+
const previousUsernames = new Set(input.previousContent ? mentionedUsernames(input.previousContent, candidates) : []);
|
|
49
|
+
const recipients = mentionedUsernames(input.content, candidates)
|
|
50
|
+
.map((username) => candidates.find((candidate) => candidate.username === username))
|
|
51
|
+
.filter((candidate) => Boolean(candidate && candidate.id !== input.authorId && !previousUsernames.has(candidate.username)));
|
|
52
|
+
if (!recipients.length)
|
|
53
|
+
return;
|
|
54
|
+
const insert = db.prepare(`INSERT INTO comment_mentions
|
|
55
|
+
(id, project_id, comment_id, reply_id, mentioned_user_id, mentioned_by_user_id, created_at)
|
|
56
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
57
|
+
ON CONFLICT DO UPDATE SET
|
|
58
|
+
mentioned_by_user_id = excluded.mentioned_by_user_id,
|
|
59
|
+
created_at = excluded.created_at,
|
|
60
|
+
read_at = NULL,
|
|
61
|
+
read_reason = NULL`);
|
|
62
|
+
for (const recipient of recipients) {
|
|
63
|
+
insert.run(randomUUID(), input.projectId, input.commentId, input.replyId ?? null, recipient.id, input.authorId, input.createdAt);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Return unread mention counts scoped to one receiving user. */
|
|
67
|
+
export function unreadMentionCountsForProjects(db, projectIds, userId) {
|
|
68
|
+
const counts = new Map();
|
|
69
|
+
for (let offset = 0; offset < projectIds.length; offset += 200) {
|
|
70
|
+
const chunk = projectIds.slice(offset, offset + 200);
|
|
71
|
+
const placeholders = chunk.map(() => "?").join(", ");
|
|
72
|
+
const rows = db.prepare(`SELECT project_id, COUNT(*) AS count
|
|
73
|
+
FROM comment_mentions
|
|
74
|
+
WHERE mentioned_user_id = ? AND read_at IS NULL AND project_id IN (${placeholders})
|
|
75
|
+
GROUP BY project_id`).all(userId, ...chunk);
|
|
76
|
+
for (const row of rows)
|
|
77
|
+
counts.set(row.project_id, Number(row.count) || 0);
|
|
78
|
+
}
|
|
79
|
+
return counts;
|
|
80
|
+
}
|
|
81
|
+
function mentionFromRow(row) {
|
|
82
|
+
return {
|
|
83
|
+
id: row.id,
|
|
84
|
+
projectId: row.project_id,
|
|
85
|
+
commentId: row.comment_id,
|
|
86
|
+
replyId: row.reply_id,
|
|
87
|
+
filePath: row.file_path,
|
|
88
|
+
content: row.reply_id ? row.reply_content ?? "" : row.comment_content,
|
|
89
|
+
resolved: Boolean(row.resolved),
|
|
90
|
+
createdAt: row.created_at,
|
|
91
|
+
readAt: row.read_at,
|
|
92
|
+
readReason: row.read_reason
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const mentionSelect = `SELECT mention.id, mention.project_id, mention.comment_id, mention.reply_id,
|
|
96
|
+
comment.file_path, comment.content AS comment_content, reply.content AS reply_content,
|
|
97
|
+
comment.resolved, mention.created_at, mention.read_at, mention.read_reason
|
|
98
|
+
FROM comment_mentions mention
|
|
99
|
+
JOIN comments comment ON comment.id = mention.comment_id
|
|
100
|
+
LEFT JOIN comment_replies reply ON reply.id = mention.reply_id`;
|
|
101
|
+
export function listCommentMentions(db, projectId, userId, options = {}) {
|
|
102
|
+
const limit = Math.min(100, Math.max(1, options.limit ?? 50));
|
|
103
|
+
const unreadClause = options.unreadOnly ? "AND mention.read_at IS NULL" : "";
|
|
104
|
+
const fileClause = options.filePath ? "AND comment.file_path = ?" : "";
|
|
105
|
+
const parameters = options.filePath
|
|
106
|
+
? [projectId, userId, options.filePath, limit]
|
|
107
|
+
: [projectId, userId, limit];
|
|
108
|
+
const rows = db.prepare(`${mentionSelect}
|
|
109
|
+
WHERE mention.project_id = ? AND mention.mentioned_user_id = ? ${unreadClause} ${fileClause}
|
|
110
|
+
ORDER BY mention.created_at DESC LIMIT ?`).all(...parameters);
|
|
111
|
+
return rows.map(mentionFromRow);
|
|
112
|
+
}
|
|
113
|
+
export function commentMentionForUser(db, mentionId, projectId, userId) {
|
|
114
|
+
const row = db.prepare(`${mentionSelect}
|
|
115
|
+
WHERE mention.id = ? AND mention.project_id = ? AND mention.mentioned_user_id = ?`)
|
|
116
|
+
.get(mentionId, projectId, userId);
|
|
117
|
+
return row ? mentionFromRow(row) : null;
|
|
118
|
+
}
|
|
119
|
+
/** Mark an item read after the UI has opened and located its target thread. */
|
|
120
|
+
export function markCommentMentionRead(db, mentionId, userId, readAt, reason = "opened") {
|
|
121
|
+
return db.prepare(`UPDATE comment_mentions
|
|
122
|
+
SET read_at = ?, read_reason = ?
|
|
123
|
+
WHERE id = ? AND mentioned_user_id = ? AND read_at IS NULL`)
|
|
124
|
+
.run(readAt, reason, mentionId, userId).changes > 0;
|
|
125
|
+
}
|
|
126
|
+
/** Explicitly clear every unread notification in a project for one recipient. */
|
|
127
|
+
export function markAllCommentMentionsRead(db, projectId, userId, readAt) {
|
|
128
|
+
return db.prepare(`UPDATE comment_mentions
|
|
129
|
+
SET read_at = ?, read_reason = 'manual'
|
|
130
|
+
WHERE project_id = ? AND mentioned_user_id = ? AND read_at IS NULL`)
|
|
131
|
+
.run(readAt, projectId, userId).changes;
|
|
132
|
+
}
|
|
133
|
+
/** Resolving a thread makes all existing unread mentions in it non-actionable. */
|
|
134
|
+
export function markCommentMentionsResolved(db, commentId, resolvedAt) {
|
|
135
|
+
return db.prepare(`UPDATE comment_mentions
|
|
136
|
+
SET read_at = ?, read_reason = 'resolved'
|
|
137
|
+
WHERE comment_id = ? AND read_at IS NULL`)
|
|
138
|
+
.run(resolvedAt, commentId).changes;
|
|
139
|
+
}
|