diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..3550a30f --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index ed35c93e..1dc6be29 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ pnpm-debug.log* # environment variables .env .env.production +.direnv # macOS-specific files .DS_Store diff --git a/README.md b/README.md index 6b7c5f64..5478ea80 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,11 @@ Add the binary file to your $PATH, e.g., in `/usr/local/bin`: ```bash sudo mv ./bin/spf /usr/local/bin ``` +## Start Superfile + +```bash +spf +``` ## Supported Systems diff --git a/src/cmd/main.go b/src/cmd/main.go index a51995b6..b7c42cda 100644 --- a/src/cmd/main.go +++ b/src/cmd/main.go @@ -193,7 +193,7 @@ func checkFirstUse() bool { if _, err := os.Stat(file); os.IsNotExist(err) { firstUse = true if err := os.WriteFile(file, nil, 0644); err != nil { - log.Fatalln("failed to create file: %w", err) + log.Fatalf("Failed to create file: %v", err) } } return firstUse diff --git a/src/internal/config_function.go b/src/internal/config_function.go index e053984c..8d44b956 100644 --- a/src/internal/config_function.go +++ b/src/internal/config_function.go @@ -3,10 +3,11 @@ package internal import ( "embed" "fmt" - "log" + "log/slog" "os" "path/filepath" "reflect" + "runtime" "strings" "github.com/barasher/go-exiftool" @@ -19,16 +20,29 @@ import ( // initialConfig load and handle all configuration files (spf config,hotkeys // themes) setted up. Returns absolute path of dir pointing to the file Panel func initialConfig(dir string) (toggleDotFileBool bool, toggleFooter bool, firstFilePanelDir string) { - var err error - // Open log stream - logOutput, err = os.OpenFile(variable.LogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + file, err := os.OpenFile(variable.LogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + + // Todo : This could be improved if we want to make superfile more resilient to errors + // For example if the log file directories have access issues. + // we could pass a dummy object to log.SetOutput() and the app would still function. if err != nil { - log.Fatalf("Error while opening superfile.log file: %v", err) + // At this point, it will go to stdout since log file is not initilized + LogAndExit("Error while opening superfile.log file", "error", err) } loadConfigFile() + logLevel := slog.LevelInfo + if Config.Debug { + logLevel = slog.LevelDebug + } + + slog.SetDefault(slog.New(slog.NewTextHandler( + file, &slog.HandlerOptions{Level: logLevel}))) + + slog.Debug("Runtime information", "runtime.GOOS", runtime.GOOS) + loadHotkeysFile() loadThemeFile() @@ -94,7 +108,7 @@ func loadConfigFile() { data, err := os.ReadFile(variable.ConfigFile) if err != nil { - log.Fatalf("Config file doesn't exist: %v", err) + LogAndExit("Config file doesn't exist", "error", err) } // Insert data present in the config file inside temp variable @@ -113,23 +127,21 @@ func loadConfigFile() { if !reflect.DeepEqual(Config, tempForCheckMissingConfig) && variable.FixConfigFile { tomlData, err := toml.Marshal(Config) if err != nil { - log.Fatalf("Error encoding config: %v", err) + LogAndExit("Error encoding config", "error", err) } err = os.WriteFile(variable.ConfigFile, tomlData, 0644) if err != nil { - log.Fatalf("Error writing config file: %v", err) + LogAndExit("Error writing config file", "error", err) } } if (Config.FilePreviewWidth > 10 || Config.FilePreviewWidth < 2) && Config.FilePreviewWidth != 0 { - fmt.Println(loadConfigError("file_preview_width")) - os.Exit(0) + LogAndExit(loadConfigError("file_preview_width")) } if Config.SidebarWidth != 0 && (Config.SidebarWidth < 3 || Config.SidebarWidth > 20) { - fmt.Println(loadConfigError("sidebar_width")) - os.Exit(0) + LogAndExit(loadConfigError("sidebar_width")) } } @@ -144,14 +156,14 @@ func loadHotkeysFile() { data, err := os.ReadFile(variable.HotkeysFile) if err != nil { - log.Fatalf("Config file doesn't exist: %v", err) + LogAndExit("Config file doesn't exist", "error", err) } // Load data from hotkeys file _ = toml.Unmarshal(data, &hotkeysFromConfig) // Override default hotkeys with the ones from the file err = toml.Unmarshal(data, &hotkeys) if err != nil { - log.Fatalf("Error decoding hotkeys file ( your config file may have misconfigured ): %v", err) + LogAndExit("Error decoding hotkeys file ( your config file may have misconfigured", "error", err) } hasMissingHotkeysInConfig := !reflect.DeepEqual(hotkeys, hotkeysFromConfig) @@ -186,15 +198,13 @@ func loadHotkeysFile() { value := val.Field(i) if value.Kind() != reflect.Slice || value.Type().Elem().Kind() != reflect.String { - fmt.Println(lodaHotkeysError(field.Name)) - os.Exit(0) + LogAndExit(loadHotkeysError(field.Name)) } hotkeysList := value.Interface().([]string) if len(hotkeysList) == 0 || hotkeysList[0] == "" { - fmt.Println(lodaHotkeysError(field.Name)) - os.Exit(0) + LogAndExit(loadHotkeysError(field.Name)) } } @@ -204,12 +214,12 @@ func loadHotkeysFile() { func writeHotkeysFile(hotkeys HotkeysType) { tomlData, err := toml.Marshal(hotkeys) if err != nil { - log.Fatalf("Error encoding hotkeys: %v", err) + LogAndExit("Error encoding hotkeys", "error", err) } err = os.WriteFile(variable.HotkeysFile, tomlData, 0644) if err != nil { - log.Fatalf("Error writing hotkeys file: %v", err) + LogAndExit("Error writing hotkeys file", "error", err) } } @@ -223,7 +233,7 @@ func loadThemeFile() { err = toml.Unmarshal(data, &theme) if err != nil { - log.Fatalf("Error while decoding theme file( Your theme file may have errors ): %v", err) + LogAndExit("Error while decoding theme file( Your theme file may have errors", "error", err) } } diff --git a/src/internal/config_type.go b/src/internal/config_type.go index ef0add6f..9e393a35 100644 --- a/src/internal/config_type.go +++ b/src/internal/config_type.go @@ -126,6 +126,7 @@ type ConfigType struct { DefaultSortType int `toml:"default_sort_type" comment:"\nDefault sort type (0: Name, 1: Size, 2: Date Modified)."` SortOrderReversed bool `toml:"sort_order_reversed" comment:"\nDefault sort order (false: Ascending, true: Descending)."` CaseSensitiveSort bool `toml:"case_sensitive_sort" comment:"\nCase sensitive sort by name (captal \"B\" comes before \"a\" if true)."` + Debug bool `toml:"debug" comment:"\nWhether to enable debug mode."` Nerdfont bool `toml:"nerdfont" comment:"\n================ Style =================\n\n If you don't have or don't want Nerdfont installed you can turn this off"` TransparentBackground bool `toml:"transparent_background" comment:"\nSet transparent background or not (this only work when your terminal background is transparent)"` diff --git a/src/internal/file_operations.go b/src/internal/file_operations.go index 37e029f7..452efd78 100644 --- a/src/internal/file_operations.go +++ b/src/internal/file_operations.go @@ -147,21 +147,24 @@ func trashMacOrLinux(src string) error { err := moveElement(src, filepath.Join(variable.HomeDir, ".Trash", filepath.Base(src))) if err != nil { outPutLog("Delete single item function move file to trash can error", err) + return err } } else { err := trash.Trash(src) if err != nil { outPutLog("Paste item function move file to trash can error", err) + return err } } return nil } // pasteDir handles directory copying with progress tracking -func pasteDir(src, dst string, id string, m model) (model, error) { +// model would only have changes in m.processBarModel.process[id] +func pasteDir(src, dst string, id string, m *model) (error) { dst, err := renameIfDuplicate(dst) if err != nil { - return m, err + return err } // Check if we can do a fast move within the same partition @@ -170,7 +173,7 @@ func pasteDir(src, dst string, id string, m model) (model, error) { // For cut operations on same partition, try fast rename first err = os.Rename(src, dst) if err == nil { - return m, nil + return nil } // If rename fails, fall back to manual copy } @@ -239,16 +242,16 @@ func pasteDir(src, dst string, id string, m model) (model, error) { }) if err != nil { - return m, err + return err } // If this was a cut operation and we had to do a manual copy, remove the source if m.copyItems.cut && !sameDev { err = os.RemoveAll(src) if err != nil { - return m, fmt.Errorf("failed to remove source after move: %v", err) + return fmt.Errorf("failed to remove source after move: %v", err) } } - return m, nil + return nil } diff --git a/src/internal/function.go b/src/internal/function.go index 6fae6e48..6de4cba5 100644 --- a/src/internal/function.go +++ b/src/internal/function.go @@ -5,7 +5,7 @@ import ( "encoding/hex" "fmt" "io" - "log" + "log/slog" "os" "path/filepath" "regexp" @@ -211,11 +211,15 @@ func arrayContains(s []string, str string) bool { return false } +// Todo : Eventually we will replace all calls to direct slog calls func outPutLog(values ...interface{}) { - log.SetOutput(logOutput) - for _, value := range values { - log.Println(value) - } + slog.Info(fmt.Sprintln(values...)) +} + +// Todo : Eventually we want to remove all such usage that can result in app exiting abruptly +func LogAndExit(msg string, values ...any) { + slog.Error(msg, values...) + os.Exit(1) } func removeElementByValue(slice []string, value string) []string { diff --git a/src/internal/handle_file_operations.go b/src/internal/handle_file_operations.go index 86cf2221..fd4cc7dc 100644 --- a/src/internal/handle_file_operations.go +++ b/src/internal/handle_file_operations.go @@ -3,8 +3,8 @@ package internal import ( "os" "os/exec" - "path" "path/filepath" + "log/slog" "strings" "time" @@ -74,6 +74,13 @@ func (m *model) panelItemRename() { if len(panel.element) == 0 { return } + + cursorPos := strings.LastIndex(panel.element[panel.cursor].name, ".") + nameLen := len(panel.element[panel.cursor].name) + if cursorPos == -1 || cursorPos == 0 && nameLen > 0 || panel.element[panel.cursor].directory { + cursorPos = nameLen + } + ti := textinput.New() ti.Cursor.Style = filePanelCursorStyle ti.Cursor.TextStyle = filePanelStyle @@ -83,6 +90,7 @@ func (m *model) panelItemRename() { ti.Placeholder = "New name" ti.PlaceholderStyle = modalStyle ti.SetValue(panel.element[panel.cursor].name) + ti.SetCursor(cursorPos) ti.Focus() ti.CharLimit = 156 ti.Width = m.fileModel.width - 4 @@ -368,151 +376,65 @@ func (m model) completelyDeleteMultipleItems() { panel.selected = panel.selected[:0] } -// Copy directory or file -func (m *model) copySingleItem() { - panel := m.fileModel.filePanels[m.filePanelFocusIndex] - m.copyItems.cut = false - m.copyItems.items = m.copyItems.items[:0] +// Copy directory or file's path to superfile's clipboard +// set cut to true/false accordingly +func (m *model) copySingleItem(cut bool) { + panel := &m.fileModel.filePanels[m.filePanelFocusIndex] + m.copyItems.reset(cut) if len(panel.element) == 0 { return } + slog.Debug("handle_file_operations.copySingleItem", "cut", cut, + "panel location", panel.element[panel.cursor].location) m.copyItems.items = append(m.copyItems.items, panel.element[panel.cursor].location) - fileInfo, err := os.Stat(panel.element[panel.cursor].location) - if os.IsNotExist(err) { - m.copyItems.items = m.copyItems.items[:0] - return - } - if err != nil { - outPutLog("Copy single item get file state error", panel.element[panel.cursor].location, err) - } - - if !fileInfo.IsDir() && float64(fileInfo.Size())/(1024*1024) < 250 { - fileContent, err := os.ReadFile(panel.element[panel.cursor].location) - - if err != nil { - outPutLog("Copy single item read file error", panel.element[panel.cursor].location, err) - } - - if err := clipboard.WriteAll(string(fileContent)); err != nil { - outPutLog("Copy single item write file error", panel.element[panel.cursor].location, err) - } - } - m.fileModel.filePanels[m.filePanelFocusIndex] = panel } -// Copy all selected file or directory to the clipboard -func (m *model) copyMultipleItem() { - panel := m.fileModel.filePanels[m.filePanelFocusIndex] - m.copyItems.cut = false - m.copyItems.items = m.copyItems.items[:0] +// Copy all selected file or directory's paths to the clipboard +func (m *model) copyMultipleItem(cut bool) { + panel := &m.fileModel.filePanels[m.filePanelFocusIndex] + m.copyItems.reset(cut) if len(panel.selected) == 0 { return } + slog.Debug("handle_file_operations.copyMultipleItem", "cut", cut, + "panel selected files", panel.selected) m.copyItems.items = panel.selected - fileInfo, err := os.Stat(panel.selected[0]) - if os.IsNotExist(err) { - return - } - if err != nil { - outPutLog("Copy multiple item function get file state error", panel.selected[0], err) - } - - if !fileInfo.IsDir() && float64(fileInfo.Size())/(1024*1024) < 250 { - fileContent, err := os.ReadFile(panel.selected[0]) - - if err != nil { - outPutLog("Copy multiple item function read file error", err) - } - - if err := clipboard.WriteAll(string(fileContent)); err != nil { - outPutLog("Copy multiple item function write file to clipboard error", err) - } - } - m.fileModel.filePanels[m.filePanelFocusIndex] = panel -} - -// Cut directory or file -func (m *model) cutSingleItem() { - panel := m.fileModel.filePanels[m.filePanelFocusIndex] - m.copyItems.cut = true - m.copyItems.items = m.copyItems.items[:0] - if len(panel.element) == 0 { - return - } - m.copyItems.items = append(m.copyItems.items, panel.element[panel.cursor].location) - fileInfo, err := os.Stat(panel.element[panel.cursor].location) - if os.IsNotExist(err) { - m.copyItems.items = m.copyItems.items[:0] - return - } - if err != nil { - outPutLog("Cut single item get file state error", panel.element[panel.cursor].location, err) - } - - if !fileInfo.IsDir() && float64(fileInfo.Size())/(1024*1024) < 250 { - fileContent, err := os.ReadFile(panel.element[panel.cursor].location) - - if err != nil { - outPutLog("Cut single item read file error", panel.element[panel.cursor].location, err) - } - - if err := clipboard.WriteAll(string(fileContent)); err != nil { - outPutLog("Cut single item write file error", panel.element[panel.cursor].location, err) - } - } - m.fileModel.filePanels[m.filePanelFocusIndex] = panel -} - -// Cut all selected file or directory to the clipboard -func (m *model) cutMultipleItem() { - panel := m.fileModel.filePanels[m.filePanelFocusIndex] - m.copyItems.cut = true - m.copyItems.items = m.copyItems.items[:0] - if len(panel.selected) == 0 { - return - } - m.copyItems.items = panel.selected - fileInfo, err := os.Stat(panel.selected[0]) - if os.IsNotExist(err) { - return - } - if err != nil { - outPutLog("Copy multiple item function get file state error", panel.selected[0], err) - } - - if !fileInfo.IsDir() && float64(fileInfo.Size())/(1024*1024) < 250 { - fileContent, err := os.ReadFile(panel.selected[0]) - - if err != nil { - outPutLog("Copy multiple item function read file error", err) - } - - if err := clipboard.WriteAll(string(fileContent)); err != nil { - outPutLog("Copy multiple item function write file to clipboard error", err) - } - } - m.fileModel.filePanels[m.filePanelFocusIndex] = panel } // Paste all clipboard items -func (m model) pasteItem() { - id := shortuuid.New() - panel := m.fileModel.filePanels[m.filePanelFocusIndex] - +func (m *model) pasteItem() { if len(m.copyItems.items) == 0 { return } + id := shortuuid.New() + panel := &m.fileModel.filePanels[m.filePanelFocusIndex] totalFiles := 0 for _, folderPath := range m.copyItems.items { + // Todo : Fix this. This is inefficient + // In case of a cut operations for a directory with a lot of files + // we are unnecessarily walking the whole directory recursively + // while os will just perform a rename + // So instead of few operations this will cause the cut paste + // to read the whole directory recursively + // we should avoid doing this. + // Although this allows us a more detailed progress tracking + // this make the copy/cut more inefficient + // instead, we could just track progress based on total items in + // m.copyItems.items + // efficiency should be prioritized over more detailed feedback. count, err := countFiles(folderPath) if err != nil { + slog.Error("mode.pasteItem - Error in countFiles", "error", err) continue } totalFiles += count } + slog.Debug("model.pasteItem", "items", m.copyItems.items, "cut", m.copyItems.cut, + "totalFiles", totalFiles, "panel location", panel.location) + prog := progress.New(generateGradientColor()) prog.PercentageStyle = footerStyle @@ -553,19 +475,23 @@ func (m model) pasteItem() { errMessage := "cut item error" if m.copyItems.cut && !isExternalDiskPath(filePath) { - err = moveElement(filePath, filepath.Join(panel.location, path.Base(filePath))) + err = moveElement(filePath, filepath.Join(panel.location, filepath.Base(filePath))) } else { - newModel, err := pasteDir(filePath, filepath.Join(panel.location, path.Base(filePath)), id, m) + err = pasteDir(filePath, filepath.Join(panel.location, filepath.Base(filePath)), id, m) if err != nil { errMessage = "paste item error" - } - m = newModel - if m.copyItems.cut { - os.RemoveAll(filePath) + } else { + // Todo : These error cases are hard to test. We have to somehow make the paste operations fail, + // which is time consuming and manual. We should test these with automated testcases + if m.copyItems.cut { + os.RemoveAll(filePath) + } } } p = m.processBarModel.process[id] if err != nil { + slog.Debug("model.pasteItem - paste failure", "error", err, + "current item", filePath, "errMessage", errMessage) p.state = failure message.processNewState = p channel <- message @@ -575,14 +501,20 @@ func (m model) pasteItem() { } } - p.state = successful - p.done = totalFiles - p.doneTime = time.Now() + if p.state != failure { + p.state = successful + p.done = totalFiles + p.doneTime = time.Now() + } message.processNewState = p channel <- message m.processBarModel.process[id] = p - m.copyItems.cut = false + // Reset after paste is done. Only in case of cut + // because current items in clipboard are deleted now + if m.copyItems.cut { + m.copyItems.reset(false) + } } // Extrach compress file diff --git a/src/internal/handle_panel_movement.go b/src/internal/handle_panel_movement.go index b539840c..3f34ec2d 100644 --- a/src/internal/handle_panel_movement.go +++ b/src/internal/handle_panel_movement.go @@ -214,6 +214,7 @@ func (m *model) searchBarFocus() { panel.searchBar.Blur() } else { panel.searchBar.Focus() + m.firstTextInput = true } // config search bar width diff --git a/src/internal/key_function.go b/src/internal/key_function.go index c5f14aaa..ae7b50bb 100644 --- a/src/internal/key_function.go +++ b/src/internal/key_function.go @@ -158,9 +158,9 @@ func (m *model) normalAndBrowserModeKey(msg string) { m.deleteItemWarn() }() case containsKey(msg, hotkeys.CopyItems): - m.copyMultipleItem() + m.copyMultipleItem(false) case containsKey(msg, hotkeys.CutItems): - m.cutMultipleItem() + m.copyMultipleItem(true) case containsKey(msg, hotkeys.FilePanelSelectAllItem): m.selectAllItem() } @@ -177,9 +177,9 @@ func (m *model) normalAndBrowserModeKey(msg string) { m.deleteItemWarn() }() case containsKey(msg, hotkeys.CopyItems): - m.copySingleItem() + m.copySingleItem(false) case containsKey(msg, hotkeys.CutItems): - m.cutSingleItem() + m.copySingleItem(true) case containsKey(msg, hotkeys.FilePanelItemRename): m.panelItemRename() case containsKey(msg, hotkeys.SearchBar): @@ -262,16 +262,14 @@ func (m *model) sortOptionsKey(msg string) { switch msg { case containsKey(msg, hotkeys.OpenSortOptionsMenu): m.cancelSortOptions() - case containsKey(msg, hotkeys.CancelTyping): + case containsKey(msg, hotkeys.Quit): m.cancelSortOptions() - case containsKey(msg, hotkeys.ConfirmTyping): + case containsKey(msg, hotkeys.Confirm): m.confirmSortOptions() case containsKey(msg, hotkeys.ListUp): m.sortOptionsListUp() case containsKey(msg, hotkeys.ListDown): m.sortOptionsListDown() - case containsKey(msg, hotkeys.Quit): - m.cancelSortOptions() } } diff --git a/src/internal/model.go b/src/internal/model.go index 8cf9d148..59df6493 100644 --- a/src/internal/model.go +++ b/src/internal/model.go @@ -1,7 +1,7 @@ package internal import ( - "log" + "log/slog" "os" "path/filepath" "strings" @@ -25,7 +25,6 @@ var theme ThemeType var Config ConfigType var hotkeys HotkeysType -var logOutput *os.File var et *exiftool.Exiftool var channel = make(chan channelMessage, 1000) @@ -60,9 +59,9 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.WindowSizeMsg: m.handleWindowResize(msg) case tea.MouseMsg: - m, cmd = wheelMainAction(msg.String(), m, cmd) + cmd = wheelMainAction(msg.String(), &m, cmd) case tea.KeyMsg: - m, cmd = m.handleKeyInput(msg, cmd) + cmd = m.handleKeyInput(msg, cmd) } m.updateFilePanelsState(msg, &cmd) @@ -117,7 +116,7 @@ func (m *model) setFilePreviewWidth(width int) { if Config.FilePreviewWidth == 0 { m.fileModel.filePreview.width = (width - Config.SidebarWidth - (4 + (len(m.fileModel.filePanels))*2)) / (len(m.fileModel.filePanels) + 1) } else if Config.FilePreviewWidth > 10 || Config.FilePreviewWidth == 1 { - log.Fatalln("Config file file_preview_width invalidation") + LogAndExit("Config file file_preview_width invalidation") } else { m.fileModel.filePreview.width = (width - Config.SidebarWidth) / Config.FilePreviewWidth } @@ -176,10 +175,27 @@ func (m *model) setHelpMenuSize() { // Identify the current state of the application m and properly handle the // msg keybind pressed -func (m model) handleKeyInput(msg tea.KeyMsg, cmd tea.Cmd) (model, tea.Cmd) { +func (m *model) handleKeyInput(msg tea.KeyMsg, cmd tea.Cmd) tea.Cmd { + + slog.Debug("model.handleKeyInput", "msg", msg, "typestr", msg.Type.String(), + "runes", msg.Runes, "type", int(msg.Type), "paste", msg.Paste, + "alt", msg.Alt) + slog.Debug("model.handleKeyInput. model info. ", + "filePanelFocusIndex", m.filePanelFocusIndex, + "filePanel.focusType", m.fileModel.filePanels[m.filePanelFocusIndex].focusType, + "filePanel.panelMode", m.fileModel.filePanels[m.filePanelFocusIndex].panelMode, + "typingModal.open", m.typingModal.open, + "warnModal.open", m.warnModal.open, + "fileModel.renaming", m.fileModel.renaming, + "searchBar.focussed", m.fileModel.filePanels[m.filePanelFocusIndex].searchBar.Focused(), + "helpMenu.open", m.helpMenu.open, + "firstTextInput", m.firstTextInput, + "focusPanel", m.focusPanel, + ) + if firstUse { firstUse = false - return m, cmd + return cmd } if m.typingModal.open { @@ -206,23 +222,23 @@ func (m model) handleKeyInput(msg tea.KeyMsg, cmd tea.Cmd) (model, tea.Cmd) { quit := m.confirmToQuitSuperfile(msg.String()) if quit { m.quitSuperfile() - return m, tea.Quit + return tea.Quit } // If quiting input pressed, check if has any runing process and displays a // warn. Otherwise just quits application } else if msg.String() == containsKey(msg.String(), hotkeys.Quit) { if m.hasRunningProcesses() { m.warnModalForQuit() - return m, cmd + return cmd } m.quitSuperfile() - return m, tea.Quit + return tea.Quit } else { // Handles general kinds of inputs in the regular state of the application cmd = m.mainKey(msg.String(), cmd) } - return m, cmd + return cmd } // Update the file panel state. Change name of renamed files, filter out files @@ -235,12 +251,6 @@ func (m *model) updateFilePanelsState(msg tea.Msg, cmd *tea.Cmd) { focusPanel.rename, *cmd = focusPanel.rename.Update(msg) } else if focusPanel.searchBar.Focused() { focusPanel.searchBar, *cmd = focusPanel.searchBar.Update(msg) - for _, hotkey := range hotkeys.SearchBar { - if hotkey == focusPanel.searchBar.Value() { - focusPanel.searchBar.SetValue("") - break - } - } } else if m.commandLine.input.Focused() { m.commandLine.input, *cmd = m.commandLine.input.Update(msg) } else if m.typingModal.open { @@ -423,7 +433,7 @@ func (m *model) getFilePanelItems() { // Close superfile application. Cd into the curent dir if CdOnQuit on and save // the path in state direcotory -func (m model) quitSuperfile() { +func (m *model) quitSuperfile() { // close exiftool session if Config.Metadata { et.Close(); diff --git a/src/internal/model_render.go b/src/internal/model_render.go index ec16cf95..3f09e174 100644 --- a/src/internal/model_render.go +++ b/src/internal/model_render.go @@ -18,7 +18,7 @@ import ( filepreview "github.com/yorukot/superfile/src/pkg/file_preview" ) -func (m model) sidebarRender() string { +func (m *model) sidebarRender() string { if Config.SidebarWidth == 0 { return "" } @@ -73,7 +73,8 @@ func (m model) sidebarRender() string { return sideBarBorderStyle(m.mainPanelHeight, m.focusPanel).Render(s) } -func (m model) filePanelRender() string { +// This also modifies the m.fileModel.filePanels +func (m *model) filePanelRender() string { // file panel f := make([]string, 10) for i, filePanel := range m.fileModel.filePanels { @@ -189,7 +190,7 @@ func (m model) filePanelRender() string { } return filePanelRender } -func (m model) processBarRender() string { +func (m *model) processBarRender() string { // save process in the array var processes []process for _, p := range m.processBarModel.process { @@ -274,7 +275,8 @@ func (m model) processBarRender() string { return processRender } -func (m model) metadataRender() string { +// This updates m.fileMetaData +func (m *model) metadataRender() string { // process bar metaDataBar := "" if len(m.fileMetaData.metaData) == 0 && len(m.fileModel.filePanels[m.filePanelFocusIndex].element) > 0 && !m.fileModel.renaming { @@ -330,7 +332,7 @@ func (m model) metadataRender() string { return metaDataBar } -func (m model) clipboardRender() string { +func (m *model) clipboardRender() string { // render clipboardRender := "" @@ -366,7 +368,7 @@ func (m model) clipboardRender() string { return clipboardRender } -func (m model) terminalSizeWarnRender() string { +func (m *model) terminalSizeWarnRender() string { fullWidthString := strconv.Itoa(m.fullWidth) fullHeightString := strconv.Itoa(m.fullHeight) minimumWidthString := strconv.Itoa(minimumWidth) @@ -390,7 +392,7 @@ func (m model) terminalSizeWarnRender() string { heightString + terminalCorrectSize.Render(minimumHeightString)) } -func (m model) terminalSizeWarnAfterFirstRender() string { +func (m *model) terminalSizeWarnAfterFirstRender() string { minimumWidthInt := Config.SidebarWidth + 20*len(m.fileModel.filePanels) + 20 - 1 minimumWidthString := strconv.Itoa(minimumWidthInt) fullWidthString := strconv.Itoa(m.fullWidth) @@ -416,7 +418,7 @@ func (m model) terminalSizeWarnAfterFirstRender() string { heightString + terminalCorrectSize.Render(minimumHeightString)) } -func (m model) typineModalRender() string { +func (m *model) typineModalRender() string { previewPath := m.typingModal.location + "/" + m.typingModal.textInput.Value() fileLocation := filePanelTopDirectoryIconStyle.Render(" "+icon.Directory+icon.Space) + @@ -432,7 +434,7 @@ func (m model) typineModalRender() string { return modalBorderStyle(modalHeight, modalWidth).Render(fileLocation + "\n" + m.typingModal.textInput.View() + "\n\n" + tip) } -func (m model) introduceModalRender() string { +func (m *model) introduceModalRender() string { title := sidebarTitleStyle.Render(" Thanks for using superfile!!") + modalStyle.Render("\n You can read the following information before starting to use it!") vimUserWarn := processErrorStyle.Render(" ** Very importantly ** If you are a Vim/Nvim user, go to:\n https://superfile.netlify.app/configure/custom-hotkeys/ to change your hotkey settings!") subOne := sidebarTitleStyle.Render(" (1)") + modalStyle.Render(" If this is your first time, make sure you read:\n https://superfile.netlify.app/getting-started/tutorial/") @@ -442,7 +444,7 @@ func (m model) introduceModalRender() string { return firstUseModal(m.helpMenu.height, m.helpMenu.width).Render(title + "\n\n" + vimUserWarn + "\n\n" + subOne + "\n\n" + subTwo + "\n\n" + subThree + "\n\n" + subFour + "\n\n") } -func (m model) warnModalRender() string { +func (m *model) warnModalRender() string { title := m.warnModal.title content := m.warnModal.content confirm := modalConfirm.Render(" (" + hotkeys.Confirm[0] + ") Confirm ") @@ -451,7 +453,7 @@ func (m model) warnModalRender() string { return modalBorderStyle(modalHeight, modalWidth).Render(title + "\n\n" + content + "\n\n" + tip) } -func (m model) helpMenuRender() string { +func (m *model) helpMenuRender() string { helpMenuContent := "" maxKeyLength := 0 @@ -536,7 +538,7 @@ func (m model) helpMenuRender() string { return helpMenuModalBorderStyle(m.helpMenu.height, m.helpMenu.width, bottomBorder).Render(helpMenuContent) } -func (m model) sortOptionsRender() string { +func (m *model) sortOptionsRender() string { panel := m.fileModel.filePanels[m.filePanelFocusIndex] sortOptionsContent := modalTitleStyle.Render(" Sort Options") + "\n\n" for i, option := range panel.sortOptions.data.options { @@ -551,7 +553,36 @@ func (m model) sortOptionsRender() string { return sortOptionsModalBorderStyle(panel.sortOptions.height, panel.sortOptions.width, bottomBorder).Render(sortOptionsContent) } -func (m model) filePreviewPanelRender() string { +func readFileContent(filepath string, maxLineLength int, previewLine int) (string, error) { + // String builder is much better for efficiency + // See - https://stackoverflow.com/questions/1760757/how-to-efficiently-concatenate-strings-in-go/47798475#47798475 + var resultBuilder strings.Builder + file, err := os.Open(filepath) + if err != nil { + return resultBuilder.String(), err + } + defer file.Close() + + scanner := bufio.NewScanner(file) + lineCount := 0 + for scanner.Scan() { + line := scanner.Text() + if len(line) > maxLineLength { + line = line[:maxLineLength] + } + // This is critical to avoid layout break, removes non Printable ASCII control characters. + line = makePrintable(line) + resultBuilder.WriteString(line+"\n") + lineCount++ + if previewLine > 0 && lineCount >= previewLine { + break + } + } + // returns the first non-EOF error that was encountered by the [Scanner] + return resultBuilder.String(), scanner.Err() +} + +func (m *model) filePreviewPanelRender() string { previewLine := m.mainPanelHeight + 2 m.fileModel.filePreview.width += m.fullWidth - Config.SidebarWidth - m.fileModel.filePreview.width - ((m.fileModel.width + 2) * len(m.fileModel.filePanels)) - 2 @@ -630,88 +661,44 @@ func (m model) filePreviewPanelRender() string { } format := lexers.Match(filepath.Base(itemPath)) - if format != nil { - var codeHighlight string - var err error - var fileContent string - file, err := os.Open(itemPath) + + if format == nil { + isText, err := isTextFile(itemPath) if err != nil { - outPutLog(err) - return box.Render("\n --- " + icon.Error + " Error open file ---") + outPutLog("Error while checking text file", err) + return box.Render("\n --- " + icon.Error + " Error get file info ---") + } else if !isText { + return box.Render("\n --- " + icon.Error + " Unsupported formats ---") } - defer file.Close() - - scanner := bufio.NewScanner(file) - lineCount := 0 + } - maxLineLength := m.fileModel.width + 20 - for scanner.Scan() { - line := scanner.Text() - if len(line) > maxLineLength { - line = line[:maxLineLength] - } - fileContent += line + "\n" - lineCount++ - if previewLine > 0 && lineCount >= previewLine { - break - } - } + // At this point either format is not nil, or we can read the file + fileContent , err := readFileContent(itemPath, m.fileModel.width+20, previewLine) + if err != nil { + outPutLog(err) + return box.Render("\n --- " + icon.Error + " Error open file ---") + } - if Config.TransparentBackground { - codeHighlight, err = ansichroma.HightlightString(fileContent, format.Config().Name, theme.CodeSyntaxHighlightTheme, "") - } else { - codeHighlight, err = ansichroma.HightlightString(fileContent, format.Config().Name, theme.CodeSyntaxHighlightTheme, theme.FilePanelBG) + // We know the format of file, and we can apply syntax highlighting + if format != nil { + background := "" + if ! Config.TransparentBackground { + background = theme.FilePanelBG } + fileContent, err = ansichroma.HightlightString(fileContent, format.Config().Name, theme.CodeSyntaxHighlightTheme, background) if err != nil { outPutLog("Error render code highlight", err) return box.Render("\n --- " + icon.Error + " Error render code highlight ---") } - if codeHighlight == "" { - return box.Render("\n --- empty ---") - } - - codeHighlight = checkAndTruncateLineLengths(codeHighlight, m.fileModel.filePreview.width) - - return box.Render(codeHighlight) - } else { - textFile, err := isTextFile(itemPath) - if err != nil { - outPutLog("Error check text file", err) - } - if textFile { - var fileContent string - file, err := os.Open(itemPath) - if err != nil { - outPutLog(err) - return box.Render("\n --- " + icon.Error + " Error open file ---") - } - defer file.Close() - - scanner := bufio.NewScanner(file) - lineCount := 0 - - for scanner.Scan() { - fileContent += scanner.Text() + "\n" - lineCount++ - if previewLine > 0 && lineCount >= previewLine { - break - } - } - - if err := scanner.Err(); err != nil { - outPutLog(err) - return box.Render("\n --- " + icon.Error + " Error open file ---") - } - - textContent := checkAndTruncateLineLengths(fileContent, m.fileModel.filePreview.width) - - return box.Render(textContent) - } } - return box.Render("\n --- " + icon.Error + " Unsupported formats ---") + if fileContent == "" { + return box.Render("\n --- empty ---") + } + fileContent = checkAndTruncateLineLengths(fileContent, m.fileModel.filePreview.width) + return box.Render(fileContent) } -func (m model) commandLineInputBoxRender() string { +func (m *model) commandLineInputBoxRender() string { return m.commandLine.input.View() } diff --git a/src/internal/string_function.go b/src/internal/string_function.go index 29213efb..1e33e466 100644 --- a/src/internal/string_function.go +++ b/src/internal/string_function.go @@ -3,6 +3,7 @@ package internal import ( "bufio" "fmt" + "io" "math" "os" "strings" @@ -142,6 +143,17 @@ func checkAndTruncateLineLengths(text string, maxLength int) string { return finalResult } +// Separated this out out for easy testing +func isBufferPrintable(buffer []byte) bool { + for _, b := range buffer { + // This will also handle b==0 + if !unicode.IsPrint(rune(b)) && !unicode.IsSpace(rune(b)) { + return false + } + } + return true +} + // Check file is text file or not func isTextFile(filename string) (bool, error) { file, err := os.Open(filename) @@ -152,19 +164,28 @@ func isTextFile(filename string) (bool, error) { reader := bufio.NewReader(file) buffer := make([]byte, 1024) - _, err = reader.Read(buffer) - if err != nil { + cnt, err := reader.Read(buffer) + if err != nil && err != io.EOF { return false, err } + return isBufferPrintable(buffer[:cnt]), nil +} - for _, b := range buffer { - if b == 0 { - return false, nil - } - if !unicode.IsPrint(rune(b)) && !unicode.IsSpace(rune(b)) { - return false, nil + +// Although some characters like `\x0b`(vertical tab) are printable, +// previewing them breaks the layout. +// So, among the "non-graphic" printable characters, we only need \n and \t +// Space and NBSP are already considered graphic by unicode. +func makePrintable(line string)(string) { + var sb strings.Builder + // This has to be looped byte-wise, looping it rune-wise + // or by using strings.Map would cause issues with strings like + // "(NBSP)\xa0" + for i:=0; i?,./;'[]", true}, + {"Horizontal Tab and NewLine\t\t\n\n", true}, + {"\xa0(NBSP)", true}, + {"\x0b(Vertical Tab)", true}, + {"\x0d(CR)", true}, + {"ASCII control characters : \x00(NULL)", false}, + {"\x05(ENQ)", false}, + {"\x0f(SI)", false}, + {"\x1b(ESC)", false}, + {"\x7f(DEL)", false}, + } + for _, tt := range inputs { + + t.Run(fmt.Sprintf("Testing if buffer %q is printable", tt.input), func(t* testing.T){ + result := isBufferPrintable([]byte(tt.input)) + if result != tt.expected { + t.Errorf("Expected %v, got %v", tt.expected, result) + } + }) + } +} + +func TestMakePrintable(t *testing.T) { + var inputs = []struct { + input string + expected string + } { + {"", ""}, + {"hello", "hello"}, + {"abcdABCD0123~!@#$%^&*()_+-={}|:\"<>?,./;'[]", "abcdABCD0123~!@#$%^&*()_+-={}|:\"<>?,./;'[]"}, + {"Horizontal Tab and NewLine\t\t\n\n", "Horizontal Tab and NewLine\t\t\n\n"}, + {"(NBSP)\xa0\xa0\xa0\xa0;", "(NBSP)\xa0\xa0\xa0\xa0;"}, + {"\x0b(Vertical Tab)", "(Vertical Tab)"}, + {"\x0d(CR)", "(CR)"}, + {"ASCII control characters : \x00(NULL)", "ASCII control characters : (NULL)"}, + {"\x05(ENQ)", "(ENQ)"}, + {"\x0f(SI)", "(SI)"}, + {"\x1b(ESC)", "(ESC)"}, + {"\x7f(DEL)", "(DEL)"}, + } + for _, tt := range inputs { + + t.Run(fmt.Sprintf("Make %q printable", tt.input), func(t* testing.T){ + result := makePrintable(tt.input) + if result != tt.expected { + t.Errorf("Expected %v, got %v", tt.expected, result) + } + }) + } +} + diff --git a/src/internal/style_function.go b/src/internal/style_function.go index 5e0c2741..77ab85df 100644 --- a/src/internal/style_function.go +++ b/src/internal/style_function.go @@ -223,7 +223,7 @@ func loadConfigError(value string) string { } // Generate config error style -func lodaHotkeysError(value string) string { +func loadHotkeysError(value string) string { return lipgloss.NewStyle().Foreground(lipgloss.Color("#FF5555")).Render("■ ERROR: ") + "Hotkeys file \"" + lipgloss.NewStyle().Foreground(lipgloss.Color("#00D9FF")).Render(value) + "\" invalidation" } diff --git a/src/internal/type_utils.go b/src/internal/type_utils.go new file mode 100644 index 00000000..74541d68 --- /dev/null +++ b/src/internal/type_utils.go @@ -0,0 +1,35 @@ +package internal + +// reset the items slice and set the cut value +func (c *copyItems) reset(cut bool) { + c.cut = cut + c.items = c.items[:0] +} + +// String method for easy logging +func(f focusPanelType) String() string { + switch f { + case nonePanelFocus: return "nonePanelFocus" + case processBarFocus: return "processBarFocus" + case sidebarFocus: return "sidebarFocus" + case metadataFocus: return "metadataFocus" + default: return "Invalid" + } +} + +func(f filePanelFocusType) String() string { + switch f { + case noneFocus: return "noneFocus" + case secondFocus: return "secondFocus" + case focus: return "focus" + default: return "Invalid" + } +} + +func(p panelMode) String() string { + switch p { + case selectMode: return "selectMode" + case browserMode: return "browserMode" + default: return "Invalid" + } +} \ No newline at end of file diff --git a/src/internal/wheel_function.go b/src/internal/wheel_function.go index 3a2c886e..170df359 100644 --- a/src/internal/wheel_function.go +++ b/src/internal/wheel_function.go @@ -2,7 +2,7 @@ package internal import tea "github.com/charmbracelet/bubbletea" -func wheelMainAction(msg string, m model, cmd tea.Cmd) (model, tea.Cmd) { +func wheelMainAction(msg string, m *model, cmd tea.Cmd) tea.Cmd { switch msg { case "wheel up": @@ -35,5 +35,5 @@ func wheelMainAction(msg string, m model, cmd tea.Cmd) (model, tea.Cmd) { }() } } - return m, cmd + return cmd } diff --git a/src/superfile_config/config.toml b/src/superfile_config/config.toml index 0542f326..c71ba05c 100644 --- a/src/superfile_config/config.toml +++ b/src/superfile_config/config.toml @@ -30,6 +30,9 @@ sort_order_reversed = false # Case sensitive sort by name (upper "B" comes before lower "a" if true). case_sensitive_sort = false # +# Whether to enable debug mode. +debug = false +# # ================ Style ================= # # If you don't have or don't want Nerdfont installed you can turn this off diff --git a/src/superfile_config/vimHotkeys.toml b/src/superfile_config/vimHotkeys.toml index 853ed666..6da2fbbb 100644 --- a/src/superfile_config/vimHotkeys.toml +++ b/src/superfile_config/vimHotkeys.toml @@ -20,7 +20,7 @@ toggle_reverse_sort = ['R', ''] # change focus focus_on_process_bar = ['ctrl+p', ''] focus_on_sidebar = ['ctrl+s', ''] -focus_on_metadata = ['ctrl+m', ''] +focus_on_metadata = ['ctrl+d', ''] # create file/directory and rename file_panel_item_create = ['a', ''] file_panel_item_rename = ['r', ''] diff --git a/website/package-lock.json b/website/package-lock.json index deca2274..46be9998 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.1", "dependencies": { "@astrojs/starlight": "^0.28.0", - "@expressive-code/plugin-collapsible-sections": "^0.38.0", + "@expressive-code/plugin-collapsible-sections": "^0.40.0", "@expressive-code/plugin-line-numbers": "^0.37.0", "@fontsource/ibm-plex-mono": "^5.0.8", "@fontsource/ibm-plex-serif": "^5.0.8", @@ -1574,18 +1574,18 @@ } }, "node_modules/@expressive-code/plugin-collapsible-sections": { - "version": "0.38.3", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-collapsible-sections/-/plugin-collapsible-sections-0.38.3.tgz", - "integrity": "sha512-0r1k4k5S7GBLIRBYFkMKeIyD9iYcwM+LBrwoxZtd9TtBYJ3ziWBleFlCoOA3fo/Mj2YcaN7ZRIscMzYY9JBWrA==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-collapsible-sections/-/plugin-collapsible-sections-0.40.0.tgz", + "integrity": "sha512-OktWRqYOC4g92wCK1dClYX1UGvO4WAkAv0gUd+kAuZH/lAaesl+TC0NWoLRY+fEqMx3co4YfKmboCmjXWmBwBw==", "license": "MIT", "dependencies": { - "@expressive-code/core": "^0.38.3" + "@expressive-code/core": "^0.40.0" } }, "node_modules/@expressive-code/plugin-collapsible-sections/node_modules/@expressive-code/core": { - "version": "0.38.3", - "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.38.3.tgz", - "integrity": "sha512-s0/OtdRpBONwcn23O8nVwDNQqpBGKscysejkeBkwlIeHRLZWgiTVrusT5Idrdz1d8cW5wRk9iGsAIQmwDPXgJg==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.40.0.tgz", + "integrity": "sha512-vKRxKaDVhSozGPETcPOB7NF8sn1ICZoO/UfUWs/4o+XmDIOSX7cBQX8BVukenvSksdv5Aaf/teuGzjxX0a7Ibw==", "license": "MIT", "dependencies": { "@ctrl/tinycolor": "^4.0.4", diff --git a/website/package.json b/website/package.json index 4964d84a..e80c36d5 100644 --- a/website/package.json +++ b/website/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@astrojs/starlight": "^0.28.0", - "@expressive-code/plugin-collapsible-sections": "^0.38.0", + "@expressive-code/plugin-collapsible-sections": "^0.40.0", "@expressive-code/plugin-line-numbers": "^0.37.0", "@fontsource/ibm-plex-mono": "^5.0.8", "@fontsource/ibm-plex-serif": "^5.0.8", diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index 0e37eb9c..49b8700a 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -10,24 +10,24 @@ importers: dependencies: '@astrojs/starlight': specifier: ^0.28.0 - version: 0.28.3(astro@4.16.17(rollup@4.28.1)(typescript@5.5.4)) + version: 0.28.6(astro@4.16.18(rollup@4.30.1)(typescript@5.7.3)) '@expressive-code/plugin-collapsible-sections': - specifier: ^0.38.0 - version: 0.38.3 + specifier: ^0.40.0 + version: 0.40.0 '@expressive-code/plugin-line-numbers': specifier: ^0.37.0 - version: 0.37.0 + version: 0.37.1 '@fontsource/ibm-plex-mono': specifier: ^5.0.8 - version: 5.1.0 + version: 5.1.1 '@fontsource/ibm-plex-serif': specifier: ^5.0.8 - version: 5.1.0 + version: 5.1.1 astro: - specifier: ^4.16.17 - version: 4.16.17(rollup@4.28.1)(typescript@5.5.4) + specifier: ^4.4.9 + version: 4.16.18(rollup@4.30.1)(typescript@5.7.3) hast-util-to-html: - specifier: ^9.0.4 + specifier: ^9.0.0 version: 9.0.4 sharp: specifier: ^0.33.0 @@ -48,8 +48,8 @@ packages: '@astrojs/markdown-remark@5.3.0': resolution: {integrity: sha512-r0Ikqr0e6ozPb5bvhup1qdWnSPUvQu6tub4ZLYaKyG50BXZ0ej6FhGz3GpChKpH7kglRFPObJd/bDyf2VM9pkg==} - '@astrojs/mdx@3.1.8': - resolution: {integrity: sha512-4o/+pvgoLFG0eG96cFs4t3NzZAIAOYu57fKAprWHXJrnq/qdBV0av6BYDjoESxvxNILUYoj8sdZVWtlPWVDLog==} + '@astrojs/mdx@3.1.9': + resolution: {integrity: sha512-3jPD4Bff6lIA20RQoonnZkRtZ9T3i0HFm6fcDF7BMsKIZ+xBP2KXzQWiuGu62lrVCmU612N+SQVGl5e0fI+zWg==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} peerDependencies: astro: ^4.8.0 @@ -58,11 +58,11 @@ packages: resolution: {integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - '@astrojs/sitemap@3.2.0': - resolution: {integrity: sha512-SkrOCL3Z6HxdiXreZ1+aPBWgnBMJ31EgPdcscgQeLqI2Gqk/4EKLuw9q0SqKU9MmHpcPXXtcd0odfCk4barPoA==} + '@astrojs/sitemap@3.2.1': + resolution: {integrity: sha512-uxMfO8f7pALq0ADL6Lk68UV6dNYjJ2xGUzyjjVj60JLBs5a6smtlkBYv3tQ0DzoqwS7c9n4FUx5lgv0yPo/fgA==} - '@astrojs/starlight@0.28.3': - resolution: {integrity: sha512-GXXIPKSu5d50mLVtgI4jf6pb3FPQm8n4MI6ZXuQQqqnA0xg7PJQ76WFSVyrICeqM5fKABSqcBksp/glyEJes/A==} + '@astrojs/starlight@0.28.6': + resolution: {integrity: sha512-lY+rbRMIVxDGiXhS4lBuVrU2jTUezEt4QeTxUTHxfj2tuKBwquG7Jg+alON6l+uaV+anbOkFb001MMXZF8X85w==} peerDependencies: astro: ^4.14.0 @@ -74,24 +74,24 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.3': - resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} + '@babel/compat-data@7.26.5': + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} engines: {node: '>=6.9.0'} '@babel/core@7.26.0': resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.3': - resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.25.9': resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.9': - resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': @@ -104,8 +104,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.25.9': - resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.9': @@ -124,8 +124,8 @@ packages: resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} engines: {node: '>=6.0.0'} hasBin: true @@ -141,28 +141,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.25.7': - resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} '@babel/template@7.25.9': resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.4': - resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + '@babel/traverse@7.26.5': + resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.3': - resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} engines: {node: '>=6.9.0'} '@ctrl/tinycolor@4.1.0': resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} engines: {node: '>=14'} - '@emnapi/runtime@1.2.0': - resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} @@ -305,20 +305,20 @@ packages: '@expressive-code/core@0.35.6': resolution: {integrity: sha512-xGqCkmfkgT7lr/rvmfnYdDSeTdCSp1otAHgoFS6wNEeO7wGDPpxdosVqYiIcQ8CfWUABh/pGqWG90q+MV3824A==} - '@expressive-code/core@0.37.0': - resolution: {integrity: sha512-uCPAaQ//5RZeeKAN9cMyGH8YIm+h1Rldy34IWMbsCECrFVo86w+eR67jVWoQ2HNe0dSZ4XTdgJKYEScuVcy2Cw==} + '@expressive-code/core@0.37.1': + resolution: {integrity: sha512-nYgsK3uxK4W46v0IolHdB5+T6MQfy5weTpyB3kbzr11ur2UKUy2oHGhbWa+hRThfYEF1PM+TFxMtWU7amcjF8A==} - '@expressive-code/core@0.38.3': - resolution: {integrity: sha512-s0/OtdRpBONwcn23O8nVwDNQqpBGKscysejkeBkwlIeHRLZWgiTVrusT5Idrdz1d8cW5wRk9iGsAIQmwDPXgJg==} + '@expressive-code/core@0.40.0': + resolution: {integrity: sha512-vKRxKaDVhSozGPETcPOB7NF8sn1ICZoO/UfUWs/4o+XmDIOSX7cBQX8BVukenvSksdv5Aaf/teuGzjxX0a7Ibw==} - '@expressive-code/plugin-collapsible-sections@0.38.3': - resolution: {integrity: sha512-0r1k4k5S7GBLIRBYFkMKeIyD9iYcwM+LBrwoxZtd9TtBYJ3ziWBleFlCoOA3fo/Mj2YcaN7ZRIscMzYY9JBWrA==} + '@expressive-code/plugin-collapsible-sections@0.40.0': + resolution: {integrity: sha512-OktWRqYOC4g92wCK1dClYX1UGvO4WAkAv0gUd+kAuZH/lAaesl+TC0NWoLRY+fEqMx3co4YfKmboCmjXWmBwBw==} '@expressive-code/plugin-frames@0.35.6': resolution: {integrity: sha512-CqjSWjDJ3wabMJZfL9ZAzH5UAGKg7KWsf1TBzr4xvUbZvWoBtLA/TboBML0U1Ls8h/4TRCIvR4VEb8dv5+QG3w==} - '@expressive-code/plugin-line-numbers@0.37.0': - resolution: {integrity: sha512-np3Z51zYycO9zYaiqH51LPsn7PFGIcENhD5l0iAy+RrJNK4b213VvydVWgqLq87efZtCXg+lMuY/U8P4lCAPMw==} + '@expressive-code/plugin-line-numbers@0.37.1': + resolution: {integrity: sha512-Tg8ZpJUwB1T4v3BKRjo5iqDslbOtXy7vI59NNq5K5JvvFs7j3FLHtxNQjDwown3sEDRTOFc1Yw6VulZ9afJ+yA==} '@expressive-code/plugin-shiki@0.35.6': resolution: {integrity: sha512-xm+hzi9BsmhkDUGuyAWIydOAWer7Cs9cj8FM0t4HXaQ+qCubprT6wJZSKUxuvFJIUsIOqk1xXFaJzGJGnWtKMg==} @@ -326,11 +326,11 @@ packages: '@expressive-code/plugin-text-markers@0.35.6': resolution: {integrity: sha512-/k9eWVZSCs+uEKHR++22Uu6eIbHWEciVHbIuD8frT8DlqTtHYaaiwHPncO6KFWnGDz5i/gL7oyl6XmOi/E6GVg==} - '@fontsource/ibm-plex-mono@5.1.0': - resolution: {integrity: sha512-XKsZNyRCj6tz8zlatHmniSoLVephMD5GQG2sXgcaEb8DkUO+O61r28uTlIMEZuoZXtP4c4STvL+KUlJM5jZOEg==} + '@fontsource/ibm-plex-mono@5.1.1': + resolution: {integrity: sha512-1aayqPe/ZkD3MlvqpmOHecfA3f2B8g+fAEkgvcCd3lkPP0pS1T0xG5Zmn2EsJQqr1JURtugPUH+5NqvKyfFZMQ==} - '@fontsource/ibm-plex-serif@5.1.0': - resolution: {integrity: sha512-x8/rprq/hc94eYugICIUJCyUVMC1rPpgmL8km5FhhXIl6l2soaYadLcx4bmVP/rvLr/cRtj4GCaV6ZnGg3jaPA==} + '@fontsource/ibm-plex-serif@5.1.1': + resolution: {integrity: sha512-5EVMKXP2kT5/sufDp2Hw96Zz5C7J6oBq13OWIGn2uhtGAsuE5E+e6hhUl0TJK0+EHYTfCS85ylcY5Vk2Q6ht/Q==} '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} @@ -455,8 +455,8 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@mdx-js/mdx@3.0.1': - resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -473,31 +473,31 @@ packages: '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - '@pagefind/darwin-arm64@1.1.1': - resolution: {integrity: sha512-tZ9tysUmQpFs2EqWG2+E1gc+opDAhSyZSsgKmFzhnWfkK02YHZhvL5XJXEZDqYy3s1FAKhwjTg8XDxneuBlDZQ==} + '@pagefind/darwin-arm64@1.3.0': + resolution: {integrity: sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==} cpu: [arm64] os: [darwin] - '@pagefind/darwin-x64@1.1.1': - resolution: {integrity: sha512-ChohLQ39dLwaxQv0jIQB/SavP3TM5K5ENfDTqIdzLkmfs3+JlzSDyQKcJFjTHYcCzQOZVeieeGq8PdqvLJxJxQ==} + '@pagefind/darwin-x64@1.3.0': + resolution: {integrity: sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow==} cpu: [x64] os: [darwin] - '@pagefind/default-ui@1.1.1': - resolution: {integrity: sha512-ZM0zDatWDnac/VGHhQCiM7UgA4ca8jpjA+VfuTJyHJBaxGqZMQnm4WoTz9E0KFcue1Bh9kxpu7uWFZfwpZZk0A==} + '@pagefind/default-ui@1.3.0': + resolution: {integrity: sha512-CGKT9ccd3+oRK6STXGgfH+m0DbOKayX6QGlq38TfE1ZfUcPc5+ulTuzDbZUnMo+bubsEOIypm4Pl2iEyzZ1cNg==} - '@pagefind/linux-arm64@1.1.1': - resolution: {integrity: sha512-H5P6wDoCoAbdsWp0Zx0DxnLUrwTGWGLu/VI1rcN2CyFdY2EGSvPQsbGBMrseKRNuIrJDFtxHHHyjZ7UbzaM9EA==} + '@pagefind/linux-arm64@1.3.0': + resolution: {integrity: sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ==} cpu: [arm64] os: [linux] - '@pagefind/linux-x64@1.1.1': - resolution: {integrity: sha512-yJs7tTYbL2MI3HT+ngs9E1BfUbY9M4/YzA0yEM5xBo4Xl8Yu8Qg2xZTOQ1/F6gwvMrjCUFo8EoACs6LRDhtMrQ==} + '@pagefind/linux-x64@1.3.0': + resolution: {integrity: sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ==} cpu: [x64] os: [linux] - '@pagefind/windows-x64@1.1.1': - resolution: {integrity: sha512-b7/qPqgIl+lMzkQ8fJt51SfguB396xbIIR+VZ3YrL2tLuyifDJ1wL5mEm+ddmHxJ2Fki340paPcDan9en5OmAw==} + '@pagefind/windows-x64@1.3.0': + resolution: {integrity: sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ==} cpu: [x64] os: [win32] @@ -510,115 +510,121 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.28.1': - resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} + '@rollup/rollup-android-arm-eabi@4.30.1': + resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.28.1': - resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} + '@rollup/rollup-android-arm64@4.30.1': + resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.28.1': - resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} + '@rollup/rollup-darwin-arm64@4.30.1': + resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.28.1': - resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} + '@rollup/rollup-darwin-x64@4.30.1': + resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.28.1': - resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} + '@rollup/rollup-freebsd-arm64@4.30.1': + resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.28.1': - resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} + '@rollup/rollup-freebsd-x64@4.30.1': + resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': - resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.28.1': - resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.28.1': - resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} + '@rollup/rollup-linux-arm64-gnu@4.30.1': + resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.28.1': - resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} + '@rollup/rollup-linux-arm64-musl@4.30.1': + resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': - resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': - resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.28.1': - resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.28.1': - resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} + '@rollup/rollup-linux-s390x-gnu@4.30.1': + resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.28.1': - resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} + '@rollup/rollup-linux-x64-gnu@4.30.1': + resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.28.1': - resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} + '@rollup/rollup-linux-x64-musl@4.30.1': + resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.28.1': - resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} + '@rollup/rollup-win32-arm64-msvc@4.30.1': + resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.28.1': - resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} + '@rollup/rollup-win32-ia32-msvc@4.30.1': + resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.28.1': - resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} + '@rollup/rollup-win32-x64-msvc@4.30.1': + resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} cpu: [x64] os: [win32] - '@shikijs/core@1.24.2': - resolution: {integrity: sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==} + '@shikijs/core@1.26.2': + resolution: {integrity: sha512-ORyu3MrY7dCC7FDLDsFSkBM9b/AT9/Y8rH+UQ07Rtek48pp0ZhQOMPTKolqszP4bBCas6FqTZQYt18BBamVl/g==} - '@shikijs/engine-javascript@1.24.2': - resolution: {integrity: sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==} + '@shikijs/engine-javascript@1.26.2': + resolution: {integrity: sha512-ngkIu9swLVo9Zt5QBtz5Sk08vmPcwuj01r7pPK/Zjmo2U2WyKMK4WMUMmkdQiUacdcLth0zt8u1onp4zhkFXKQ==} - '@shikijs/engine-oniguruma@1.24.2': - resolution: {integrity: sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==} + '@shikijs/engine-oniguruma@1.26.2': + resolution: {integrity: sha512-mlN7Qrs+w60nKrd7at7XkXSwz6728Pe34taDmHrG6LRHjzCqQ+ysg+/AT6/D2LMk0s2lsr71DjpI73430QP4/w==} - '@shikijs/types@1.24.2': - resolution: {integrity: sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==} + '@shikijs/langs@1.26.2': + resolution: {integrity: sha512-o5cdPycB2Kw3IgncHxWopWPiTkjAj7dG01fLkkUyj3glb5ftxL/Opecq9F54opMlrgXy7ZIqDERvFLlUzsCOuA==} - '@shikijs/vscode-textmate@9.3.1': - resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} + '@shikijs/themes@1.26.2': + resolution: {integrity: sha512-y4Pn6PM5mODz/e3yF6jAUG7WLKJzqL2tJ5qMJCUkMUB1VRgtQVvoa1cHh7NScryGXyrYGJ8nPnRDhdv2rw0xpA==} + + '@shikijs/types@1.26.2': + resolution: {integrity: sha512-PO2jucx2FIdlLBPYbIUlMtWSLs5ulcRcuV93cR3T65lkK5SJP4MGBRt9kmWGXiQc0f7+FHj/0BEawditZcI/fQ==} + + '@shikijs/vscode-textmate@10.0.1': + resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -677,9 +683,6 @@ packages: '@ungap/structured-clone@1.2.1': resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} - '@ungap/structured-clone@1.2.1': - resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -730,8 +733,8 @@ packages: peerDependencies: astro: ^4.0.0-beta || ^3.3.0 - astro@4.16.17: - resolution: {integrity: sha512-OuD+BP7U6OqQLKtZ/FJkU2S+TOlifxS/OKUbZOb5p6y+LLBa1J3zHRJrIl7DUSq6eXY+9wSWwbJpD9JS+lqhxA==} + astro@4.16.18: + resolution: {integrity: sha512-G7zfwJt9BDHEZwlaLNvjbInIw2hPryyD654314KV/XT34pJU6SfN1S+mWa8RAkALcZNJnJXCJmT3JXLQStD3Lw==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true @@ -762,8 +765,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.3: - resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -771,14 +774,14 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001689: - resolution: {integrity: sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==} + caniuse-lite@1.0.30001692: + resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chalk@5.4.0: - resolution: {integrity: sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q==} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} character-entities-html4@2.1.0: @@ -896,8 +899,8 @@ packages: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} - electron-to-chromium@1.5.74: - resolution: {integrity: sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==} + electron-to-chromium@1.5.80: + resolution: {integrity: sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==} emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -912,8 +915,14 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} @@ -942,6 +951,9 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} @@ -967,12 +979,12 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -1033,9 +1045,6 @@ packages: hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} - hast-util-from-parse5@8.0.2: resolution: {integrity: sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==} @@ -1063,14 +1072,14 @@ packages: hast-util-select@6.0.3: resolution: {integrity: sha512-OVRQlQ1XuuLP8aFVLYmC2atrfWHS5UD3shonxpnyrjcCkwtvmt/+N6kYJdcY4mkMJhxp4kj2EFIxQ9kvkkt/eQ==} - hast-util-to-estree@3.1.0: - resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + hast-util-to-estree@3.1.1: + resolution: {integrity: sha512-IWtwwmPskfSmma9RpzCappDUitC8t5jhAynHhc1m2+5trOgsrp7txscUSavc5Ic8PATyAjfrCK1wgtxh2cICVQ==} hast-util-to-html@9.0.4: resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} - hast-util-to-jsx-runtime@2.3.1: - resolution: {integrity: sha512-Rbemi1rzrkysSin0FDHZfsxYPoqLGHFfxFm28aOBHPibT7aqjy7kUgY636se9xbuCWUsFpWAYlmtGHQakiqtEA==} + hast-util-to-jsx-runtime@2.3.2: + resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} @@ -1084,9 +1093,6 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - hastscript@9.0.0: resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} @@ -1102,15 +1108,12 @@ packages: http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - i18next@23.15.2: - resolution: {integrity: sha512-zcPSWzCvw6uKnuYHIqs4W7hTuB9e3AFcSdZgvCWoPXIZsBjBd4djN2/2uOHIB+1DFFkQnMBXvhNg7J3WyCuywQ==} + i18next@23.16.8: + resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} @@ -1167,9 +1170,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} @@ -1252,11 +1252,8 @@ packages: mdast-util-directive@3.0.0: resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} - mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - - mdast-util-from-markdown@2.0.1: - resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} @@ -1282,8 +1279,8 @@ packages: mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} - mdast-util-mdx-jsx@3.1.3: - resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} mdast-util-mdx@3.0.0: resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} @@ -1297,9 +1294,6 @@ packages: mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} - mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} @@ -1310,9 +1304,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromark-core-commonmark@2.0.1: - resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} - micromark-core-commonmark@2.0.2: resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} @@ -1355,72 +1346,39 @@ packages: micromark-extension-mdxjs@3.0.0: resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} - micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} - micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} - micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} micromark-factory-mdx-expression@2.0.2: resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} - micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} - micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} - micromark-factory-title@2.0.1: resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} - micromark-factory-whitespace@2.0.1: resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} - micromark-util-character@2.1.1: resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} - micromark-util-chunked@2.0.1: resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} - micromark-util-classify-character@2.0.1: resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} - micromark-util-combine-extensions@2.0.1: resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} - micromark-util-decode-numeric-character-reference@2.0.2: resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} - micromark-util-decode-string@2.0.1: resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} @@ -1430,48 +1388,27 @@ packages: micromark-util-events-to-acorn@2.0.2: resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} - micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} - micromark-util-normalize-identifier@2.0.1: resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} - micromark-util-resolve-all@2.0.1: resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.1: - resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} - micromark-util-subtokenize@2.0.3: resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - micromark-util-types@2.0.1: resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} - micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - micromark@4.0.1: resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} @@ -1512,8 +1449,8 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - oniguruma-to-es@0.7.0: - resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==} + oniguruma-to-es@1.0.0: + resolution: {integrity: sha512-kihvp0O4lFwf5tZMkfanwQLIZ9ORe9OeOFgZonH0BQeThgwfJiaZFeOfvvJVnJIM9TiVmx0RDD35hUJDR0++rQ==} ora@8.1.1: resolution: {integrity: sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==} @@ -1523,8 +1460,8 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - p-limit@6.1.0: - resolution: {integrity: sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==} + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} p-locate@4.1.0: @@ -1535,27 +1472,24 @@ packages: resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} engines: {node: '>=18'} - p-timeout@6.1.3: - resolution: {integrity: sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw==} + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} engines: {node: '>=14.16'} p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pagefind@1.1.1: - resolution: {integrity: sha512-U2YR0dQN5B2fbIXrLtt/UXNS0yWSSYfePaad1KcBPTi0p+zRtsVjwmoPaMQgTks5DnHNbmDxyJUL5TGaLljK3A==} + pagefind@1.3.0: + resolution: {integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==} hasBin: true - parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} - parse5@7.2.0: - resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==} - parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} @@ -1563,9 +1497,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1595,10 +1526,6 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.4.49: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} @@ -1621,17 +1548,29 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.0: + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-recursion@4.3.0: - resolution: {integrity: sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==} + regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - regex@5.0.2: - resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} + regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} rehype-expressive-code@0.35.6: resolution: {integrity: sha512-pPdE+pRcRw01kxMOwHQjuRxgwlblZt5+wAc3w2aPGgmcnn57wYjn07iKO7zaznDxYVxMYVvYlnL+R3vWFQS4Gw==} @@ -1645,6 +1584,9 @@ packages: rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + rehype-stringify@10.0.1: resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} @@ -1657,8 +1599,8 @@ packages: remark-gfm@4.0.0: resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} - remark-mdx@3.0.1: - resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -1693,8 +1635,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.28.1: - resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} + rollup@4.30.1: + resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1721,8 +1663,8 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shiki@1.24.2: - resolution: {integrity: sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==} + shiki@1.26.2: + resolution: {integrity: sha512-iP7u2NA9A6JwRRCkIUREEX2cMhlYV5EBmbbSlfSRvPThwca8HBRbVkWuNWW+kw9+i6BSUZqqG6YeUs5dC2SjZw==} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} @@ -1787,14 +1729,11 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} - style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} - tinyexec@0.3.1: - resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -1816,15 +1755,15 @@ packages: typescript: optional: true - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-fest@4.30.2: - resolution: {integrity: sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==} + type-fest@4.32.0: + resolution: {integrity: sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw==} engines: {node: '>=16'} - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true @@ -1861,8 +1800,8 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -1910,8 +1849,8 @@ packages: terser: optional: true - vitefu@1.0.4: - resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==} + vitefu@1.0.5: + resolution: {integrity: sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: @@ -1993,7 +1932,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.1 remark-smartypants: 3.0.2 - shiki: 1.24.2 + shiki: 1.26.2 unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.0.0 @@ -2002,13 +1941,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@3.1.8(astro@4.16.17(rollup@4.28.1)(typescript@5.5.4))': + '@astrojs/mdx@3.1.9(astro@4.16.18(rollup@4.30.1)(typescript@5.7.3))': dependencies: '@astrojs/markdown-remark': 5.3.0 - '@mdx-js/mdx': 3.0.1 + '@mdx-js/mdx': 3.1.0(acorn@8.14.0) acorn: 8.14.0 - astro: 4.16.17(rollup@4.28.1)(typescript@5.5.4) - es-module-lexer: 1.5.4 + astro: 4.16.18(rollup@4.30.1)(typescript@5.7.3) + es-module-lexer: 1.6.0 estree-util-visit: 2.0.0 gray-matter: 4.0.3 hast-util-to-html: 9.0.4 @@ -2026,31 +1965,32 @@ snapshots: dependencies: prismjs: 1.29.0 - '@astrojs/sitemap@3.2.0': + '@astrojs/sitemap@3.2.1': dependencies: sitemap: 8.0.0 stream-replace-string: 2.0.0 zod: 3.24.1 - '@astrojs/starlight@0.28.3(astro@4.16.17(rollup@4.28.1)(typescript@5.5.4))': + '@astrojs/starlight@0.28.6(astro@4.16.18(rollup@4.30.1)(typescript@5.7.3))': dependencies: - '@astrojs/mdx': 3.1.8(astro@4.16.17(rollup@4.28.1)(typescript@5.5.4)) - '@astrojs/sitemap': 3.2.0 - '@pagefind/default-ui': 1.1.1 + '@astrojs/mdx': 3.1.9(astro@4.16.18(rollup@4.30.1)(typescript@5.7.3)) + '@astrojs/sitemap': 3.2.1 + '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - astro: 4.16.17(rollup@4.28.1)(typescript@5.5.4) - astro-expressive-code: 0.35.6(astro@4.16.17(rollup@4.28.1)(typescript@5.5.4)) + astro: 4.16.18(rollup@4.30.1)(typescript@5.7.3) + astro-expressive-code: 0.35.6(astro@4.16.18(rollup@4.30.1)(typescript@5.7.3)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.3 hast-util-to-string: 3.0.1 hastscript: 9.0.0 - i18next: 23.15.2 + i18next: 23.16.8 + js-yaml: 4.1.0 mdast-util-directive: 3.0.0 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 mdast-util-to-string: 4.0.0 - pagefind: 1.1.1 + pagefind: 1.3.0 rehype: 13.0.2 rehype-format: 5.0.1 remark-directive: 3.0.0 @@ -2078,20 +2018,20 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.3': {} + '@babel/compat-data@7.26.5': {} '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/helper-compilation-targets': 7.25.9 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.26.5 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 '@babel/template': 7.25.9 - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -2100,30 +2040,30 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.26.3': + '@babel/generator@7.26.5': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 - '@babel/helper-compilation-targets@7.25.9': + '@babel/helper-compilation-targets@7.26.5': dependencies: - '@babel/compat-data': 7.26.3 + '@babel/compat-data': 7.26.5 '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.3 + browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color @@ -2132,11 +2072,11 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/traverse': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.25.9': {} + '@babel/helper-plugin-utils@7.26.5': {} '@babel/helper-string-parser@7.25.9': {} @@ -2147,60 +2087,60 @@ snapshots: '@babel/helpers@7.26.0': dependencies: '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 - '@babel/parser@7.26.3': + '@babel/parser@7.26.5': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/runtime@7.25.7': + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 '@babel/template@7.25.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 - '@babel/traverse@7.26.4': + '@babel/traverse@7.26.5': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.3': + '@babel/types@7.26.5': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 '@ctrl/tinycolor@4.1.0': {} - '@emnapi/runtime@1.2.0': + '@emnapi/runtime@1.3.1': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 optional: true '@esbuild/aix-ppc64@0.21.5': @@ -2284,19 +2224,19 @@ snapshots: unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.1 - '@expressive-code/core@0.37.0': + '@expressive-code/core@0.37.1': dependencies: '@ctrl/tinycolor': 4.1.0 hast-util-select: 6.0.3 hast-util-to-html: 9.0.4 hast-util-to-text: 4.0.2 hastscript: 9.0.0 - postcss: 8.4.47 - postcss-nested: 6.2.0(postcss@8.4.47) + postcss: 8.4.49 + postcss-nested: 6.2.0(postcss@8.4.49) unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.1 - '@expressive-code/core@0.38.3': + '@expressive-code/core@0.40.0': dependencies: '@ctrl/tinycolor': 4.1.0 hast-util-select: 6.0.3 @@ -2308,30 +2248,30 @@ snapshots: unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.1 - '@expressive-code/plugin-collapsible-sections@0.38.3': + '@expressive-code/plugin-collapsible-sections@0.40.0': dependencies: - '@expressive-code/core': 0.38.3 + '@expressive-code/core': 0.40.0 '@expressive-code/plugin-frames@0.35.6': dependencies: '@expressive-code/core': 0.35.6 - '@expressive-code/plugin-line-numbers@0.37.0': + '@expressive-code/plugin-line-numbers@0.37.1': dependencies: - '@expressive-code/core': 0.37.0 + '@expressive-code/core': 0.37.1 '@expressive-code/plugin-shiki@0.35.6': dependencies: '@expressive-code/core': 0.35.6 - shiki: 1.24.2 + shiki: 1.26.2 '@expressive-code/plugin-text-markers@0.35.6': dependencies: '@expressive-code/core': 0.35.6 - '@fontsource/ibm-plex-mono@5.1.0': {} + '@fontsource/ibm-plex-mono@5.1.1': {} - '@fontsource/ibm-plex-serif@5.1.0': {} + '@fontsource/ibm-plex-serif@5.1.1': {} '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -2399,7 +2339,7 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.2.0 + '@emnapi/runtime': 1.3.1 optional: true '@img/sharp-win32-ia32@0.33.5': @@ -2425,7 +2365,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mdx-js/mdx@3.0.1': + '@mdx-js/mdx@3.1.0(acorn@8.14.0)': dependencies: '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 @@ -2433,15 +2373,16 @@ snapshots: '@types/mdx': 2.0.13 collapse-white-space: 2.1.0 devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 + estree-util-scope: 1.0.0 estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 - hast-util-to-jsx-runtime: 2.3.1 + hast-util-to-jsx-runtime: 2.3.2 markdown-extensions: 2.0.0 - periscopic: 3.1.0 - remark-mdx: 3.0.1 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 remark-parse: 11.0.0 remark-rehype: 11.1.1 source-map: 0.7.4 @@ -2451,6 +2392,7 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 transitivePeerDependencies: + - acorn - supports-color '@nodelib/fs.scandir@2.1.5': @@ -2463,118 +2405,126 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.18.0 '@oslojs/encoding@1.1.0': {} - '@pagefind/darwin-arm64@1.1.1': + '@pagefind/darwin-arm64@1.3.0': optional: true - '@pagefind/darwin-x64@1.1.1': + '@pagefind/darwin-x64@1.3.0': optional: true - '@pagefind/default-ui@1.1.1': {} + '@pagefind/default-ui@1.3.0': {} - '@pagefind/linux-arm64@1.1.1': + '@pagefind/linux-arm64@1.3.0': optional: true - '@pagefind/linux-x64@1.1.1': + '@pagefind/linux-x64@1.3.0': optional: true - '@pagefind/windows-x64@1.1.1': + '@pagefind/windows-x64@1.3.0': optional: true - '@rollup/pluginutils@5.1.4(rollup@4.28.1)': + '@rollup/pluginutils@5.1.4(rollup@4.30.1)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.28.1 + rollup: 4.30.1 - '@rollup/rollup-android-arm-eabi@4.28.1': + '@rollup/rollup-android-arm-eabi@4.30.1': optional: true - '@rollup/rollup-android-arm64@4.28.1': + '@rollup/rollup-android-arm64@4.30.1': optional: true - '@rollup/rollup-darwin-arm64@4.28.1': + '@rollup/rollup-darwin-arm64@4.30.1': optional: true - '@rollup/rollup-darwin-x64@4.28.1': + '@rollup/rollup-darwin-x64@4.30.1': optional: true - '@rollup/rollup-freebsd-arm64@4.28.1': + '@rollup/rollup-freebsd-arm64@4.30.1': optional: true - '@rollup/rollup-freebsd-x64@4.28.1': + '@rollup/rollup-freebsd-x64@4.30.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.28.1': + '@rollup/rollup-linux-arm-musleabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.28.1': + '@rollup/rollup-linux-arm64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.28.1': + '@rollup/rollup-linux-arm64-musl@4.30.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.28.1': + '@rollup/rollup-linux-riscv64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.28.1': + '@rollup/rollup-linux-s390x-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.28.1': + '@rollup/rollup-linux-x64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-musl@4.28.1': + '@rollup/rollup-linux-x64-musl@4.30.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.28.1': + '@rollup/rollup-win32-arm64-msvc@4.30.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.28.1': + '@rollup/rollup-win32-ia32-msvc@4.30.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.28.1': + '@rollup/rollup-win32-x64-msvc@4.30.1': optional: true - '@shikijs/core@1.24.2': + '@shikijs/core@1.26.2': dependencies: - '@shikijs/engine-javascript': 1.24.2 - '@shikijs/engine-oniguruma': 1.24.2 - '@shikijs/types': 1.24.2 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/engine-javascript': 1.26.2 + '@shikijs/engine-oniguruma': 1.26.2 + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 hast-util-to-html: 9.0.4 - '@shikijs/engine-javascript@1.24.2': + '@shikijs/engine-javascript@1.26.2': dependencies: - '@shikijs/types': 1.24.2 - '@shikijs/vscode-textmate': 9.3.1 - oniguruma-to-es: 0.7.0 + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 + oniguruma-to-es: 1.0.0 - '@shikijs/engine-oniguruma@1.24.2': + '@shikijs/engine-oniguruma@1.26.2': dependencies: - '@shikijs/types': 1.24.2 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 - '@shikijs/types@1.24.2': + '@shikijs/langs@1.26.2': dependencies: - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/types': 1.26.2 + + '@shikijs/themes@1.26.2': + dependencies: + '@shikijs/types': 1.26.2 + + '@shikijs/types@1.26.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@9.3.1': {} + '@shikijs/vscode-textmate@10.0.1': {} '@types/acorn@4.0.6': dependencies: @@ -2582,24 +2532,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 '@types/cookie@0.6.0': {} @@ -2641,8 +2591,6 @@ snapshots: '@ungap/structured-clone@1.2.1': {} - '@ungap/structured-clone@1.2.1': {} - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -2673,12 +2621,12 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.35.6(astro@4.16.17(rollup@4.28.1)(typescript@5.5.4)): + astro-expressive-code@0.35.6(astro@4.16.18(rollup@4.30.1)(typescript@5.7.3)): dependencies: - astro: 4.16.17(rollup@4.28.1)(typescript@5.5.4) + astro: 4.16.18(rollup@4.30.1)(typescript@5.7.3) rehype-expressive-code: 0.35.6 - astro@4.16.17(rollup@4.28.1)(typescript@5.5.4): + astro@4.16.18(rollup@4.30.1)(typescript@5.7.3): dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/internal-helpers': 0.4.1 @@ -2686,9 +2634,9 @@ snapshots: '@astrojs/telemetry': 3.1.0 '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) '@types/babel__core': 7.20.5 '@types/cookie': 0.6.0 acorn: 8.14.0 @@ -2706,10 +2654,10 @@ snapshots: diff: 5.2.0 dlv: 1.1.3 dset: 3.1.4 - es-module-lexer: 1.5.4 + es-module-lexer: 1.6.0 esbuild: 0.21.5 estree-walker: 3.0.3 - fast-glob: 3.3.2 + fast-glob: 3.3.3 flattie: 1.1.1 github-slugger: 2.0.0 gray-matter: 4.0.3 @@ -2723,25 +2671,25 @@ snapshots: mrmime: 2.0.0 neotraverse: 0.6.18 ora: 8.1.1 - p-limit: 6.1.0 + p-limit: 6.2.0 p-queue: 8.0.1 preferred-pm: 4.0.0 prompts: 2.4.2 rehype: 13.0.2 semver: 7.6.3 - shiki: 1.24.2 - tinyexec: 0.3.1 - tsconfck: 3.1.4(typescript@5.5.4) + shiki: 1.26.2 + tinyexec: 0.3.2 + tsconfck: 3.1.4(typescript@5.7.3) unist-util-visit: 5.0.0 vfile: 6.0.3 vite: 5.4.11 - vitefu: 1.0.4(vite@5.4.11) + vitefu: 1.0.5(vite@5.4.11) which-pm: 3.0.0 xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 zod: 3.24.1 zod-to-json-schema: 3.24.1(zod@3.24.1) - zod-to-ts: 1.2.0(typescript@5.5.4)(zod@3.24.1) + zod-to-ts: 1.2.0(typescript@5.7.3)(zod@3.24.1) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -2777,10 +2725,10 @@ snapshots: dependencies: ansi-align: 3.0.1 camelcase: 8.0.0 - chalk: 5.4.0 + chalk: 5.4.1 cli-boxes: 3.0.0 string-width: 7.2.0 - type-fest: 4.30.2 + type-fest: 4.32.0 widest-line: 5.0.0 wrap-ansi: 9.0.0 @@ -2788,20 +2736,20 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.3: + browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001689 - electron-to-chromium: 1.5.74 + caniuse-lite: 1.0.30001692 + electron-to-chromium: 1.5.80 node-releases: 2.0.19 - update-browserslist-db: 1.1.1(browserslist@4.24.3) + update-browserslist-db: 1.1.2(browserslist@4.24.4) camelcase@8.0.0: {} - caniuse-lite@1.0.30001689: {} + caniuse-lite@1.0.30001692: {} ccount@2.0.1: {} - chalk@5.4.0: {} + chalk@5.4.1: {} character-entities-html4@2.1.0: {} @@ -2883,7 +2831,7 @@ snapshots: dset@3.1.4: {} - electron-to-chromium@1.5.74: {} + electron-to-chromium@1.5.80: {} emoji-regex-xs@1.0.0: {} @@ -2893,7 +2841,21 @@ snapshots: entities@4.5.0: {} - es-module-lexer@1.5.4: {} + es-module-lexer@1.6.0: {} + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.14.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 esbuild@0.21.5: optionalDependencies: @@ -2940,6 +2902,11 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + estree-util-to-js@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -2972,7 +2939,7 @@ snapshots: extend@3.0.2: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -2980,7 +2947,7 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fastq@1.17.1: + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -3045,22 +3012,11 @@ snapshots: dependencies: '@types/hast': 3.0.4 devlop: 1.1.0 - hast-util-from-parse5: 8.0.1 - parse5: 7.2.0 + hast-util-from-parse5: 8.0.2 + parse5: 7.2.1 vfile: 6.0.3 vfile-message: 4.0.2 - hast-util-from-parse5@8.0.1: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.5.0 - vfile: 6.0.3 - vfile-location: 5.0.3 - web-namespaces: 2.0.1 - hast-util-from-parse5@8.0.2: dependencies: '@types/hast': 3.0.4 @@ -3138,7 +3094,7 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 - hast-util-to-estree@3.1.0: + hast-util-to-estree@3.1.1: dependencies: '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 @@ -3149,11 +3105,11 @@ snapshots: estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 property-information: 6.5.0 space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 + style-to-object: 1.0.8 unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: @@ -3173,7 +3129,7 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.1: + hast-util-to-jsx-runtime@2.3.2: dependencies: '@types/estree': 1.0.6 '@types/hast': 3.0.4 @@ -3183,7 +3139,7 @@ snapshots: estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 property-information: 6.5.0 space-separated-tokens: 2.0.2 @@ -3218,14 +3174,6 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hastscript@8.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - hastscript@9.0.0: dependencies: '@types/hast': 3.0.4 @@ -3242,14 +3190,12 @@ snapshots: http-cache-semantics@4.1.1: {} - i18next@23.15.2: + i18next@23.16.8: dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 import-meta-resolve@4.1.0: {} - inline-style-parser@0.1.1: {} - inline-style-parser@0.2.4: {} is-alphabetical@2.0.1: {} @@ -3287,10 +3233,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-reference@3.0.2: - dependencies: - '@types/estree': 1.0.6 - is-unicode-supported@1.3.0: {} is-unicode-supported@2.1.0: {} @@ -3333,7 +3275,7 @@ snapshots: log-symbols@6.0.0: dependencies: - chalk: 5.4.0 + chalk: 5.4.1 is-unicode-supported: 1.3.0 longest-streak@3.1.0: {} @@ -3348,8 +3290,8 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 source-map-js: 1.2.1 markdown-extensions@2.0.0: {} @@ -3367,38 +3309,21 @@ snapshots: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 stringify-entities: 4.0.4 unist-util-visit-parents: 6.0.1 transitivePeerDependencies: - supports-color - mdast-util-find-and-replace@3.0.1: + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - mdast-util-from-markdown@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 @@ -3421,7 +3346,7 @@ snapshots: '@types/mdast': 4.0.4 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 + mdast-util-find-and-replace: 3.0.2 micromark-util-character: 2.1.1 mdast-util-gfm-footnote@2.0.0: @@ -3480,11 +3405,11 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@3.1.3: + mdast-util-mdx-jsx@3.2.0: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 @@ -3493,8 +3418,8 @@ snapshots: ccount: 2.0.1 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 @@ -3505,9 +3430,9 @@ snapshots: dependencies: mdast-util-from-markdown: 2.0.2 mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -3518,7 +3443,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -3539,17 +3464,6 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 - mdast-util-to-markdown@2.1.0: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - mdast-util-to-markdown@2.1.2: dependencies: '@types/mdast': 4.0.4 @@ -3568,25 +3482,6 @@ snapshots: merge2@1.4.1: {} - micromark-core-commonmark@2.0.1: - dependencies: - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - micromark-core-commonmark@2.0.2: dependencies: decode-named-character-reference: 1.0.2 @@ -3609,12 +3504,12 @@ snapshots: micromark-extension-directive@3.0.2: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - parse-entities: 4.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + parse-entities: 4.0.2 micromark-extension-gfm-autolink-literal@2.1.0: dependencies: @@ -3726,25 +3621,12 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.1 - micromark-factory-destination@2.0.0: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 - micromark-factory-label@2.0.0: - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 @@ -3764,23 +3646,11 @@ snapshots: unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 - micromark-factory-space@2.0.0: - dependencies: - micromark-util-character: 2.1.0 - micromark-util-types: 2.0.0 - micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-types: 2.0.1 - micromark-factory-title@2.0.0: - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 @@ -3788,13 +3658,6 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 - micromark-factory-whitespace@2.0.0: - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 @@ -3802,61 +3665,30 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 - micromark-util-character@2.1.0: - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 - micromark-util-chunked@2.0.0: - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-chunked@2.0.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-classify-character@2.0.0: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - micromark-util-classify-character@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 - micromark-util-combine-extensions@2.0.0: - dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 - micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 micromark-util-types: 2.0.1 - micromark-util-decode-numeric-character-reference@2.0.1: - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-decode-numeric-character-reference@2.0.2: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-decode-string@2.0.0: - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-decode-string@2.0.1: dependencies: decode-named-character-reference: 1.0.2 @@ -3877,22 +3709,12 @@ snapshots: micromark-util-types: 2.0.1 vfile-message: 4.0.2 - micromark-util-html-tag-name@2.0.0: {} - micromark-util-html-tag-name@2.0.1: {} - micromark-util-normalize-identifier@2.0.0: - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-normalize-identifier@2.0.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-resolve-all@2.0.0: - dependencies: - micromark-util-types: 2.0.0 - micromark-util-resolve-all@2.0.1: dependencies: micromark-util-types: 2.0.1 @@ -3903,13 +3725,6 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.1: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - micromark-util-subtokenize@2.0.3: dependencies: devlop: 1.1.0 @@ -3917,36 +3732,10 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 - micromark-util-symbol@2.0.0: {} - micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.0: {} - micromark-util-types@2.0.1: {} - micromark@4.0.0: - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.0 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.1 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - transitivePeerDependencies: - - supports-color - micromark@4.0.1: dependencies: '@types/debug': 4.1.12 @@ -3998,15 +3787,15 @@ snapshots: dependencies: mimic-function: 5.0.1 - oniguruma-to-es@0.7.0: + oniguruma-to-es@1.0.0: dependencies: emoji-regex-xs: 1.0.0 - regex: 5.0.2 - regex-recursion: 4.3.0 + regex: 5.1.1 + regex-recursion: 5.1.1 ora@8.1.1: dependencies: - chalk: 5.4.0 + chalk: 5.4.1 cli-cursor: 5.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 @@ -4020,7 +3809,7 @@ snapshots: dependencies: p-try: 2.2.0 - p-limit@6.1.0: + p-limit@6.2.0: dependencies: yocto-queue: 1.1.1 @@ -4031,24 +3820,23 @@ snapshots: p-queue@8.0.1: dependencies: eventemitter3: 5.0.1 - p-timeout: 6.1.3 + p-timeout: 6.1.4 - p-timeout@6.1.3: {} + p-timeout@6.1.4: {} p-try@2.2.0: {} - pagefind@1.1.1: + pagefind@1.3.0: optionalDependencies: - '@pagefind/darwin-arm64': 1.1.1 - '@pagefind/darwin-x64': 1.1.1 - '@pagefind/linux-arm64': 1.1.1 - '@pagefind/linux-x64': 1.1.1 - '@pagefind/windows-x64': 1.1.1 + '@pagefind/darwin-arm64': 1.3.0 + '@pagefind/darwin-x64': 1.3.0 + '@pagefind/linux-arm64': 1.3.0 + '@pagefind/linux-x64': 1.3.0 + '@pagefind/windows-x64': 1.3.0 - parse-entities@4.0.1: + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 - character-entities: 2.0.2 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 decode-named-character-reference: 1.0.2 @@ -4065,22 +3853,12 @@ snapshots: unist-util-visit-children: 3.0.0 vfile: 6.0.3 - parse5@7.2.0: - dependencies: - entities: 4.5.0 - parse5@7.2.1: dependencies: entities: 4.5.0 path-exists@4.0.0: {} - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.6 - estree-walker: 3.0.3 - is-reference: 3.0.2 - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -4093,11 +3871,6 @@ snapshots: dependencies: find-up: 4.1.0 - postcss-nested@6.2.0(postcss@8.4.47): - dependencies: - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 - postcss-nested@6.2.0(postcss@8.4.49): dependencies: postcss: 8.4.49 @@ -4108,12 +3881,6 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.47: - dependencies: - nanoid: 3.3.8 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.4.49: dependencies: nanoid: 3.3.8 @@ -4137,15 +3904,46 @@ snapshots: queue-microtask@1.2.3: {} + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.0): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.6 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + regenerator-runtime@0.14.1: {} - regex-recursion@4.3.0: + regex-recursion@5.1.1: dependencies: + regex: 5.1.1 regex-utilities: 2.3.0 regex-utilities@2.3.0: {} - regex@5.0.2: + regex@5.1.1: dependencies: regex-utilities: 2.3.0 @@ -4170,6 +3968,14 @@ snapshots: hast-util-raw: 9.1.0 vfile: 6.0.3 + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.1 + transitivePeerDependencies: + - supports-color + rehype-stringify@10.0.1: dependencies: '@types/hast': 3.0.4 @@ -4203,7 +4009,7 @@ snapshots: transitivePeerDependencies: - supports-color - remark-mdx@3.0.1: + remark-mdx@3.1.0: dependencies: mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 @@ -4272,29 +4078,29 @@ snapshots: reusify@1.0.4: {} - rollup@4.28.1: + rollup@4.30.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.28.1 - '@rollup/rollup-android-arm64': 4.28.1 - '@rollup/rollup-darwin-arm64': 4.28.1 - '@rollup/rollup-darwin-x64': 4.28.1 - '@rollup/rollup-freebsd-arm64': 4.28.1 - '@rollup/rollup-freebsd-x64': 4.28.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 - '@rollup/rollup-linux-arm-musleabihf': 4.28.1 - '@rollup/rollup-linux-arm64-gnu': 4.28.1 - '@rollup/rollup-linux-arm64-musl': 4.28.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 - '@rollup/rollup-linux-riscv64-gnu': 4.28.1 - '@rollup/rollup-linux-s390x-gnu': 4.28.1 - '@rollup/rollup-linux-x64-gnu': 4.28.1 - '@rollup/rollup-linux-x64-musl': 4.28.1 - '@rollup/rollup-win32-arm64-msvc': 4.28.1 - '@rollup/rollup-win32-ia32-msvc': 4.28.1 - '@rollup/rollup-win32-x64-msvc': 4.28.1 + '@rollup/rollup-android-arm-eabi': 4.30.1 + '@rollup/rollup-android-arm64': 4.30.1 + '@rollup/rollup-darwin-arm64': 4.30.1 + '@rollup/rollup-darwin-x64': 4.30.1 + '@rollup/rollup-freebsd-arm64': 4.30.1 + '@rollup/rollup-freebsd-x64': 4.30.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 + '@rollup/rollup-linux-arm-musleabihf': 4.30.1 + '@rollup/rollup-linux-arm64-gnu': 4.30.1 + '@rollup/rollup-linux-arm64-musl': 4.30.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 + '@rollup/rollup-linux-riscv64-gnu': 4.30.1 + '@rollup/rollup-linux-s390x-gnu': 4.30.1 + '@rollup/rollup-linux-x64-gnu': 4.30.1 + '@rollup/rollup-linux-x64-musl': 4.30.1 + '@rollup/rollup-win32-arm64-msvc': 4.30.1 + '@rollup/rollup-win32-ia32-msvc': 4.30.1 + '@rollup/rollup-win32-x64-msvc': 4.30.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4338,13 +4144,15 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - shiki@1.24.2: + shiki@1.26.2: dependencies: - '@shikijs/core': 1.24.2 - '@shikijs/engine-javascript': 1.24.2 - '@shikijs/engine-oniguruma': 1.24.2 - '@shikijs/types': 1.24.2 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/core': 1.26.2 + '@shikijs/engine-javascript': 1.26.2 + '@shikijs/engine-oniguruma': 1.26.2 + '@shikijs/langs': 1.26.2 + '@shikijs/themes': 1.26.2 + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 signal-exit@4.1.0: {} @@ -4403,15 +4211,11 @@ snapshots: strip-bom@3.0.0: {} - style-to-object@0.4.4: - dependencies: - inline-style-parser: 0.1.1 - style-to-object@1.0.8: dependencies: inline-style-parser: 0.2.4 - tinyexec@0.3.1: {} + tinyexec@0.3.2: {} to-regex-range@5.0.1: dependencies: @@ -4421,16 +4225,16 @@ snapshots: trough@2.2.0: {} - tsconfck@3.1.4(typescript@5.5.4): + tsconfck@3.1.4(typescript@5.7.3): optionalDependencies: - typescript: 5.5.4 + typescript: 5.7.3 - tslib@2.7.0: + tslib@2.8.1: optional: true - type-fest@4.30.2: {} + type-fest@4.32.0: {} - typescript@5.5.4: {} + typescript@5.7.3: {} unified@11.0.5: dependencies: @@ -4488,9 +4292,9 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - update-browserslist-db@1.1.1(browserslist@4.24.3): + update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -4515,11 +4319,11 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.28.1 + rollup: 4.30.1 optionalDependencies: fsevents: 2.3.3 - vitefu@1.0.4(vite@5.4.11): + vitefu@1.0.5(vite@5.4.11): optionalDependencies: vite: 5.4.11 @@ -4553,9 +4357,9 @@ snapshots: dependencies: zod: 3.24.1 - zod-to-ts@1.2.0(typescript@5.5.4)(zod@3.24.1): + zod-to-ts@1.2.0(typescript@5.7.3)(zod@3.24.1): dependencies: - typescript: 5.5.4 + typescript: 5.7.3 zod: 3.24.1 zod@3.24.1: {} diff --git a/website/src/content/docs/configure/custom-hotkeys.mdx b/website/src/content/docs/configure/custom-hotkeys.mdx index 1171eda1..fe55203f 100644 --- a/website/src/content/docs/configure/custom-hotkeys.mdx +++ b/website/src/content/docs/configure/custom-hotkeys.mdx @@ -1,6 +1,6 @@ --- title: Custom hotkeys -description: Custom your own hotkeys +description: Customize your own hotkeys head: - tag: title content: Custom hotkeys | superfile @@ -16,6 +16,13 @@ You can enter the following command to set it up; $EDITOR HOTKEYS_PATH ``` +:::caution +Please do not use hotkeys with ascii codes conflicting with keys used to control superfile : +- `Ctrl+M` - conflicts with `Enter` Key +- `Ctrl+I` - conflicts with `Tab` Key +- `Ctrl+?`, `Ctrl+[` - conflicts with `Delete` and `Backspace` Key +::: + ### Default superfile hotkeys :::caution diff --git a/website/src/content/docs/configure/superfile-config.mdx b/website/src/content/docs/configure/superfile-config.mdx index 270e651c..5fcc76f3 100644 --- a/website/src/content/docs/configure/superfile-config.mdx +++ b/website/src/content/docs/configure/superfile-config.mdx @@ -104,6 +104,14 @@ File panel sorting case sensitivity (if `true`, uppercase letters come before lo `false` => Case insensitive ("a" comes before "B") +- ###### debug + +Whether to enable debug mode. (if `true`, more verbose logs are written in log file). + +`true` => DEBUG, INFO, WARN, ERROR logs are written to log file + +`false` => INFO, WARN, ERROR logs are written to log file + ### Style - ###### transparent_background