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/config.js
CHANGED
|
@@ -22,8 +22,9 @@ export const CONFIG_DEFAULTS = {
|
|
|
22
22
|
maxFileSizeMB: 50,
|
|
23
23
|
pdfLoadingStrategy: "auto",
|
|
24
24
|
pdfRangeThresholdMB: 5,
|
|
25
|
-
historyMaxVersions:
|
|
25
|
+
historyMaxVersions: 0,
|
|
26
26
|
historyMaxStorageMB: 128,
|
|
27
|
+
editHistoryMaxStorageMB: 32,
|
|
27
28
|
git: "git",
|
|
28
29
|
gitOperationTimeoutSeconds: 120,
|
|
29
30
|
githubApiBaseUrl: "https://api.github.com"
|
|
@@ -35,8 +36,9 @@ const CONFIG_LIMITS = {
|
|
|
35
36
|
maxCompileJobs: [1, 32],
|
|
36
37
|
maxFileSizeMB: [1, 2_048],
|
|
37
38
|
pdfRangeThresholdMB: [1, 2_048],
|
|
38
|
-
historyMaxVersions: [
|
|
39
|
+
historyMaxVersions: [0, 50_000],
|
|
39
40
|
historyMaxStorageMB: [16, 102_400],
|
|
41
|
+
editHistoryMaxStorageMB: [4, 102_400],
|
|
40
42
|
gitOperationTimeoutSeconds: [1, 3_600]
|
|
41
43
|
};
|
|
42
44
|
export function loadConfig(configPathOverride) {
|
|
@@ -70,6 +72,7 @@ export function loadConfig(configPathOverride) {
|
|
|
70
72
|
const pdfRangeThresholdMB = integerSetting("pdf.rangeThresholdMB", process.env.TEXLITE_PDF_RANGE_THRESHOLD_MB, fileConfig.pdf?.rangeThresholdMB, CONFIG_DEFAULTS.pdfRangeThresholdMB, CONFIG_LIMITS.pdfRangeThresholdMB);
|
|
71
73
|
const historyMaxVersions = integerSetting("history.maxVersions", process.env.TEXLITE_HISTORY_MAX_VERSIONS, fileConfig.history?.maxVersions, CONFIG_DEFAULTS.historyMaxVersions, CONFIG_LIMITS.historyMaxVersions);
|
|
72
74
|
const historyMaxStorageMB = integerSetting("history.maxStorageMB", process.env.TEXLITE_HISTORY_MAX_STORAGE_MB, fileConfig.history?.maxStorageMB, CONFIG_DEFAULTS.historyMaxStorageMB, CONFIG_LIMITS.historyMaxStorageMB);
|
|
75
|
+
const editHistoryMaxStorageMB = integerSetting("editHistory.maxStorageMB", process.env.TEXLITE_EDIT_HISTORY_MAX_STORAGE_MB, fileConfig.editHistory?.maxStorageMB, CONFIG_DEFAULTS.editHistoryMaxStorageMB, CONFIG_LIMITS.editHistoryMaxStorageMB);
|
|
73
76
|
const gitOperationTimeoutSeconds = integerSetting("git.operationTimeoutSeconds", process.env.TEXLITE_GIT_TIMEOUT, fileConfig.git?.operationTimeoutSeconds, CONFIG_DEFAULTS.gitOperationTimeoutSeconds, CONFIG_LIMITS.gitOperationTimeoutSeconds);
|
|
74
77
|
const config = {
|
|
75
78
|
configPath,
|
|
@@ -94,6 +97,7 @@ export function loadConfig(configPathOverride) {
|
|
|
94
97
|
pdfRangeThresholdBytes: pdfRangeThresholdMB * 1024 * 1024,
|
|
95
98
|
historyMaxVersions,
|
|
96
99
|
historyMaxStorageBytes: historyMaxStorageMB * 1024 * 1024,
|
|
100
|
+
editHistoryMaxStorageBytes: editHistoryMaxStorageMB * 1024 * 1024,
|
|
97
101
|
git: stringSetting("git.binary", process.env.TEXLITE_GIT, fileConfig.git?.binary, CONFIG_DEFAULTS.git, { min: 1, max: 256 }),
|
|
98
102
|
gitOperationTimeoutMs: gitOperationTimeoutSeconds * 1000,
|
|
99
103
|
githubApiBaseUrl: stringSetting("git.githubApiBaseUrl", process.env.TEXLITE_GITHUB_API_URL, fileConfig.git?.githubApiBaseUrl, CONFIG_DEFAULTS.githubApiBaseUrl, { min: 1, max: 2_048 }).replace(/\/+$/, "")
|
|
@@ -132,6 +136,7 @@ export function validateConfig(config) {
|
|
|
132
136
|
validateInteger("pdf.rangeThresholdMB", config.pdfRangeThresholdBytes / (1024 * 1024), CONFIG_LIMITS.pdfRangeThresholdMB);
|
|
133
137
|
validateInteger("history.maxVersions", config.historyMaxVersions, CONFIG_LIMITS.historyMaxVersions);
|
|
134
138
|
validateInteger("history.maxStorageMB", config.historyMaxStorageBytes / (1024 * 1024), CONFIG_LIMITS.historyMaxStorageMB);
|
|
139
|
+
validateInteger("editHistory.maxStorageMB", config.editHistoryMaxStorageBytes / (1024 * 1024), CONFIG_LIMITS.editHistoryMaxStorageMB);
|
|
135
140
|
validateInteger("git.operationTimeoutSeconds", config.gitOperationTimeoutMs / 1000, CONFIG_LIMITS.gitOperationTimeoutSeconds);
|
|
136
141
|
}
|
|
137
142
|
function isEngine(value) {
|
|
@@ -176,6 +181,8 @@ function validateFileConfig(config) {
|
|
|
176
181
|
const history = optionalSection(config.history, "history");
|
|
177
182
|
optionalInteger(history?.maxVersions, "history.maxVersions", CONFIG_LIMITS.historyMaxVersions);
|
|
178
183
|
optionalInteger(history?.maxStorageMB, "history.maxStorageMB", CONFIG_LIMITS.historyMaxStorageMB);
|
|
184
|
+
const editHistory = optionalSection(config.editHistory, "editHistory");
|
|
185
|
+
optionalInteger(editHistory?.maxStorageMB, "editHistory.maxStorageMB", CONFIG_LIMITS.editHistoryMaxStorageMB);
|
|
179
186
|
const latex = optionalSection(config.latex, "latex");
|
|
180
187
|
optionalString(latex?.latexmk, "latex.latexmk", { min: 1, max: 256 });
|
|
181
188
|
if (latex && Object.prototype.hasOwnProperty.call(latex, "defaultEngine") && !isEngine(latex.defaultEngine)) {
|
package/dist/server/db.js
CHANGED
|
@@ -4,7 +4,10 @@ export function openDatabase(config) {
|
|
|
4
4
|
fs.mkdirSync(config.dataDir, { recursive: true, mode: 0o700 });
|
|
5
5
|
fs.mkdirSync(config.projectsDir, { recursive: true, mode: 0o700 });
|
|
6
6
|
const db = new Database(config.databasePath, { timeout: 5000 });
|
|
7
|
-
|
|
7
|
+
// WAL allows readers to proceed while writes are committed. NORMAL avoids a
|
|
8
|
+
// per-transaction WAL fsync: a sudden host failure can lose the most recent
|
|
9
|
+
// acknowledged transaction, but the database remains consistent.
|
|
10
|
+
db.exec("PRAGMA foreign_keys = ON; PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL; PRAGMA busy_timeout = 5000;");
|
|
8
11
|
migrate(db);
|
|
9
12
|
return db;
|
|
10
13
|
}
|
|
@@ -140,6 +143,27 @@ function migrate(db) {
|
|
|
140
143
|
);
|
|
141
144
|
CREATE INDEX IF NOT EXISTS comment_replies_comment_id ON comment_replies(comment_id, created_at);
|
|
142
145
|
|
|
146
|
+
-- Mentions are personal notification records, rather than a mutable
|
|
147
|
+
-- counter on comments or projects. This makes unread state naturally
|
|
148
|
+
-- per user and lets resolving one thread clear its existing notifications.
|
|
149
|
+
CREATE TABLE IF NOT EXISTS comment_mentions (
|
|
150
|
+
id TEXT PRIMARY KEY,
|
|
151
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
152
|
+
comment_id TEXT NOT NULL REFERENCES comments(id) ON DELETE CASCADE,
|
|
153
|
+
reply_id TEXT REFERENCES comment_replies(id) ON DELETE CASCADE,
|
|
154
|
+
mentioned_user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
155
|
+
mentioned_by_user_id TEXT REFERENCES users(id) ON DELETE SET NULL,
|
|
156
|
+
read_at TEXT,
|
|
157
|
+
read_reason TEXT CHECK (read_reason IN ('opened', 'resolved', 'manual')),
|
|
158
|
+
created_at TEXT NOT NULL
|
|
159
|
+
);
|
|
160
|
+
CREATE INDEX IF NOT EXISTS comment_mentions_receiver_unread
|
|
161
|
+
ON comment_mentions(mentioned_user_id, project_id, created_at DESC)
|
|
162
|
+
WHERE read_at IS NULL;
|
|
163
|
+
CREATE INDEX IF NOT EXISTS comment_mentions_comment_id ON comment_mentions(comment_id);
|
|
164
|
+
CREATE UNIQUE INDEX IF NOT EXISTS comment_mentions_source_recipient
|
|
165
|
+
ON comment_mentions(comment_id, IFNULL(reply_id, ''), mentioned_user_id);
|
|
166
|
+
|
|
143
167
|
CREATE TABLE IF NOT EXISTS compile_runs (
|
|
144
168
|
id TEXT PRIMARY KEY,
|
|
145
169
|
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
@@ -171,6 +195,37 @@ function migrate(db) {
|
|
|
171
195
|
updated_at TEXT NOT NULL
|
|
172
196
|
);
|
|
173
197
|
|
|
198
|
+
-- Recovery snapshots and collaborative edit records serve different
|
|
199
|
+
-- purposes. Snapshots are content-addressed restore points; these rows
|
|
200
|
+
-- retain the ordered, author-attributed text changes that led to the
|
|
201
|
+
-- current source, so a selected range can show who changed it.
|
|
202
|
+
CREATE TABLE IF NOT EXISTS project_edit_segments (
|
|
203
|
+
id TEXT PRIMARY KEY,
|
|
204
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
205
|
+
file_path TEXT NOT NULL,
|
|
206
|
+
author_id TEXT REFERENCES users(id) ON DELETE SET NULL,
|
|
207
|
+
kind TEXT NOT NULL CHECK (kind IN ('edit', 'format')),
|
|
208
|
+
before_hash TEXT NOT NULL,
|
|
209
|
+
after_hash TEXT NOT NULL,
|
|
210
|
+
steps_json TEXT NOT NULL,
|
|
211
|
+
steps_bytes INTEGER NOT NULL DEFAULT 0,
|
|
212
|
+
created_at TEXT NOT NULL,
|
|
213
|
+
updated_at TEXT NOT NULL
|
|
214
|
+
);
|
|
215
|
+
CREATE INDEX IF NOT EXISTS project_edit_segments_project_file_updated
|
|
216
|
+
ON project_edit_segments(project_id, file_path, updated_at DESC);
|
|
217
|
+
|
|
218
|
+
-- Records the newest missing delta per file after retention drops an edit
|
|
219
|
+
-- segment. Selection history uses it to stop at a known boundary instead
|
|
220
|
+
-- of presenting an incomplete attribution as a full edit trail.
|
|
221
|
+
CREATE TABLE IF NOT EXISTS project_edit_history_boundaries (
|
|
222
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
223
|
+
file_path TEXT NOT NULL,
|
|
224
|
+
after_hash TEXT NOT NULL,
|
|
225
|
+
updated_at TEXT NOT NULL,
|
|
226
|
+
PRIMARY KEY (project_id, file_path)
|
|
227
|
+
);
|
|
228
|
+
|
|
174
229
|
CREATE TABLE IF NOT EXISTS project_dictionary_words (
|
|
175
230
|
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
176
231
|
word TEXT NOT NULL COLLATE NOCASE,
|
|
@@ -225,6 +280,13 @@ function migrate(db) {
|
|
|
225
280
|
updated_at TEXT NOT NULL
|
|
226
281
|
);
|
|
227
282
|
`);
|
|
283
|
+
const editColumns = db.prepare("PRAGMA table_info(project_edit_segments)").all();
|
|
284
|
+
if (!editColumns.some((column) => column.name === "steps_bytes")) {
|
|
285
|
+
db.transaction(() => {
|
|
286
|
+
db.exec("ALTER TABLE project_edit_segments ADD COLUMN steps_bytes INTEGER NOT NULL DEFAULT 0");
|
|
287
|
+
db.exec("UPDATE project_edit_segments SET steps_bytes = LENGTH(CAST(steps_json AS BLOB))");
|
|
288
|
+
})();
|
|
289
|
+
}
|
|
228
290
|
const projectColumns = db.prepare("PRAGMA table_info(projects)").all();
|
|
229
291
|
if (!projectColumns.some((column) => column.name === "latexmkrc")) {
|
|
230
292
|
db.exec("ALTER TABLE projects ADD COLUMN latexmkrc TEXT");
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { safeRelativePath } from "./files.js";
|
|
3
|
+
const MAX_SEGMENTS_PER_PROJECT = 5_000;
|
|
4
|
+
const MAX_SEGMENTS_TO_SCAN = MAX_SEGMENTS_PER_PROJECT;
|
|
5
|
+
const DEFAULT_RESULT_LIMIT = 60;
|
|
6
|
+
const EDIT_SESSION_GAP_MS = 2 * 60 * 1_000;
|
|
7
|
+
const MAX_PASSAGE_PREVIEW_CHARS = 6_000;
|
|
8
|
+
export const DEFAULT_EDIT_HISTORY_MAX_STORAGE_BYTES = 32 * 1024 * 1024;
|
|
9
|
+
/**
|
|
10
|
+
* Stores author-isolated collaboration edits independently from retained
|
|
11
|
+
* project snapshots. A segment is a short, contiguous run from one user and
|
|
12
|
+
* one file; its steps remain ordered so selection mapping remains exact.
|
|
13
|
+
*/
|
|
14
|
+
export class ProjectEditHistoryService {
|
|
15
|
+
db;
|
|
16
|
+
maxStorageBytes;
|
|
17
|
+
constructor(db, maxStorageBytes = DEFAULT_EDIT_HISTORY_MAX_STORAGE_BYTES) {
|
|
18
|
+
this.db = db;
|
|
19
|
+
this.maxStorageBytes = normalizeStorageLimit(maxStorageBytes);
|
|
20
|
+
}
|
|
21
|
+
record(projectId, inputs) {
|
|
22
|
+
const normalized = inputs
|
|
23
|
+
.map(normalizeSegment)
|
|
24
|
+
.filter((segment) => segment !== null);
|
|
25
|
+
if (!normalized.length)
|
|
26
|
+
return;
|
|
27
|
+
const segments = [];
|
|
28
|
+
const skipped = [];
|
|
29
|
+
for (const segment of normalized) {
|
|
30
|
+
const stepsJson = JSON.stringify(segment.steps);
|
|
31
|
+
const stepsBytes = Buffer.byteLength(stepsJson, "utf8");
|
|
32
|
+
// A single oversized burst would make the quota ineffective. Dropping it
|
|
33
|
+
// creates an explicit, safe history boundary rather than retaining a
|
|
34
|
+
// partial delta that could misattribute an older selection.
|
|
35
|
+
if (stepsBytes > this.maxStorageBytes)
|
|
36
|
+
skipped.push(segment);
|
|
37
|
+
else
|
|
38
|
+
segments.push({ segment, stepsJson, stepsBytes });
|
|
39
|
+
}
|
|
40
|
+
const insert = this.db.prepare(`INSERT INTO project_edit_segments
|
|
41
|
+
(id, project_id, file_path, author_id, kind, before_hash, after_hash, steps_json, created_at, updated_at, steps_bytes)
|
|
42
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
43
|
+
this.db.transaction(() => {
|
|
44
|
+
for (const { segment, stepsJson, stepsBytes } of segments) {
|
|
45
|
+
insert.run(randomUUID(), projectId, segment.filePath, segment.authorId, segment.kind, segment.beforeHash, segment.afterHash, stepsJson, segment.createdAt, segment.updatedAt, stepsBytes);
|
|
46
|
+
}
|
|
47
|
+
for (const segment of skipped)
|
|
48
|
+
this.recordRetentionBoundary(projectId, segment.filePath, segment.afterHash, segment.updatedAt);
|
|
49
|
+
this.prune(projectId);
|
|
50
|
+
})();
|
|
51
|
+
}
|
|
52
|
+
/** Logical edit payload; shared SQLite pages and indexes are not included. */
|
|
53
|
+
stats(projectId) {
|
|
54
|
+
const row = this.db.prepare(`SELECT COUNT(*) AS segmentCount,
|
|
55
|
+
COALESCE(SUM(steps_bytes), 0) AS payloadBytes
|
|
56
|
+
FROM project_edit_segments WHERE project_id = ?`).get(projectId);
|
|
57
|
+
return { ...row, maxStorageBytes: this.maxStorageBytes };
|
|
58
|
+
}
|
|
59
|
+
clear(projectId) {
|
|
60
|
+
this.db.transaction(() => {
|
|
61
|
+
this.db.prepare("DELETE FROM project_edit_segments WHERE project_id = ?").run(projectId);
|
|
62
|
+
this.db.prepare("DELETE FROM project_edit_history_boundaries WHERE project_id = ?").run(projectId);
|
|
63
|
+
})();
|
|
64
|
+
}
|
|
65
|
+
/** Apply a changed storage setting to retained records during startup. */
|
|
66
|
+
enforceRetention(projectId) {
|
|
67
|
+
this.db.transaction(() => this.prune(projectId))();
|
|
68
|
+
}
|
|
69
|
+
/** Keep the newest contiguous suffix within both record and payload limits. */
|
|
70
|
+
prune(projectId) {
|
|
71
|
+
const rows = this.db.prepare(`SELECT id, file_path, after_hash, updated_at, steps_bytes
|
|
72
|
+
FROM project_edit_segments WHERE project_id = ?
|
|
73
|
+
ORDER BY updated_at DESC, rowid DESC`).all(projectId);
|
|
74
|
+
let retainedBytes = 0;
|
|
75
|
+
let retainedCount = 0;
|
|
76
|
+
let firstDiscard = rows.length;
|
|
77
|
+
for (let index = 0; index < rows.length; index += 1) {
|
|
78
|
+
const size = Math.max(0, Number(rows[index].steps_bytes) || 0);
|
|
79
|
+
if (retainedCount >= MAX_SEGMENTS_PER_PROJECT || retainedBytes + size > this.maxStorageBytes) {
|
|
80
|
+
firstDiscard = index;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
retainedBytes += size;
|
|
84
|
+
retainedCount += 1;
|
|
85
|
+
}
|
|
86
|
+
if (firstDiscard === rows.length)
|
|
87
|
+
return;
|
|
88
|
+
const remove = this.db.prepare("DELETE FROM project_edit_segments WHERE id = ?");
|
|
89
|
+
const boundaryFiles = new Set();
|
|
90
|
+
for (const row of rows.slice(firstDiscard)) {
|
|
91
|
+
// Rows are newest first. The first discarded row for a source file is
|
|
92
|
+
// precisely where a backward selection map must stop.
|
|
93
|
+
if (!boundaryFiles.has(row.file_path)) {
|
|
94
|
+
boundaryFiles.add(row.file_path);
|
|
95
|
+
this.recordRetentionBoundary(projectId, row.file_path, row.after_hash, row.updated_at);
|
|
96
|
+
}
|
|
97
|
+
remove.run(row.id);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
recordRetentionBoundary(projectId, filePath, afterHash, updatedAt) {
|
|
101
|
+
this.db.prepare(`INSERT INTO project_edit_history_boundaries (project_id, file_path, after_hash, updated_at)
|
|
102
|
+
VALUES (?, ?, ?, ?)
|
|
103
|
+
ON CONFLICT(project_id, file_path) DO UPDATE SET after_hash = excluded.after_hash, updated_at = excluded.updated_at`)
|
|
104
|
+
.run(projectId, filePath, afterHash, updatedAt);
|
|
105
|
+
}
|
|
106
|
+
selectionHistory(projectId, filePathInput, currentSource, startInput, endInput, resultLimit = DEFAULT_RESULT_LIMIT) {
|
|
107
|
+
const filePath = safeRelativePath(filePathInput);
|
|
108
|
+
const start = clamp(Math.min(startInput, endInput), 0, currentSource.length);
|
|
109
|
+
const end = clamp(Math.max(startInput, endInput), start, currentSource.length);
|
|
110
|
+
const rows = this.db.prepare(`SELECT segment.*, user.username AS author_username, user.display_name AS author_name
|
|
111
|
+
FROM project_edit_segments segment LEFT JOIN users user ON user.id = segment.author_id
|
|
112
|
+
WHERE segment.project_id = ? AND segment.file_path = ?
|
|
113
|
+
ORDER BY segment.updated_at DESC, segment.rowid DESC LIMIT ?`)
|
|
114
|
+
.all(projectId, filePath, MAX_SEGMENTS_TO_SCAN);
|
|
115
|
+
const entries = [];
|
|
116
|
+
let passage = {
|
|
117
|
+
range: { start, end },
|
|
118
|
+
text: currentSource.slice(start, end),
|
|
119
|
+
exact: true
|
|
120
|
+
};
|
|
121
|
+
let openEntry = null;
|
|
122
|
+
let expectedHash = hashText(currentSource);
|
|
123
|
+
let chainComplete = true;
|
|
124
|
+
let exhaustedRows = true;
|
|
125
|
+
let baseline = null;
|
|
126
|
+
const limit = clamp(resultLimit, 1, DEFAULT_RESULT_LIMIT);
|
|
127
|
+
for (const row of rows) {
|
|
128
|
+
// A direct file replacement, restoration, import, or retained-history
|
|
129
|
+
// pruning can intentionally create a gap. Never guess across it: doing
|
|
130
|
+
// so would attribute someone else's text to the wrong user.
|
|
131
|
+
if (row.after_hash !== expectedHash) {
|
|
132
|
+
chainComplete = false;
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
const steps = parseSteps(row.steps_json);
|
|
136
|
+
if (!steps.length) {
|
|
137
|
+
chainComplete = false;
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
let relevant = false;
|
|
141
|
+
let valid = true;
|
|
142
|
+
const afterPassage = passage;
|
|
143
|
+
const afterHash = expectedHash;
|
|
144
|
+
for (let index = steps.length - 1; index >= 0; index -= 1) {
|
|
145
|
+
const step = steps[index];
|
|
146
|
+
if (step.afterHash !== expectedHash) {
|
|
147
|
+
valid = false;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
const beforeRange = mapRangeBackward(passage.range, step.spans);
|
|
151
|
+
const relevantSpans = step.spans.filter((span) => spanIntersectsRange(span, passage.range, beforeRange));
|
|
152
|
+
if (relevantSpans.length)
|
|
153
|
+
relevant = true;
|
|
154
|
+
passage = undoPassage(passage, beforeRange, relevantSpans);
|
|
155
|
+
expectedHash = step.beforeHash;
|
|
156
|
+
}
|
|
157
|
+
if (!valid || expectedHash !== row.before_hash) {
|
|
158
|
+
passage = afterPassage;
|
|
159
|
+
expectedHash = afterHash;
|
|
160
|
+
chainComplete = false;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
if (relevant) {
|
|
164
|
+
if (openEntry && (canMergeIntoEntry(openEntry, row) || hasSameSelectionContent(openEntry, afterPassage))) {
|
|
165
|
+
mergeSelectionHistoryEntry(openEntry, row);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
if (openEntry) {
|
|
169
|
+
entries.push(stripEntryMetadata(openEntry));
|
|
170
|
+
if (entries.length >= limit) {
|
|
171
|
+
const preview = previewPassage(afterPassage.exact ? afterPassage.text : null);
|
|
172
|
+
baseline = { content: preview.text, contentTruncated: preview.truncated };
|
|
173
|
+
exhaustedRows = false;
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
openEntry = createSelectionHistoryEntry(row, afterPassage);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (openEntry && entries.length < limit)
|
|
182
|
+
entries.push(stripEntryMetadata(openEntry));
|
|
183
|
+
if (chainComplete && exhaustedRows && this.reachedRetentionBoundary(projectId, filePath, expectedHash)) {
|
|
184
|
+
chainComplete = false;
|
|
185
|
+
}
|
|
186
|
+
if (exhaustedRows && entries.length) {
|
|
187
|
+
const preview = previewPassage(passage.exact ? passage.text : null);
|
|
188
|
+
baseline = { content: preview.text, contentTruncated: preview.truncated };
|
|
189
|
+
}
|
|
190
|
+
return { entries, baseline, hasMore: !exhaustedRows, chainComplete };
|
|
191
|
+
}
|
|
192
|
+
reachedRetentionBoundary(projectId, filePath, expectedHash) {
|
|
193
|
+
const row = this.db.prepare(`SELECT after_hash FROM project_edit_history_boundaries
|
|
194
|
+
WHERE project_id = ? AND file_path = ?`).get(projectId, filePath);
|
|
195
|
+
return row?.after_hash === expectedHash;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function createSelectionHistoryEntry(row, afterPassage) {
|
|
199
|
+
const content = previewPassage(afterPassage.exact ? afterPassage.text : null);
|
|
200
|
+
return {
|
|
201
|
+
id: row.id,
|
|
202
|
+
filePath: row.file_path,
|
|
203
|
+
createdAt: row.created_at,
|
|
204
|
+
updatedAt: row.updated_at,
|
|
205
|
+
authorKeys: new Set([authorKey(row)]),
|
|
206
|
+
authors: [authorFromRow(row)],
|
|
207
|
+
content: content.text,
|
|
208
|
+
contentTruncated: content.truncated
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function canMergeIntoEntry(entry, row) {
|
|
212
|
+
const latest = Date.parse(entry.updatedAt);
|
|
213
|
+
const current = Date.parse(row.updated_at);
|
|
214
|
+
return Number.isFinite(latest) && Number.isFinite(current)
|
|
215
|
+
&& latest >= current && latest - current <= EDIT_SESSION_GAP_MS;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* A history row can be relevant because it moved a selection boundary even
|
|
219
|
+
* when the reconstructed selected text did not change. Do not make users
|
|
220
|
+
* page through duplicate states: retain one block, but aggregate its time and
|
|
221
|
+
* contributors. Truncated or inexact text is deliberately never treated as
|
|
222
|
+
* equal.
|
|
223
|
+
*/
|
|
224
|
+
function hasSameSelectionContent(entry, passage) {
|
|
225
|
+
const candidate = previewPassage(passage.exact ? passage.text : null);
|
|
226
|
+
return entry.content !== null && !entry.contentTruncated
|
|
227
|
+
&& candidate.text !== null && !candidate.truncated
|
|
228
|
+
&& entry.content === candidate.text;
|
|
229
|
+
}
|
|
230
|
+
function mergeSelectionHistoryEntry(entry, row) {
|
|
231
|
+
entry.createdAt = row.created_at;
|
|
232
|
+
if (!entry.authorKeys.has(authorKey(row))) {
|
|
233
|
+
entry.authorKeys.add(authorKey(row));
|
|
234
|
+
entry.authors.push(authorFromRow(row));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function stripEntryMetadata(entry) {
|
|
238
|
+
const { authorKeys: _authorKeys, ...result } = entry;
|
|
239
|
+
return result;
|
|
240
|
+
}
|
|
241
|
+
function authorFromRow(row) {
|
|
242
|
+
return row.author_id && row.author_username && row.author_name
|
|
243
|
+
? { id: row.author_id, username: row.author_username, name: row.author_name }
|
|
244
|
+
: { id: null, username: null, name: null };
|
|
245
|
+
}
|
|
246
|
+
function authorKey(row) {
|
|
247
|
+
return row.author_id ?? "<deleted>";
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Reconstruct just the selected passage while walking a Yjs step backwards.
|
|
251
|
+
* We avoid rebuilding the full source tree and abandon the exact passage only
|
|
252
|
+
* when a deliberately truncated stored preview makes reconstruction unsafe.
|
|
253
|
+
*/
|
|
254
|
+
function undoPassage(current, beforeRange, spans) {
|
|
255
|
+
if (!spans.length)
|
|
256
|
+
return { ...current, range: beforeRange, exact: current.exact && current.text.length === beforeRange.end - beforeRange.start };
|
|
257
|
+
let text = current.text;
|
|
258
|
+
let exact = current.exact;
|
|
259
|
+
for (const span of [...spans].sort((left, right) => right.afterStart - left.afterStart || right.afterEnd - left.afterEnd)) {
|
|
260
|
+
if (span.truncated || span.deletedPreview.length !== span.deletedLength || span.insertedPreview.length !== span.insertedLength) {
|
|
261
|
+
exact = false;
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
if (span.insertedLength === 0) {
|
|
265
|
+
const position = clamp(span.afterStart - current.range.start, 0, text.length);
|
|
266
|
+
text = `${text.slice(0, position)}${span.deletedPreview}${text.slice(position)}`;
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const start = clamp(Math.max(span.afterStart, current.range.start) - current.range.start, 0, text.length);
|
|
270
|
+
const end = clamp(Math.min(span.afterEnd, current.range.end) - current.range.start, start, text.length);
|
|
271
|
+
text = `${text.slice(0, start)}${span.deletedPreview}${text.slice(end)}`;
|
|
272
|
+
}
|
|
273
|
+
if (exact && text.length !== beforeRange.end - beforeRange.start)
|
|
274
|
+
exact = false;
|
|
275
|
+
return { range: beforeRange, text, exact };
|
|
276
|
+
}
|
|
277
|
+
function previewPassage(value) {
|
|
278
|
+
if (value === null)
|
|
279
|
+
return { text: null, truncated: false };
|
|
280
|
+
if (value.length <= MAX_PASSAGE_PREVIEW_CHARS)
|
|
281
|
+
return { text: value, truncated: false };
|
|
282
|
+
const edge = Math.floor((MAX_PASSAGE_PREVIEW_CHARS - 1) / 2);
|
|
283
|
+
return { text: `${value.slice(0, edge)}…${value.slice(value.length - edge)}`, truncated: true };
|
|
284
|
+
}
|
|
285
|
+
export function hashText(content) {
|
|
286
|
+
return createHash("sha256").update(content).digest("hex");
|
|
287
|
+
}
|
|
288
|
+
function normalizeSegment(input) {
|
|
289
|
+
if (!input.authorId || !input.steps.length)
|
|
290
|
+
return null;
|
|
291
|
+
let filePath;
|
|
292
|
+
try {
|
|
293
|
+
filePath = safeRelativePath(input.filePath);
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
const steps = input.steps.map(normalizeStep).filter((step) => step !== null);
|
|
299
|
+
if (!steps.length)
|
|
300
|
+
return null;
|
|
301
|
+
const first = steps[0];
|
|
302
|
+
const last = steps.at(-1);
|
|
303
|
+
if (input.beforeHash !== first.beforeHash || input.afterHash !== last.afterHash)
|
|
304
|
+
return null;
|
|
305
|
+
for (let index = 1; index < steps.length; index += 1) {
|
|
306
|
+
if (steps[index - 1].afterHash !== steps[index].beforeHash)
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
filePath,
|
|
311
|
+
authorId: input.authorId,
|
|
312
|
+
kind: input.kind === "format" ? "format" : "edit",
|
|
313
|
+
beforeHash: input.beforeHash,
|
|
314
|
+
afterHash: input.afterHash,
|
|
315
|
+
createdAt: safeTimestamp(input.createdAt),
|
|
316
|
+
updatedAt: safeTimestamp(input.updatedAt),
|
|
317
|
+
steps
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
function normalizeStep(step) {
|
|
321
|
+
if (!isHash(step.beforeHash) || !isHash(step.afterHash))
|
|
322
|
+
return null;
|
|
323
|
+
const spans = step.spans.map(normalizeSpan).filter((span) => span !== null);
|
|
324
|
+
return spans.length ? { beforeHash: step.beforeHash, afterHash: step.afterHash, createdAt: safeTimestamp(step.createdAt), spans } : null;
|
|
325
|
+
}
|
|
326
|
+
function normalizeSpan(span) {
|
|
327
|
+
const numeric = [span.beforeStart, span.beforeEnd, span.afterStart, span.afterEnd, span.deletedLength, span.insertedLength];
|
|
328
|
+
if (numeric.some((value) => !Number.isInteger(value) || value < 0)
|
|
329
|
+
|| span.beforeEnd < span.beforeStart || span.afterEnd < span.afterStart
|
|
330
|
+
|| span.deletedLength !== span.beforeEnd - span.beforeStart
|
|
331
|
+
|| span.insertedLength !== span.afterEnd - span.afterStart)
|
|
332
|
+
return null;
|
|
333
|
+
return {
|
|
334
|
+
beforeStart: span.beforeStart,
|
|
335
|
+
beforeEnd: span.beforeEnd,
|
|
336
|
+
afterStart: span.afterStart,
|
|
337
|
+
afterEnd: span.afterEnd,
|
|
338
|
+
deletedLength: span.deletedLength,
|
|
339
|
+
insertedLength: span.insertedLength,
|
|
340
|
+
deletedPreview: typeof span.deletedPreview === "string" ? span.deletedPreview.slice(0, 4_096) : "",
|
|
341
|
+
insertedPreview: typeof span.insertedPreview === "string" ? span.insertedPreview.slice(0, 4_096) : "",
|
|
342
|
+
truncated: Boolean(span.truncated)
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
function parseSteps(input) {
|
|
346
|
+
try {
|
|
347
|
+
const parsed = JSON.parse(input);
|
|
348
|
+
if (!Array.isArray(parsed))
|
|
349
|
+
return [];
|
|
350
|
+
return parsed.map(normalizeStep).filter((step) => step !== null);
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
return [];
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function mapRangeBackward(range, spans) {
|
|
357
|
+
return {
|
|
358
|
+
start: mapPositionBackward(range.start, spans, -1),
|
|
359
|
+
end: mapPositionBackward(range.end, spans, 1)
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
/** Map a position from a step's post-edit document back to its pre-edit document. */
|
|
363
|
+
function mapPositionBackward(position, spans, association) {
|
|
364
|
+
let delta = 0;
|
|
365
|
+
for (const span of spans) {
|
|
366
|
+
// Nonempty replacements have unambiguous endpoints. Association only
|
|
367
|
+
// chooses a side inside a replacement or at a collapsed deletion.
|
|
368
|
+
if (span.insertedLength > 0 && position === span.afterStart)
|
|
369
|
+
return span.beforeStart;
|
|
370
|
+
if (span.insertedLength > 0 && position === span.afterEnd)
|
|
371
|
+
return span.beforeEnd;
|
|
372
|
+
if (position < span.afterStart || (position === span.afterStart && association < 0))
|
|
373
|
+
return position + delta;
|
|
374
|
+
if (position > span.afterEnd || (position === span.afterEnd && association > 0)) {
|
|
375
|
+
delta += span.deletedLength - span.insertedLength;
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
return span.beforeStart + (association < 0 ? 0 : span.deletedLength);
|
|
379
|
+
}
|
|
380
|
+
return position + delta;
|
|
381
|
+
}
|
|
382
|
+
function spanIntersectsRange(span, after, before) {
|
|
383
|
+
if (rangesIntersect(after.start, after.end, span.afterStart, span.afterEnd))
|
|
384
|
+
return true;
|
|
385
|
+
// A deletion has no surviving post-edit range, so the mapped pre-edit
|
|
386
|
+
// selection is its only reliable signal. For replacements and insertions,
|
|
387
|
+
// checking the pre-edit range as well would falsely include a change that
|
|
388
|
+
// merely touches the selection's right boundary.
|
|
389
|
+
return span.insertedLength === 0 && rangesIntersect(before.start, before.end, span.beforeStart, span.beforeEnd);
|
|
390
|
+
}
|
|
391
|
+
function rangesIntersect(leftStart, leftEnd, rightStart, rightEnd) {
|
|
392
|
+
if (leftStart === leftEnd)
|
|
393
|
+
return leftStart >= rightStart && leftStart <= rightEnd;
|
|
394
|
+
if (rightStart === rightEnd)
|
|
395
|
+
return rightStart >= leftStart && rightStart <= leftEnd;
|
|
396
|
+
return leftStart < rightEnd && rightStart < leftEnd;
|
|
397
|
+
}
|
|
398
|
+
function safeTimestamp(value) {
|
|
399
|
+
return Number.isNaN(Date.parse(value)) ? new Date().toISOString() : value;
|
|
400
|
+
}
|
|
401
|
+
function isHash(value) {
|
|
402
|
+
return typeof value === "string" && /^[a-f0-9]{64}$/i.test(value);
|
|
403
|
+
}
|
|
404
|
+
function normalizeStorageLimit(value) {
|
|
405
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
406
|
+
return DEFAULT_EDIT_HISTORY_MAX_STORAGE_BYTES;
|
|
407
|
+
return Math.floor(value);
|
|
408
|
+
}
|
|
409
|
+
function clamp(value, min, max) {
|
|
410
|
+
return Math.max(min, Math.min(max, Number.isFinite(value) ? Math.floor(value) : min));
|
|
411
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const RETRY_DELAY_MS = 5_000;
|
|
2
|
+
const MAX_RETRIES = 3;
|
|
3
|
+
const MAX_PENDING_PROJECT_BYTES = 4 * 1024 * 1024;
|
|
4
|
+
const MAX_PENDING_BYTES = 16 * 1024 * 1024;
|
|
5
|
+
/** Preserve failed durable-source edits in order, without unbounded memory or retries. */
|
|
6
|
+
export class EditHistoryRetry {
|
|
7
|
+
record;
|
|
8
|
+
exists;
|
|
9
|
+
report;
|
|
10
|
+
pending = new Map();
|
|
11
|
+
timer;
|
|
12
|
+
constructor(record, exists, report) {
|
|
13
|
+
this.record = record;
|
|
14
|
+
this.exists = exists;
|
|
15
|
+
this.report = report;
|
|
16
|
+
}
|
|
17
|
+
save(id, edits) {
|
|
18
|
+
if (!edits.length)
|
|
19
|
+
return;
|
|
20
|
+
const old = this.pending.get(id);
|
|
21
|
+
if (!old) {
|
|
22
|
+
// The queue limits protect only a failed retry buffer. A valid large
|
|
23
|
+
// edit must always get its normal transactional write attempt first.
|
|
24
|
+
try {
|
|
25
|
+
this.record(id, edits);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
this.enqueue(id, [...edits], 0, error);
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Preserve the exact order of a previously failed batch. Trying a new
|
|
33
|
+
// write before it has succeeded would be wasteful during an outage and
|
|
34
|
+
// makes the retry path harder to reason about.
|
|
35
|
+
this.enqueue(id, [...old.edits, ...edits], old.attempts);
|
|
36
|
+
}
|
|
37
|
+
clear(id) { this.pending.delete(id); }
|
|
38
|
+
dispose() { clearTimeout(this.timer); this.pending.clear(); }
|
|
39
|
+
enqueue(id, edits, attempts, error) {
|
|
40
|
+
let bytes;
|
|
41
|
+
try {
|
|
42
|
+
bytes = Buffer.byteLength(JSON.stringify(edits));
|
|
43
|
+
}
|
|
44
|
+
catch (serializationError) {
|
|
45
|
+
this.pending.delete(id);
|
|
46
|
+
this.report(id, "incomplete", serializationError);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const previousBytes = this.pending.get(id)?.bytes ?? 0;
|
|
50
|
+
const total = [...this.pending.values()].reduce((sum, item) => sum + item.bytes, 0) - previousBytes;
|
|
51
|
+
if (bytes > MAX_PENDING_PROJECT_BYTES || total + bytes > MAX_PENDING_BYTES) {
|
|
52
|
+
this.pending.delete(id);
|
|
53
|
+
this.report(id, "incomplete", new Error("Edit-history retry queue reached its memory limit"));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.pending.set(id, { edits, bytes, attempts });
|
|
57
|
+
this.report(id, "retrying", error);
|
|
58
|
+
this.schedule();
|
|
59
|
+
}
|
|
60
|
+
schedule() {
|
|
61
|
+
if (this.timer)
|
|
62
|
+
return;
|
|
63
|
+
this.timer = setTimeout(() => {
|
|
64
|
+
this.timer = undefined;
|
|
65
|
+
for (const [id, batch] of this.pending) {
|
|
66
|
+
if (!this.exists(id)) {
|
|
67
|
+
this.pending.delete(id);
|
|
68
|
+
this.report(id, "discarded");
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
this.record(id, batch.edits);
|
|
73
|
+
this.pending.delete(id);
|
|
74
|
+
this.report(id, "ok");
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (++batch.attempts >= MAX_RETRIES) {
|
|
78
|
+
this.pending.delete(id);
|
|
79
|
+
this.report(id, "incomplete", error);
|
|
80
|
+
}
|
|
81
|
+
else
|
|
82
|
+
this.report(id, "retrying", error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (this.pending.size)
|
|
86
|
+
this.schedule();
|
|
87
|
+
}, RETRY_DELAY_MS);
|
|
88
|
+
this.timer.unref?.();
|
|
89
|
+
}
|
|
90
|
+
}
|