diff --git a/docs/404.html b/docs/404.html index e90a4fd..eddb4fa 100644 --- a/docs/404.html +++ b/docs/404.html @@ -24,10 +24,10 @@ Coho.UI, WPF Library documentation - + -

404

How did we get here?
Take me home
- +

404

That's a Four-Oh-Four.
Take me home
+ diff --git a/docs/assets/404.html-bbf19de9.js b/docs/assets/404.html-bbf19de9.js new file mode 100644 index 0000000..3327018 --- /dev/null +++ b/docs/assets/404.html-bbf19de9.js @@ -0,0 +1 @@ +import{_ as e,o as c,c as t}from"./app-47cf4121.js";const _={};function o(r,n){return c(),t("div")}const a=e(_,[["render",o],["__file","404.html.vue"]]);export{a as default}; diff --git a/docs/assets/ApplicationWindow.html-85d1acf8.js b/docs/assets/ApplicationWindow.html-85d1acf8.js new file mode 100644 index 0000000..f78fc4a --- /dev/null +++ b/docs/assets/ApplicationWindow.html-85d1acf8.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a,a as o,b as n}from"./app-47cf4121.js";const i="/Coho.UI/assets/ribbonbarwindow-d80a3311.png",s="/Coho.UI/assets/menubarwindow-7ec05645.png",c={},r=o("h1",{id:"applicationwindow",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#applicationwindow","aria-hidden":"true"},"#"),n(" ApplicationWindow")],-1),l=o("p",null,"The ApplicationWindow base class lets you create the main window of your application that will contain the RibbonBar or the MenuBar.",-1),p=o("p",null,[o("img",{src:i,alt:"PageFabric app uses the RibbonBar"})],-1),d=o("p",null,[o("img",{src:s,alt:"PowerDocs app uses the MenuBar"})],-1),_=[r,l,p,d];function h(u,w){return t(),a("div",null,_)}const m=e(c,[["render",h],["__file","ApplicationWindow.html.vue"]]);export{m as default}; diff --git a/docs/assets/FolderPickerTextbox.html-993af2a2.js b/docs/assets/FolderPickerTextbox.html-993af2a2.js new file mode 100644 index 0000000..430d6f4 --- /dev/null +++ b/docs/assets/FolderPickerTextbox.html-993af2a2.js @@ -0,0 +1,2 @@ +import{_ as e,o as t,c as a,e as A}from"./app-47cf4121.js";const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZ8AAABkCAYAAABZwD36AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAzPSURBVHhe7d13jJRFGMfxOeSAUwQpYkEEg93Y0AiWGGvErtForFgSjUaNJZogYo+iif6hotGg0aCiUaOxx947kSNq7Fg4sVAsJ8gBnvd7dubuZW/X23az7ftJ3uy+87777vsuxzzvzLwz09Da2truAACIqI9/BQAgGoIPACA6gg8AIDqCDwAgOoIPACA6gg8AIDqCDwAgOoIPACA6gg8AIDqCDwAguobm5maG1wEAZNWnTx/Xv39/WwYNGuQaGxv9lsI1tHfw7wEA6EZhYuXKlW7ZsmWupaXFAtA666zjtxaG4AMAyJlCxvz5811DQ4MbMmSIT80fbT4AgJwp6IwcOdItX77clkIRfAAAeVEb0AYbbOD++OMPn5I/gg8AIG/9+vWj5AMAiKtv376ura3Nr+WP4AMAiI7gAwCIjuADAIiO4AMAiI7gAwCIjuADAIiO4AMAiI7gAwCIjuADAIgu+qjWK1ascAsXLrShubWsWrXKbwEA9IY11ljDNTU12TJ06FCbl6cU5s6d68aOHevX8hM1+Pz+++9uwYIFbqONNrIfQcMzAAB6n270//nnH5sOYdiwYW748OF+S+GKCT7Rqt0UeDQC6pZbbunWXnttAg8ARKTSz1prreU233xzGxD0119/9VvKI0rJR1VtP/74oxszZowNxQ0Ata7cTQzJqjZN+jZgwAC/JTUh3Lx582xaBG0vVMVXu6mqbeDAgVbiAYBaVylNDMmqNk17PWLECJsMTpT+22+/uVGjRtl6ISq+2k1Rv5joCgDVopKaGJJVbStXrnQ///yz35Kaj0d5c7lECz608QCodapqW7x4sZUmQgmjEuhcNtxwQ8uLly5damlqAlHpp1yiBB8epwZQD9TGs+6661Zk23YIQIsWLfIp5UXrPwCUSKU3MZS7qi2J4AMAJVLpTQzlrmpLIvgAQInQxJA7gg8AIDqCDwAgOoIPACA6gg8AIDqCDwAgOoIPACC6qgw+O+20U9bl7rvv9nut7sgjj3QXX3yxX8vu+OOP73bM8ePHu0MPPdRNnz7d/fDDD35PAEChqrbks/HGG7sjjjii26JpGzI56qij3CuvvOK+//57n5LdoEGDVjvmvvvuax2z7rnnHgtit99+u98ThdDAixdeeKG79tprfQqAelO1wWfbbbd1U6dO7bYoUGRyyCGHWM/jZ555xqdkpzkukse87rrr3IsvvuhmzZplwU2lq2wlLPTsl19+ca+//rpra2vzKQDqTd20+WguiwMOOMA98sgjPiV/Gpb8oYceslLXXXfdlVMpCgDQXc0GH1XtHHTQQbbovey3337uzz//dG+88YatF6KxsdGddtppNjfGSy+95FO7PP300+6YY47pbC/af//9rZpOQ61nogmnLrvsMrf33nt3ti+deuqpfqtzl19+uaVnkmmbSmRK++KLL9yjjz7aedzDDz/cNTc32z4ffPCBO+mkkzq/T9Vfmc5Paffff79dQ9j3oosusnNOSn7nc889Z9+l9T322KPbsdWmpkVUCtV+WlSyDHTe+ncL2/R7hnMHUBvqpuQje+65p5VannrqKZ9SmIkTJ9rrN998Y6+BHmi44oorXP/+/d2ll15qyyabbGKZ8+mnn94tg1cQVJvSa6+9ZtWC11xzjTvjjDMssBXr4Ycftkz8nHPOscxek0jp2O+++64799xz3Q477GDft/XWW7vHH3/c3Xzzzf6TXbT91ltvtaCj9yeffLJ7//333aRJk2wGxHRvvfWW7X/YYYfZtWsWx/Rj6xzOP/98e7/jjjvacbVsscUWlnb11Ve766+/3ibiUvrZZ5/tWltbyz7fPIAS0zTava3jrtW/K41x48a1T5061a/lZ+bMmfb57777zqes7rjjjrOlJ+n7zZo1y447Y8YMn9Klo/Rg26ZPn+5T2ts7MtP2XXbZpb2jVGHvs9F16rOZZNqm71eazq2trc2ntrd3BAFL16L3gfbpCIB2Lsn9w/XMmTPHp6R88sknlj5t2jSf0vWd6deSPPaSJUt8anv7559/bvun/xtqH6VPnjzZp6ToOP/3GwGVotR5XW9InmOx56vPd9wcFrRUbcknWWWTXHqSz4MH+VBJQ6UqlXDSnXDCCbZNVVLBk08+aSUcVblp8qlSU1WVqgiDvfbay141mZRKW4H2UdWczuXbb7/1qanrOfjgg93222/vU1K22WYbt/POO7vZs2f7lC4qpSSvJXnslpYWn9qzv/76y79L0XF64zcCUD5VG3yyPWrdEz14oDYJPXiQrR0mF8ogw7wdyljV/2fChAm2nomqmH766afOTLijBGGfV1Vgb9hss838uxRdt+gpwXSa4z0pXE+2AP/RRx91q3KU9O+UcGxde090jgp477zzjlXP6XsA1KaqDT7ZHrXOhTI4PXigtpZCKHNWZqpSgHQUIe11+PDh9prJyJEj7TXsq8eNx44da+97Q7YJrbKlJ4Vz1NOBoU0m05Iul2P3RP+GKkF99tln7swzz7QHD5IlRgC1oa4eOAhUlaQG9xdeeMGn5Of555+311133dVeQ6ar+duzCdvWW289e9Vn0p8aqxThegYMGND5xGCmpTeoik1Vl6+++qqbPHmypalqUo+4A7VKtTAvv/yy+/LLL31Kypw5c9zbb7/t11KWLl3qnn322YrNP3JVl8FH1BaR64gHSZ9++qn18VGpJ1SZqQSjURHee+89W89E21RVGKq/9HmVvpp7eIQ4VFtlqub6+uuv/bvSCtfz4Ycf+pTSyqWEpCB09NFHu/vuu8/ORf/ZgFr12GOPuUsuucRK+4FqWHQjdt55560WgPREqWoIrrzySp9Sneo2+BTy4IH68OiPY/DgwW7KlCk+NeXEE0+0dpJMIx888MADtu3YY4/1KV2Pa9900012J5NNeARZd0VJqopSv5reovNT1WKm69F3ZwqGuQrVjekPFqg/VvpvoQcNBg4c6JqamnwKUHtGjBhhr6NGjbJX0Y3nsGHDLJ9KVumH2pNQlV+tGvS4nH/fa+bOneu22247v1Y8NXqrFDFu3Dif0kX/SGeddZZlZKEz44MPPthZ4kgKw+ao+k132qLPqDi7zz772LosWbLEffzxx1ZSUaO6+qGo/06Sis0KTCrJqO9MePhBHVHVqVPtTOrDknTvvffaXYzu7HWXr2Pqu9UWNXPmTNtH16En1xYtWuQOPPBAt9tuu1mDvI6pwKT3ySfPFCzUqVXXHAJXoN8t03lk+oz68ag/j9qm9Dm1/2h8O1U5qj0mue//fWfYNm3aNOusGuiOTlUKelUw15BG+s+kvkS77767dQhetmyZBXz9/aR/HqhExeR1ykNCPpSUKT3bvrlInmOxebM+X2jbddWWfFSSeOKJJ7otb775pt+jZ+HBg9CGEygteUwFHnV6vOGGG6ztIT3wiP4Q7rzzTnfBBRdYoFBg06LOkVdddVW3DF9OOeUUd9ttt9l4cRq0VEVpjSgwevRov0fqCTAdV38gKnFoHxXHlTZkyBC/V+mpxKFOqhpI9auvvrJrueWWW+wuTOecHmTypXYcBWkFpzvuuMPu8nRHpwCj31vXeeONN9q++j4CD2pdtmCSKb3QwFNJqrLkU0q681aGqswcAIpRyXldQMmnQqh6TP1JGCQUAOKp++CjSeLUZpKs6gIA9K66Dz4AUCp9+pCl5opfCgBKRF0CVq1a5dcqz7///uv69evn18qL4AMAJaLgoy4JlUqD/FZKn7kowYeiKIB6oK4R6goR4SHigqiLSm920chHlKhQ6UVRACiFNddc0yaTTE5PUinmz59v+bA6tUu5q+CiBB8NUFnJRVEAKBUNkaMRCDRTsUaIVyZfLiqBacgqjS25ePFit+mmm/otqSo45c3lEqWT6d9//239aLbaaivX0NDgUwGgdmmkE41SrSGywjQlsWlcRFUFalSW9ddf36emgpLGhtTkkqEkVIhiOplGCT4yb948i7SZJhwDAMSjtp/ly5cXnR9XxQgH6sSp4KNBMzWacTmLogBQb5TnqgpOgxErD05WwZVDtJJPoKKoinvlLIoCQL0JVXAKOmEKh2JVRbUbAKC2MLAoAKCqEHwAANERfAAA0RF8AADREXwAANERfAAA0RF8AADREXwAANERfAAA0RF8AAB509xAjY2Nfi1/BB8AQN7a2tqKmoyO4AMAyItKPQsWLHCDBw/2Kfkj+AAAcqaxqBcuXOj69u3rmpqafGr+GNUaANAjzQekCehaWlqsum3o0KFFzUzd0NzcTPABAPwvPVygoKOqtmJKPEFDa2srwQcAEBVtPgCA6Ag+AIDoCD4AgOgIPgCA6Ag+AIDoCD4AgOgIPgCA6Ag+AIDoCD4AgOgIPgCA6Ag+AIDInPsPP3RNiLfIk1UAAAAASUVORK5CYII=",o={},d=A('

FolderPickerTextbox Control

Namespace: Coho.UI.Controls.Textboxes, inherits from TextBox

The FolderPickerTextbox is a text box that contains a button that allows the user to open the native folder picker dialog to select a folder.

Properties

Text

Type: string
The value of the text box.

Events

SelectionChanged

Type:EventHandler<string>
This event fires when the users selects a path in the folder picker dialog. The string argument is the selected path.

Examples

Example 1

<textboxes:FolderPickerTextbox x:Name="TbDefaultFolder" Width="240" />
+
`,13),n=[d];function l(s,i){return t(),a("div",null,n)}const p=e(o,[["render",l],["__file","FolderPickerTextbox.html.vue"]]);export{p as default}; diff --git a/docs/assets/GenericPickerTextbox.html-d349b0a2.js b/docs/assets/GenericPickerTextbox.html-d349b0a2.js new file mode 100644 index 0000000..cfd7c35 --- /dev/null +++ b/docs/assets/GenericPickerTextbox.html-d349b0a2.js @@ -0,0 +1 @@ +import{_ as e,o as c,c as r}from"./app-47cf4121.js";const t={};function o(n,_){return c(),r("div")}const s=e(t,[["render",o],["__file","GenericPickerTextbox.html.vue"]]);export{s as default}; diff --git a/docs/assets/MasterAccentSplitButton.html-800cdc56.js b/docs/assets/MasterAccentSplitButton.html-800cdc56.js new file mode 100644 index 0000000..a06a506 --- /dev/null +++ b/docs/assets/MasterAccentSplitButton.html-800cdc56.js @@ -0,0 +1,9 @@ +import{_ as e,o as t,c as a,e as n}from"./app-47cf4121.js";const o={},c=n(`

MasterAccentSplitButton Control

Namespace: Coho.UI.Controls.Buttons, inherits from Button

The MasterAccentSplitButton is a button that it usually used to start an activity in the application. For example, in Microsoft Office, you can find them in the Backstage view, to create new documents. It's a split button that uses the AccentColor resource as background. The text uses a semi bold weight. It supports an icon (brush resource).

Properties

Type: object
The content of the dropdown menu.

Icon

Type: brush
The icon to display in the button.

Text

Type: string
The text to display in the button.

Methods

None.

Events

Click

Type: RoutedEventHandler
Occurs when the user clicks the left part of the button.

Examples

Example 1

<buttons:MasterAccentSplitButton Text="Create new" Icon="{DynamicResource IconMagic}" Click="MasterAccentSplitButton_Click">
+   <buttons:MasterAccentSplitButton.DropDownContent>
+      <StackPanel>
+         <MenuItem Header="Item 1" />
+         <MenuItem Header="Item 2" />
+      </StackPanel>
+   </buttons:MasterAccentSplitButton.DropDownContent>
+</buttons:MasterAccentSplitButton>
+
`,18),r=[c];function i(d,s){return t(),a("div",null,r)}const h=e(o,[["render",i],["__file","MasterAccentSplitButton.html.vue"]]);export{h as default}; diff --git a/docs/assets/RibbonExtraButton.html-2f917ce5.js b/docs/assets/RibbonExtraButton.html-2f917ce5.js new file mode 100644 index 0000000..1d3af80 --- /dev/null +++ b/docs/assets/RibbonExtraButton.html-2f917ce5.js @@ -0,0 +1 @@ +import{_ as e,o,c as n,a as t,b as r}from"./app-47cf4121.js";const a={},c=t("h1",{id:"ribbonextrabutton-control",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#ribbonextrabutton-control","aria-hidden":"true"},"#"),r(" RibbonExtraButton control")],-1),s=[c];function i(_,b){return o(),n("div",null,s)}const l=e(a,[["render",i],["__file","RibbonExtraButton.html.vue"]]);export{l as default}; diff --git a/docs/assets/RibbonExtraButton.html-eda825ce.js b/docs/assets/RibbonExtraButton.html-eda825ce.js new file mode 100644 index 0000000..b3fe9c9 --- /dev/null +++ b/docs/assets/RibbonExtraButton.html-eda825ce.js @@ -0,0 +1 @@ +const t=JSON.parse('{"key":"v-6d080da6","path":"/controls/RibbonExtraButton.html","title":"RibbonExtraButton control","lang":"en-US","frontmatter":{},"headers":[],"git":{},"filePathRelative":"controls/RibbonExtraButton.md"}');export{t as data}; diff --git a/docs/assets/SecondaryWindow.html-8bdfc6d8.js b/docs/assets/SecondaryWindow.html-8bdfc6d8.js new file mode 100644 index 0000000..ff91045 --- /dev/null +++ b/docs/assets/SecondaryWindow.html-8bdfc6d8.js @@ -0,0 +1 @@ +import{_ as o,o as n,c as a,a as e,b as c}from"./app-47cf4121.js";const d={},t=e("h1",{id:"secondarywindow",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#secondarywindow","aria-hidden":"true"},"#"),c(" SecondaryWindow")],-1),r=e("p",null,"// todo",-1),s=[t,r];function _(i,l){return n(),a("div",null,s)}const f=o(d,[["render",_],["__file","SecondaryWindow.html.vue"]]);export{f as default}; diff --git a/docs/assets/SettingsTabControl.html-16858dfd.js b/docs/assets/SettingsTabControl.html-16858dfd.js new file mode 100644 index 0000000..cc2643d --- /dev/null +++ b/docs/assets/SettingsTabControl.html-16858dfd.js @@ -0,0 +1,13 @@ +import{_ as e,o as t,c as n,e as a}from"./app-47cf4121.js";const i="/Coho.UI/assets/settingstab-f30ee798.png",o={},s=a('

SettingsTabControl Control

Namespace: Coho.UI.Controls.TabControl, inherits from TabControl

The SettingsTabControl provides a TabControl to use in settings purpose.

Properties

Title

Type: string
The main title to be displayed at the top of the control, before the current section title.

Methods

None.

Events

None.

Examples

Example 1

<tabControl:SettingsTabControl Title="{x:Static localization:Resources.MenuSettings}">
+    <tabControl:SettingsTabControlItem Title="{x:Static localization:Resources.SettingsSectionGeneral}">
+    
+    ...
+    
+    </tabControl:SettingsTabControlItem>
+    <tabControl:SettingsTabControlItem Title="{x:Static localization:Resources.SettingsSectionEditor}">
+    
+    ...
+    
+    </tabControl:SettingsTabControlItem>
+</tabControl:SettingsTabControl>
+
`,14),r=[s];function l(d,c){return t(),n("div",null,r)}const b=e(o,[["render",l],["__file","SettingsTabControl.html.vue"]]);export{b as default}; diff --git a/docs/assets/SettingsTabControl.html-a77c8a24.js b/docs/assets/SettingsTabControl.html-a77c8a24.js new file mode 100644 index 0000000..8f8f8ba --- /dev/null +++ b/docs/assets/SettingsTabControl.html-a77c8a24.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-d3e07ca4","path":"/controls/SettingsTabControl.html","title":"SettingsTabControl Control","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Properties","slug":"properties","link":"#properties","children":[{"level":3,"title":"Title","slug":"title","link":"#title","children":[]}]},{"level":2,"title":"Methods","slug":"methods","link":"#methods","children":[]},{"level":2,"title":"Events","slug":"events","link":"#events","children":[]},{"level":2,"title":"Examples","slug":"examples","link":"#examples","children":[{"level":3,"title":"Example 1","slug":"example-1","link":"#example-1","children":[]}]}],"git":{},"filePathRelative":"controls/SettingsTabControl.md"}');export{e as data}; diff --git a/docs/assets/TabbedApplicationWindow.html-df8f4764.js b/docs/assets/TabbedApplicationWindow.html-df8f4764.js new file mode 100644 index 0000000..6974d0d --- /dev/null +++ b/docs/assets/TabbedApplicationWindow.html-df8f4764.js @@ -0,0 +1 @@ +import{_ as a,o,c as t,a as e,b as n}from"./app-47cf4121.js";const i={},c=e("h1",{id:"tabbedapplicationwindow",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#tabbedapplicationwindow","aria-hidden":"true"},"#"),n(" TabbedApplicationWindow")],-1),d=e("p",null,"// todo",-1),s=[c,d];function r(_,l){return o(),t("div",null,s)}const b=a(i,[["render",r],["__file","TabbedApplicationWindow.html.vue"]]);export{b as default}; diff --git a/docs/assets/ThemedInputBox.html-a9c1b6f9.js b/docs/assets/ThemedInputBox.html-a9c1b6f9.js new file mode 100644 index 0000000..6b5e1a9 --- /dev/null +++ b/docs/assets/ThemedInputBox.html-a9c1b6f9.js @@ -0,0 +1,7 @@ +import{_ as e,o as t,c as s,e as n}from"./app-47cf4121.js";const a="/Coho.UI/assets/inputbox-46f6e584.png",o={},i=n('

ThemedInputBox dialog

The ThemedInputBox is a dialog that provides a message and a TextBox so that the user can enter text.

Properties

None.

Methods

static string? Show(string message, string title, string defaultValue = "")

Shows a modal dialog using the current theme. Returns a string?.
If the returned value is null, it means that the user selected the Cancel button or closed the dialog.

Arguments

static string? Show(string message, string title, string defaultValue, string defaultButtonText, string secondaryButtonText)

Shows a modal dialog using the current theme. Returns a string?.
If the returned value is null, it means that the user selected the Cancel button or closed the dialog.

Arguments

static string? Show(string message, string title, Window owner, string defaultValue = "", string? defaultButtonText = null, string? secondaryButtonText = null

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.
This method can be used to override the default texts and provide a better UX while still using the default framework components.
This method should be used with the MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo arguments. The Yes button will be replaced with the defaultButtonText value, and the No button will be replaced with the secondaryButtonText.

Arguments

Events

None.

Examples

Example 1

This example shows how to use the ThemedInputBox from C# and handle the result.

string? value = ThemedInputBox.Show("Please provide name for this folder:", "Rename folder", this);
+
+if (!string.IsNullOrEmpty(value))
+{
+    // some code to rename a folder
+}
+
`,24),r=[i];function d(l,u){return t(),s("div",null,r)}const h=e(o,[["render",d],["__file","ThemedInputBox.html.vue"]]);export{h as default}; diff --git a/docs/assets/ThemedMessageBox.html-e81e6a12.js b/docs/assets/ThemedMessageBox.html-e81e6a12.js new file mode 100644 index 0000000..023360f --- /dev/null +++ b/docs/assets/ThemedMessageBox.html-e81e6a12.js @@ -0,0 +1,15 @@ +import{_ as e,o as t,c as s,e as n}from"./app-47cf4121.js";const a="/Coho.UI/assets/messagebox-c1159a2e.png",o={},i=n('

ThemedMessageBox dialog

The ThemedMessageBox is a dialog that replaces the default MessageBox using the current theme.

Properties

None.

Methods

static MessageBoxResult Show(string message, string title, MessageBoxButton button)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.

Arguments

static MessageBoxResult Show(string message, string title, MessageBoxButton button, string defaultButtonText, string secondaryButtonText)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.
This method can be used to override the default texts and provide a better UX while still using the default framework components.
This method should be used with the MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo arguments. The Yes button will be replaced with the defaultButtonText value, and the No button will be replaced with the secondaryButtonText.

Arguments

static MessageBoxResult Show(string message, string title, Window owner, MessageBoxButton button, string? defaultButtonText = null, string? secondaryButtonText = null)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.
This method can be used to override the default texts and provide a better UX while still using the default framework components.
This method should be used with the MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo arguments. The Yes button will be replaced with the defaultButtonText value, and the No button will be replaced with the secondaryButtonText.

Arguments

Events

None.

Examples

Example 1

This example shows how to use the ThemedMessageBox from C# and handle the result.

MessageBoxResult quest = ThemedMessageBox.Show("Do you want to save changes?", "Save changes", MessageBoxButton.YesNoCancel);
+
+switch (quest)
+{
+    case MessageBoxResult.Yes:
+        // Yes button was clicked
+    break;
+    case MessageBoxResult.No:
+        // No button was clicked
+    break;
+    case MessageBoxResult.Cancel:
+        // Cancel button was clicked
+    break;
+}
+
`,24),d=[i];function r(l,c){return t(),s("div",null,d)}const h=e(o,[["render",r],["__file","ThemedMessageBox.html.vue"]]);export{h as default}; diff --git a/docs/assets/ThemedOpenFileDialog.html-74844ce8.js b/docs/assets/ThemedOpenFileDialog.html-74844ce8.js new file mode 100644 index 0000000..5bf6013 --- /dev/null +++ b/docs/assets/ThemedOpenFileDialog.html-74844ce8.js @@ -0,0 +1,33 @@ +import{_ as t,r as o,o as i,c as l,a as n,d as p,w as c,b as s,e as a}from"./app-47cf4121.js";const u="/Coho.UI/assets/opendialog-d7c265c9.png",d={},r=a('

ThemedOpenFileDialog dialog

The ThemedOpenFileDialog is a dialog that replaces the default OpenFileDialog using the current theme.

Properties

None.

Methods

static string? Show(string title, Dictionary<string, string> fileTypes, Window owner)

Opens a dialog that lets the user browse the computer to open an existing file. Returns a string?.
When the result is null, it means that the user has closed the dialog without selecting a file.

Arguments

static string? Show(string title, ThemedSpecialDialogOptions options, Window owner, string? defaultButtonText = null, string? secondaryButtonText = null)

Opens a dialog that lets the user browse the computer to open an existing file. Returns a string?.
When the result is null, it means that the user has closed the dialog without selecting a file.

Arguments

',13),h=n("li",null,[n("code",null,"string"),s(" title : The title of the dialog")],-1),k=n("code",null,"ThemedSpecialDialogOptions",-1),m=n("li",null,[n("code",null,"Window"),s(" owner: The Window that will own the dialog")],-1),g=n("li",null,[n("code",null,"string"),s(" defaultButtonText : The text to display in the default button")],-1),v=n("li",null,[n("code",null,"string"),s(" secondaryButtonText : The text to in the the secondary button")],-1),w=a(`

Events

None.

Examples

Example 1

This example shows how to localize the ThemedOpenFileDialog texts.

public MainWindow()
+{
+  InitializeComponent();
+  Loaded += OnLoaded;
+}
+
+private void OnLoaded(object sender, RoutedEventArgs e)
+{
+  // Set Coho.UI Texts resources from your own localization resources
+  GenericText.Cancel = Localization.Resources.GenericCancel;
+  DialogsText.Open = Localization.Resources.GenericOpen;
+  DialogsText.FileName = Localization.Resources.GenericFileName;
+  DialogsText.FileType = Localization.Resources.GenericFileType;
+
+  ...
+}
+

Example 2

This example shows how to use the ThemedOpenFileDialog from C# and handle the result.

ThemedSpecialDialogOptions options = new ThemedSpecialDialogOptions()
+{
+    FileTypes =
+    {
+        {"All supported file types (*.md;*.pwdp)", "*.md;*.pwdp"},
+        {"Markdown file (*.md)", "*.md"},
+        {"PowerDocs Project file (*.pwdp)", "*.pwdp"}
+    }
+};
+
+string? filePath = ThemedOpenFileDialog.Show(Localization.Resources.MenuOpen, options, this);
+
+if (!string.IsNullOrEmpty(filePath))
+{
+    // open the selected file in your application
+}
+
`,9);function b(f,x){const e=o("RouterLink");return i(),l("div",null,[r,n("ul",null,[h,n("li",null,[p(e,{to:"/classes/ThemedSpecialDialogOptions.html"},{default:c(()=>[k]),_:1}),s(" options : The options to configure the dialog")]),m,g,v]),w])}const y=t(d,[["render",b],["__file","ThemedOpenFileDialog.html.vue"]]);export{y as default}; diff --git a/docs/assets/ThemedSaveFileDialog.html-e7ab8386.js b/docs/assets/ThemedSaveFileDialog.html-e7ab8386.js new file mode 100644 index 0000000..63b6d00 --- /dev/null +++ b/docs/assets/ThemedSaveFileDialog.html-e7ab8386.js @@ -0,0 +1,15 @@ +import{_ as n,o as s,c as a,e}from"./app-47cf4121.js";const t={},o=e(`

ThemedSaveFileDialog dialog

The ThemedSaveFileDialog is a dialog that replaces the default SaveFileDialog using the current theme.

Properties

None.

Methods

Show(string message, string title, MessageBoxButton button)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.

Arguments

Events

None.

Examples

Example 1

This example shows how to use the ThemedMessageBox from C# and handle the result.

string? filePath = ThemedOpenFileDialog.Show("Open file",
+                    new Dictionary<string, string>()
+                    {
+                        {"All supported file types (*.md;*.pwdp)", "*.md;*.pwdp"},
+                        {"Markdown file (*.md)", "*.md"},
+                        {"PowerDocs Project file (*.pwdp)", "*.pwdp"}
+                    }, 
+                    "",
+                    this);
+
+if (!string.IsNullOrEmpty(filePath))
+{
+    // open the selected file in your application
+}
+
`,15),i=[o];function p(c,l){return s(),a("div",null,i)}const d=n(t,[["render",p],["__file","ThemedSaveFileDialog.html.vue"]]);export{d as default}; diff --git a/docs/assets/ThemedSpecialDialogOptions.html-27641d7b.js b/docs/assets/ThemedSpecialDialogOptions.html-27641d7b.js new file mode 100644 index 0000000..2476364 --- /dev/null +++ b/docs/assets/ThemedSpecialDialogOptions.html-27641d7b.js @@ -0,0 +1 @@ +import{_ as i,r as o,o as d,c as r,a as e,b as a,d as s,w as h,e as n}from"./app-47cf4121.js";const l={},c=e("h1",{id:"themedspecialdialogoptions-class",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#themedspecialdialogoptions-class","aria-hidden":"true"},"#"),a(" ThemedSpecialDialogOptions class")],-1),p=e("code",null,"ThemedOpenFileDialog",-1),f=n('

Properties

DefaultHeight

Type: int
Default value: 650
The DefaultHeight property defines the initial height of the dialog in pixels.

DefaultWidth

Type: int
Default value: 920
The DefaultWidth property defines the initial width of the dialog in pixels.

FileTypes

Type: Dictionary<string, string>
Default value: default
The FileTypes property defines the extensions that are supported by the dialog.

InitialDirectory

Type: string
Default value: String.Empty
The InitialDirectory property defines the first folder to show when the dialog is opened.

ShowDefaultSpecialFolders

Type: bool
Default value: true
The ShowDefaultSpecialFolders property defines if the special folders (Documents, Images, Videos...) section will be displayed. This property has no effect if the ShowNavigationPane property is set to false.

ShowNavigationPane

Type: bool
Default value: true
The ShowNavigationPane property defines if the navigation pane (on the left side) will be displayed.

Methods

None.

Events

None.

',17);function u(g,b){const t=o("RouterLink");return d(),r("div",null,[c,e("p",null,[a("This class is used to configure the behavior of the "),s(t,{to:"/dialogs/ThemedOpenFileDialog.html"},{default:h(()=>[p]),_:1}),a(" dialog.")]),f])}const T=i(l,[["render",u],["__file","ThemedSpecialDialogOptions.html.vue"]]);export{T as default}; diff --git a/docs/assets/acryliccontextmenu.html-d9ab7f7d.js b/docs/assets/acryliccontextmenu.html-d9ab7f7d.js new file mode 100644 index 0000000..1c2ef08 --- /dev/null +++ b/docs/assets/acryliccontextmenu.html-d9ab7f7d.js @@ -0,0 +1,10 @@ +import{_ as e,o as t,c as n,e as a}from"./app-47cf4121.js";const o="/Coho.UI/assets/contextmenu-59f27041.png",r={},i=a('

The AcrylicContextMenu control

Namespace: Coho.UI.Controls.Menus, inherits from ContextMenu

The AcrylicContextMenu uses the Acrylic texture on Windows 11. It will automatically fallback to a legacy style when it is not available.

Properties

None.

Methods

None.

Events

None.

Examples

This example shows how to attach an AcrylicContextMenu on a Border.

<Border Width="150" Height="150" Background="Silver">
+	<Border.ContextMenu>
+		<menus:AcrylicContextMenu>
+			<MenuItem Header="Test 1"/>
+			<MenuItem Header="Test 2"/>
+			<MenuItem Header="Test 3"/>
+		</menus:AcrylicContextMenu>
+	</Border.ContextMenu>
+</Border>
+
`,13),c=[i];function s(d,l){return t(),n("div",null,c)}const h=e(r,[["render",s],["__file","acryliccontextmenu.html.vue"]]);export{h as default}; diff --git a/docs/assets/announcer-6d14b832.png b/docs/assets/announcer-6d14b832.png new file mode 100644 index 0000000..d4dc4f5 Binary files /dev/null and b/docs/assets/announcer-6d14b832.png differ diff --git a/docs/assets/announcer.html-4ababd6c.js b/docs/assets/announcer.html-4ababd6c.js new file mode 100644 index 0000000..27ea6f8 --- /dev/null +++ b/docs/assets/announcer.html-4ababd6c.js @@ -0,0 +1,30 @@ +import{_ as e,o as n,c as a,e as t}from"./app-47cf4121.js";const s="/Coho.UI/assets/announcer-6d14b832.png",o={},i=t('

Announcer control

Namespace: Coho.UI.Controls.Announcer

The Announcer is a slider that allows you to specify the number of items per page and the template of bound items.

Properties

AnnounceTemplate

Type: DataTemplate
The AnnounceTemplate property defines the template to be used to display items in the slider.

IsLoadingContent

Type: DependencyProperty, bool
The IsLoadingContent property is used to hide control content and display a LoadingRing to indicate that content is being loaded.

ItemsPerView

Type: DependencyProperty, int
The ItemsPerView property is used to set the number of items per page. When there are more items than this value, the user can slide content using the arrows on the top right of the control.

ItemsSource

Type: IEnumerable<object>
The ItemsSource property is used to set the collection of objects to display.

Label

Type: DependencyProperty, string
The Label property is used to set the text displayed at the top of the Announcer control.

Methods

None.

Events

None.

Examples

Example 1

This example shows how to set the AnnounceTemplate property from Xaml.

<announcer:Announcer AnnouncesAreaMargin="0,8,0,0" Margin="0,8" ItemsPerView="4"
+                                     x:Name="AnnouncesPresenter" MinHeight="200">
+                    <announcer:Announcer.AnnounceTemplate>
+                        <DataTemplate>
+                            <Border x:Name="BdrContainer" CornerRadius="6">
+                                <StackPanel>
+                                    <TextBlock Text="{Binding Title}" FontWeight="SemiBold" FontSize="14"
+                                               TextWrapping="Wrap" Margin="0,0,10,0" />
+                                    <TextBlock Text="{Binding Content}"
+                                               TextWrapping="Wrap" Margin="0,0,10,0" />
+                                </StackPanel>
+                            </Border>
+                        </DataTemplate>
+                    </announcer:Announcer.AnnounceTemplate>
+</announcer:Announcer>
+

Example 2

This example shows how to load data from code-behind and set the control in loading mode.

// Put the control in Loading mode, it shows a loading ring
+AnnouncesPresenter.IsLoadingContent = true;
+
+OnlineContentService.GetItems().ContinueWith(r =>
+{
+    // Stop the loading mode to show fetched items
+    AnnouncesPresenter.IsLoadingContent = false;
+    AnnouncesPresenter.ItemsSource = r.Result;
+
+}, TaskScheduler.FromCurrentSynchronizationContext());
+

Example 3

This example shows how to bind a localized string to the Label property in Xaml.

<announcer:Announcer AnnouncesAreaMargin="0,8,0,0" Margin="0,8" ItemsPerView="4"
+                     x:Name="AnnouncesPresenter" MinHeight="200"
+                     Label="{x:Static localization:Resources.OnlineResourcesDescription}">
+</announcer:Announcer>
+
`,29),r=[i];function c(d,l){return n(),a("div",null,r)}const p=e(o,[["render",c],["__file","announcer.html.vue"]]);export{p as default}; diff --git a/docs/assets/app-47cf4121.js b/docs/assets/app-47cf4121.js new file mode 100644 index 0000000..bce8afd --- /dev/null +++ b/docs/assets/app-47cf4121.js @@ -0,0 +1,10 @@ +const ea="modulepreload",ta=function(e){return"/Coho.UI/"+e},Qo={},ne=function(t,n,r){if(!n||n.length===0)return t();const o=document.getElementsByTagName("link");return Promise.all(n.map(s=>{if(s=ta(s),s in Qo)return;Qo[s]=!0;const i=s.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(!!r)for(let u=o.length-1;u>=0;u--){const f=o[u];if(f.href===s&&(!i||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${s}"]${l}`))return;const c=document.createElement("link");if(c.rel=i?"stylesheet":ea,i||(c.as="script",c.crossOrigin=""),c.href=s,document.head.appendChild(c),i)return new Promise((u,f)=>{c.addEventListener("load",u),c.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${s}`)))})})).then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})};function po(e,t){const n=Object.create(null),r=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}const Ce={},nn=[],ot=()=>{},na=()=>!1,ra=/^on[^a-z]/,Fn=e=>ra.test(e),mo=e=>e.startsWith("onUpdate:"),Ae=Object.assign,vo=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},oa=Object.prototype.hasOwnProperty,ue=(e,t)=>oa.call(e,t),J=Array.isArray,rn=e=>Er(e)==="[object Map]",vi=e=>Er(e)==="[object Set]",oe=e=>typeof e=="function",pe=e=>typeof e=="string",go=e=>typeof e=="symbol",we=e=>e!==null&&typeof e=="object",gi=e=>we(e)&&oe(e.then)&&oe(e.catch),_i=Object.prototype.toString,Er=e=>_i.call(e),sa=e=>Er(e).slice(8,-1),bi=e=>Er(e)==="[object Object]",_o=e=>pe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Tn=po(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),wr=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ia=/-(\w)/g,ft=wr(e=>e.replace(ia,(t,n)=>n?n.toUpperCase():"")),la=/\B([A-Z])/g,Yt=wr(e=>e.replace(la,"-$1").toLowerCase()),Cr=wr(e=>e.charAt(0).toUpperCase()+e.slice(1)),Nr=wr(e=>e?`on${Cr(e)}`:""),kn=(e,t)=>!Object.is(e,t),Dr=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},aa=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ca=e=>{const t=pe(e)?Number(e):NaN;return isNaN(t)?e:t};let Zo;const Qr=()=>Zo||(Zo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Bn(e){if(J(e)){const t={};for(let n=0;n{if(n){const r=n.split(fa);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function We(e){let t="";if(pe(e))t=e;else if(J(e))for(let n=0;npe(e)?e:e==null?"":J(e)||we(e)&&(e.toString===_i||!oe(e.toString))?JSON.stringify(e,Ei,2):String(e),Ei=(e,t)=>t&&t.__v_isRef?Ei(e,t.value):rn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o])=>(n[`${r} =>`]=o,n),{})}:vi(t)?{[`Set(${t.size})`]:[...t.values()]}:we(t)&&!J(t)&&!bi(t)?String(t):t;let Ye;class va{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Ye,!t&&Ye&&(this.index=(Ye.scopes||(Ye.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Ye;try{return Ye=this,t()}finally{Ye=n}}}on(){Ye=this}off(){Ye=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Ci=e=>(e.w&Rt)>0,xi=e=>(e.n&Rt)>0,ba=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(u==="length"||u>=a)&&l.push(c)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":J(e)?_o(n)&&l.push(i.get("length")):(l.push(i.get(Vt)),rn(e)&&l.push(i.get(Xr)));break;case"delete":J(e)||(l.push(i.get(Vt)),rn(e)&&l.push(i.get(Xr)));break;case"set":rn(e)&&l.push(i.get(Vt));break}if(l.length===1)l[0]&&eo(l[0]);else{const a=[];for(const c of l)c&&a.push(...c);eo(bo(a))}}function eo(e,t){const n=J(e)?e:[...e];for(const r of n)r.computed&&es(r);for(const r of n)r.computed||es(r)}function es(e,t){(e!==nt||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Ea(e,t){var n;return(n=ar.get(e))==null?void 0:n.get(t)}const wa=po("__proto__,__v_isRef,__isVue"),Si=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(go)),Ca=Eo(),xa=Eo(!1,!0),Ta=Eo(!0),ts=La();function La(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=de(this);for(let s=0,i=this.length;s{e[t]=function(...n){pn();const r=de(this)[t].apply(this,n);return mn(),r}}),e}function Sa(e){const t=de(this);return qe(t,"has",e),t.hasOwnProperty(e)}function Eo(e=!1,t=!1){return function(r,o,s){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&s===(e?t?Ua:Ri:t?ki:Ai).get(r))return r;const i=J(r);if(!e){if(i&&ue(ts,o))return Reflect.get(ts,o,s);if(o==="hasOwnProperty")return Sa}const l=Reflect.get(r,o,s);return(go(o)?Si.has(o):wa(o))||(e||qe(r,"get",o),t)?l:Ie(l)?i&&_o(o)?l:l.value:we(l)?e?vn(l):zn(l):l}}const Pa=Pi(),Oa=Pi(!0);function Pi(e=!1){return function(n,r,o,s){let i=n[r];if(an(i)&&Ie(i)&&!Ie(o))return!1;if(!e&&(!cr(o)&&!an(o)&&(i=de(i),o=de(o)),!J(n)&&Ie(i)&&!Ie(o)))return i.value=o,!0;const l=J(n)&&_o(r)?Number(r)e,xr=e=>Reflect.getPrototypeOf(e);function qn(e,t,n=!1,r=!1){e=e.__v_raw;const o=de(e),s=de(t);n||(t!==s&&qe(o,"get",t),qe(o,"get",s));const{has:i}=xr(o),l=r?wo:n?To:Rn;if(i.call(o,t))return l(e.get(t));if(i.call(o,s))return l(e.get(s));e!==o&&e.get(t)}function Kn(e,t=!1){const n=this.__v_raw,r=de(n),o=de(e);return t||(e!==o&&qe(r,"has",e),qe(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Yn(e,t=!1){return e=e.__v_raw,!t&&qe(de(e),"iterate",Vt),Reflect.get(e,"size",e)}function ns(e){e=de(e);const t=de(this);return xr(t).has.call(t,e)||(t.add(e),_t(t,"add",e,e)),this}function rs(e,t){t=de(t);const n=de(this),{has:r,get:o}=xr(n);let s=r.call(n,e);s||(e=de(e),s=r.call(n,e));const i=o.call(n,e);return n.set(e,t),s?kn(t,i)&&_t(n,"set",e,t):_t(n,"add",e,t),this}function os(e){const t=de(this),{has:n,get:r}=xr(t);let o=n.call(t,e);o||(e=de(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&_t(t,"delete",e,void 0),s}function ss(){const e=de(this),t=e.size!==0,n=e.clear();return t&&_t(e,"clear",void 0,void 0),n}function Gn(e,t){return function(r,o){const s=this,i=s.__v_raw,l=de(i),a=t?wo:e?To:Rn;return!e&&qe(l,"iterate",Vt),i.forEach((c,u)=>r.call(o,a(c),a(u),s))}}function Jn(e,t,n){return function(...r){const o=this.__v_raw,s=de(o),i=rn(s),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,c=o[e](...r),u=n?wo:t?To:Rn;return!t&&qe(s,"iterate",a?Xr:Vt),{next(){const{value:f,done:h}=c.next();return h?{value:f,done:h}:{value:l?[u(f[0]),u(f[1])]:u(f),done:h}},[Symbol.iterator](){return this}}}}function Ct(e){return function(...t){return e==="delete"?!1:this}}function Ma(){const e={get(s){return qn(this,s)},get size(){return Yn(this)},has:Kn,add:ns,set:rs,delete:os,clear:ss,forEach:Gn(!1,!1)},t={get(s){return qn(this,s,!1,!0)},get size(){return Yn(this)},has:Kn,add:ns,set:rs,delete:os,clear:ss,forEach:Gn(!1,!0)},n={get(s){return qn(this,s,!0)},get size(){return Yn(this,!0)},has(s){return Kn.call(this,s,!0)},add:Ct("add"),set:Ct("set"),delete:Ct("delete"),clear:Ct("clear"),forEach:Gn(!0,!1)},r={get(s){return qn(this,s,!0,!0)},get size(){return Yn(this,!0)},has(s){return Kn.call(this,s,!0)},add:Ct("add"),set:Ct("set"),delete:Ct("delete"),clear:Ct("clear"),forEach:Gn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=Jn(s,!1,!1),n[s]=Jn(s,!0,!1),t[s]=Jn(s,!1,!0),r[s]=Jn(s,!0,!0)}),[e,n,t,r]}const[Na,Da,Ha,Fa]=Ma();function Co(e,t){const n=t?e?Fa:Ha:e?Da:Na;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(ue(n,o)&&o in r?n:r,o,s)}const Ba={get:Co(!1,!1)},za={get:Co(!1,!0)},ja={get:Co(!0,!1)},Ai=new WeakMap,ki=new WeakMap,Ri=new WeakMap,Ua=new WeakMap;function Va(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Wa(e){return e.__v_skip||!Object.isExtensible(e)?0:Va(sa(e))}function zn(e){return an(e)?e:xo(e,!1,Oi,Ba,Ai)}function Ii(e){return xo(e,!1,$a,za,ki)}function vn(e){return xo(e,!0,Ia,ja,Ri)}function xo(e,t,n,r,o){if(!we(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=Wa(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return o.set(e,l),l}function on(e){return an(e)?on(e.__v_raw):!!(e&&e.__v_isReactive)}function an(e){return!!(e&&e.__v_isReadonly)}function cr(e){return!!(e&&e.__v_isShallow)}function $i(e){return on(e)||an(e)}function de(e){const t=e&&e.__v_raw;return t?de(t):e}function Mi(e){return lr(e,"__v_skip",!0),e}const Rn=e=>we(e)?zn(e):e,To=e=>we(e)?vn(e):e;function Lo(e){At&&nt&&(e=de(e),Li(e.dep||(e.dep=bo())))}function So(e,t){e=de(e);const n=e.dep;n&&eo(n)}function Ie(e){return!!(e&&e.__v_isRef===!0)}function Ee(e){return Ni(e,!1)}function Po(e){return Ni(e,!0)}function Ni(e,t){return Ie(e)?e:new qa(e,t)}class qa{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:de(t),this._value=n?t:Rn(t)}get value(){return Lo(this),this._value}set value(t){const n=this.__v_isShallow||cr(t)||an(t);t=n?t:de(t),kn(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Rn(t),So(this))}}function Z(e){return Ie(e)?e.value:e}const Ka={get:(e,t,n)=>Z(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Ie(o)&&!Ie(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function Di(e){return on(e)?e:new Proxy(e,Ka)}class Ya{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Lo(this),()=>So(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function Ga(e){return new Ya(e)}function Oo(e){const t=J(e)?new Array(e.length):{};for(const n in e)t[n]=Hi(e,n);return t}class Ja{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Ea(de(this._object),this._key)}}class Qa{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Za(e,t,n){return Ie(e)?e:oe(e)?new Qa(e):we(e)&&arguments.length>1?Hi(e,t,n):Ee(e)}function Hi(e,t,n){const r=e[t];return Ie(r)?r:new Ja(e,t,n)}class Xa{constructor(t,n,r,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new yo(t,()=>{this._dirty||(this._dirty=!0,So(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=de(this);return Lo(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function ec(e,t,n=!1){let r,o;const s=oe(e);return s?(r=e,o=ot):(r=e.get,o=e.set),new Xa(r,o,s||!o,n)}function kt(e,t,n,r){let o;try{o=r?e(...r):e()}catch(s){jn(s,t,n)}return o}function Ze(e,t,n,r){if(oe(e)){const s=kt(e,t,n,r);return s&&gi(s)&&s.catch(i=>{jn(i,t,n)}),s}const o=[];for(let s=0;s>>1;$n(Be[r])ct&&Be.splice(t,1)}function oc(e){J(e)?sn.push(...e):(!mt||!mt.includes(e,e.allowRecurse?Bt+1:Bt))&&sn.push(e),Bi()}function is(e,t=In?ct+1:0){for(;t$n(n)-$n(r)),Bt=0;Bte.id==null?1/0:e.id,sc=(e,t)=>{const n=$n(e)-$n(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function zi(e){to=!1,In=!0,Be.sort(sc);const t=ot;try{for(ct=0;ctpe(v)?v.trim():v)),f&&(o=n.map(aa))}let l,a=r[l=Nr(t)]||r[l=Nr(ft(t))];!a&&s&&(a=r[l=Nr(Yt(t))]),a&&Ze(a,e,6,o);const c=r[l+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ze(c,e,6,o)}}function ji(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},l=!1;if(!oe(e)){const a=c=>{const u=ji(c,t,!0);u&&(l=!0,Ae(i,u))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!s&&!l?(we(e)&&r.set(e,null),null):(J(s)?s.forEach(a=>i[a]=null):Ae(i,s),we(e)&&r.set(e,i),i)}function Sr(e,t){return!e||!Fn(t)?!1:(t=t.slice(2).replace(/Once$/,""),ue(e,t[0].toLowerCase()+t.slice(1))||ue(e,Yt(t))||ue(e,t))}let De=null,Ui=null;function fr(e){const t=De;return De=e,Ui=e&&e.type.__scopeId||null,t}function Ne(e,t=De,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&_s(-1);const s=fr(t);let i;try{i=e(...o)}finally{fr(s),r._d&&_s(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Hr(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:s,propsOptions:[i],slots:l,attrs:a,emit:c,render:u,renderCache:f,data:h,setupState:v,ctx:y,inheritAttrs:w}=e;let L,g;const b=fr(e);try{if(n.shapeFlag&4){const O=o||r;L=tt(u.call(O,O,f,s,v,h,y)),g=a}else{const O=t;L=tt(O.length>1?O(s,{attrs:a,slots:l,emit:c}):O(s,null)),g=t.props?a:lc(a)}}catch(O){Pn.length=0,jn(O,e,1),L=ee(Ge)}let A=L;if(g&&w!==!1){const O=Object.keys(g),{shapeFlag:W}=A;O.length&&W&7&&(i&&O.some(mo)&&(g=ac(g,i)),A=$t(A,g))}return n.dirs&&(A=$t(A),A.dirs=A.dirs?A.dirs.concat(n.dirs):n.dirs),n.transition&&(A.transition=n.transition),L=A,fr(b),L}const lc=e=>{let t;for(const n in e)(n==="class"||n==="style"||Fn(n))&&((t||(t={}))[n]=e[n]);return t},ac=(e,t)=>{const n={};for(const r in e)(!mo(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function cc(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:l,patchFlag:a}=t,c=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return r?ls(r,i,c):!!i;if(a&8){const u=t.dynamicProps;for(let f=0;fe.__isSuspense;function Vi(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):oc(e)}function Wi(e,t){return ko(e,null,t)}const Qn={};function ut(e,t,n){return ko(e,t,n)}function ko(e,t,{immediate:n,deep:r,flush:o,onTrack:s,onTrigger:i}=Ce){var l;const a=wi()===((l=ke)==null?void 0:l.scope)?ke:null;let c,u=!1,f=!1;if(Ie(e)?(c=()=>e.value,u=cr(e)):on(e)?(c=()=>e,r=!0):J(e)?(f=!0,u=e.some(O=>on(O)||cr(O)),c=()=>e.map(O=>{if(Ie(O))return O.value;if(on(O))return Ut(O);if(oe(O))return kt(O,a,2)})):oe(e)?t?c=()=>kt(e,a,2):c=()=>{if(!(a&&a.isUnmounted))return h&&h(),Ze(e,a,3,[v])}:c=ot,t&&r){const O=c;c=()=>Ut(O())}let h,v=O=>{h=b.onStop=()=>{kt(O,a,4)}},y;if(fn)if(v=ot,t?n&&Ze(t,a,3,[c(),f?[]:void 0,v]):c(),o==="sync"){const O=iu();y=O.__watcherHandles||(O.__watcherHandles=[])}else return ot;let w=f?new Array(e.length).fill(Qn):Qn;const L=()=>{if(b.active)if(t){const O=b.run();(r||u||(f?O.some((W,X)=>kn(W,w[X])):kn(O,w)))&&(h&&h(),Ze(t,a,3,[O,w===Qn?void 0:f&&w[0]===Qn?[]:w,v]),w=O)}else b.run()};L.allowRecurse=!!t;let g;o==="sync"?g=L:o==="post"?g=()=>Ve(L,a&&a.suspense):(L.pre=!0,a&&(L.id=a.uid),g=()=>Lr(L));const b=new yo(c,g);t?n?L():w=b.run():o==="post"?Ve(b.run.bind(b),a&&a.suspense):b.run();const A=()=>{b.stop(),a&&a.scope&&vo(a.scope.effects,b)};return y&&y.push(A),A}function dc(e,t,n){const r=this.proxy,o=pe(e)?e.includes(".")?qi(r,e):()=>r[e]:e.bind(r,r);let s;oe(t)?s=t:(s=t.handler,n=t);const i=ke;un(this);const l=ko(o,s.bind(r),n);return i?un(i):qt(),l}function qi(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{Ut(n,t)});else if(bi(e))for(const n in e)Ut(e[n],t);return e}function dr(e,t){const n=De;if(n===null)return e;const r=Rr(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let s=0;s{e.isMounted=!0}),Or(()=>{e.isUnmounting=!0}),e}const Je=[Function,Array],Ki={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Je,onEnter:Je,onAfterEnter:Je,onEnterCancelled:Je,onBeforeLeave:Je,onLeave:Je,onAfterLeave:Je,onLeaveCancelled:Je,onBeforeAppear:Je,onAppear:Je,onAfterAppear:Je,onAppearCancelled:Je},pc={name:"BaseTransition",props:Ki,setup(e,{slots:t}){const n=cl(),r=hc();let o;return()=>{const s=t.default&&Gi(t.default(),!0);if(!s||!s.length)return;let i=s[0];if(s.length>1){for(const w of s)if(w.type!==Ge){i=w;break}}const l=de(e),{mode:a}=l;if(r.isLeaving)return Fr(i);const c=as(i);if(!c)return Fr(i);const u=no(c,l,r,n);ro(c,u);const f=n.subTree,h=f&&as(f);let v=!1;const{getTransitionKey:y}=c.type;if(y){const w=y();o===void 0?o=w:w!==o&&(o=w,v=!0)}if(h&&h.type!==Ge&&(!zt(c,h)||v)){const w=no(h,l,r,n);if(ro(h,w),a==="out-in")return r.isLeaving=!0,w.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},Fr(i);a==="in-out"&&c.type!==Ge&&(w.delayLeave=(L,g,b)=>{const A=Yi(r,h);A[String(h.key)]=h,L._leaveCb=()=>{g(),L._leaveCb=void 0,delete u.delayedLeave},u.delayedLeave=b})}return i}}},mc=pc;function Yi(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function no(e,t,n,r){const{appear:o,mode:s,persisted:i=!1,onBeforeEnter:l,onEnter:a,onAfterEnter:c,onEnterCancelled:u,onBeforeLeave:f,onLeave:h,onAfterLeave:v,onLeaveCancelled:y,onBeforeAppear:w,onAppear:L,onAfterAppear:g,onAppearCancelled:b}=t,A=String(e.key),O=Yi(n,e),W=(m,z)=>{m&&Ze(m,r,9,z)},X=(m,z)=>{const D=z[1];W(m,z),J(m)?m.every(K=>K.length<=1)&&D():m.length<=1&&D()},N={mode:s,persisted:i,beforeEnter(m){let z=l;if(!n.isMounted)if(o)z=w||l;else return;m._leaveCb&&m._leaveCb(!0);const D=O[A];D&&zt(e,D)&&D.el._leaveCb&&D.el._leaveCb(),W(z,[m])},enter(m){let z=a,D=c,K=u;if(!n.isMounted)if(o)z=L||a,D=g||c,K=b||u;else return;let T=!1;const R=m._enterCb=I=>{T||(T=!0,I?W(K,[m]):W(D,[m]),N.delayedLeave&&N.delayedLeave(),m._enterCb=void 0)};z?X(z,[m,R]):R()},leave(m,z){const D=String(e.key);if(m._enterCb&&m._enterCb(!0),n.isUnmounting)return z();W(f,[m]);let K=!1;const T=m._leaveCb=R=>{K||(K=!0,z(),R?W(y,[m]):W(v,[m]),m._leaveCb=void 0,O[D]===e&&delete O[D])};O[D]=e,h?X(h,[m,T]):T()},clone(m){return no(m,t,n,r)}};return N}function Fr(e){if(Un(e))return e=$t(e),e.children=null,e}function as(e){return Un(e)?e.children?e.children[0]:void 0:e}function ro(e,t){e.shapeFlag&6&&e.component?ro(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Gi(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;sAe({name:e.name},t,{setup:e}))():e}const ln=e=>!!e.type.__asyncLoader;function Te(e){oe(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:s,suspensible:i=!0,onError:l}=e;let a=null,c,u=0;const f=()=>(u++,a=null,h()),h=()=>{let v;return a||(v=a=t().catch(y=>{if(y=y instanceof Error?y:new Error(String(y)),l)return new Promise((w,L)=>{l(y,()=>w(f()),()=>L(y),u+1)});throw y}).then(y=>v!==a&&a?a:(y&&(y.__esModule||y[Symbol.toStringTag]==="Module")&&(y=y.default),c=y,y)))};return he({name:"AsyncComponentWrapper",__asyncLoader:h,get __asyncResolved(){return c},setup(){const v=ke;if(c)return()=>Br(c,v);const y=b=>{a=null,jn(b,v,13,!r)};if(i&&v.suspense||fn)return h().then(b=>()=>Br(b,v)).catch(b=>(y(b),()=>r?ee(r,{error:b}):null));const w=Ee(!1),L=Ee(),g=Ee(!!o);return o&&setTimeout(()=>{g.value=!1},o),s!=null&&setTimeout(()=>{if(!w.value&&!L.value){const b=new Error(`Async component timed out after ${s}ms.`);y(b),L.value=b}},s),h().then(()=>{w.value=!0,v.parent&&Un(v.parent.vnode)&&Lr(v.parent.update)}).catch(b=>{y(b),L.value=b}),()=>{if(w.value&&c)return Br(c,v);if(L.value&&r)return ee(r,{error:L.value});if(n&&!g.value)return ee(n)}}})}function Br(e,t){const{ref:n,props:r,children:o,ce:s}=t.vnode,i=ee(e,r,o);return i.ref=n,i.ce=s,delete t.vnode.ce,i}const Un=e=>e.type.__isKeepAlive;function vc(e,t){Ji(e,"a",t)}function gc(e,t){Ji(e,"da",t)}function Ji(e,t,n=ke){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Pr(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Un(o.parent.vnode)&&_c(r,t,n,o),o=o.parent}}function _c(e,t,n,r){const o=Pr(t,e,r,!0);Ar(()=>{vo(r[t],o)},n)}function Pr(e,t,n=ke,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;pn(),un(n);const l=Ze(t,n,e,i);return qt(),mn(),l});return r?o.unshift(s):o.push(s),s}}const yt=e=>(t,n=ke)=>(!fn||e==="sp")&&Pr(e,(...r)=>t(...r),n),bc=yt("bm"),Xe=yt("m"),yc=yt("bu"),Ec=yt("u"),Or=yt("bum"),Ar=yt("um"),wc=yt("sp"),Cc=yt("rtg"),xc=yt("rtc");function Tc(e,t=ke){Pr("ec",e,t)}const Qi="components";function bt(e,t){return Sc(Qi,e,!0,t)||e}const Lc=Symbol.for("v-ndc");function Sc(e,t,n=!0,r=!1){const o=De||ke;if(o){const s=o.type;if(e===Qi){const l=ru(s,!1);if(l&&(l===t||l===ft(t)||l===Cr(ft(t))))return s}const i=cs(o[e]||s[e],t)||cs(o.appContext[e],t);return!i&&r?s:i}}function cs(e,t){return e&&(e[t]||e[ft(t)]||e[Cr(ft(t))])}function It(e,t,n,r){let o;const s=n&&n[r];if(J(e)||pe(e)){o=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,s&&s[l]));else{const i=Object.keys(e);o=new Array(i.length);for(let l=0,a=i.length;lvr(t)?!(t.type===Ge||t.type===ye&&!Zi(t.children)):!0)?e:null}const oo=e=>e?ul(e)?Rr(e)||e.proxy:oo(e.parent):null,Ln=Ae(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>oo(e.parent),$root:e=>oo(e.root),$emit:e=>e.emit,$options:e=>Ro(e),$forceUpdate:e=>e.f||(e.f=()=>Lr(e.update)),$nextTick:e=>e.n||(e.n=Tr.bind(e.proxy)),$watch:e=>dc.bind(e)}),zr=(e,t)=>e!==Ce&&!e.__isScriptSetup&&ue(e,t),Pc={get({_:e},t){const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:l,appContext:a}=e;let c;if(t[0]!=="$"){const v=i[t];if(v!==void 0)switch(v){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(zr(r,t))return i[t]=1,r[t];if(o!==Ce&&ue(o,t))return i[t]=2,o[t];if((c=e.propsOptions[0])&&ue(c,t))return i[t]=3,s[t];if(n!==Ce&&ue(n,t))return i[t]=4,n[t];so&&(i[t]=0)}}const u=Ln[t];let f,h;if(u)return t==="$attrs"&&qe(e,"get",t),u(e);if((f=l.__cssModules)&&(f=f[t]))return f;if(n!==Ce&&ue(n,t))return i[t]=4,n[t];if(h=a.config.globalProperties,ue(h,t))return h[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return zr(o,t)?(o[t]=n,!0):r!==Ce&&ue(r,t)?(r[t]=n,!0):ue(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},i){let l;return!!n[i]||e!==Ce&&ue(e,i)||zr(t,i)||(l=s[0])&&ue(l,i)||ue(r,i)||ue(Ln,i)||ue(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ue(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function us(e){return J(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let so=!0;function Oc(e){const t=Ro(e),n=e.proxy,r=e.ctx;so=!1,t.beforeCreate&&fs(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:l,provide:a,inject:c,created:u,beforeMount:f,mounted:h,beforeUpdate:v,updated:y,activated:w,deactivated:L,beforeDestroy:g,beforeUnmount:b,destroyed:A,unmounted:O,render:W,renderTracked:X,renderTriggered:N,errorCaptured:m,serverPrefetch:z,expose:D,inheritAttrs:K,components:T,directives:R,filters:I}=t;if(c&&Ac(c,r,null),i)for(const re in i){const se=i[re];oe(se)&&(r[re]=se.bind(n))}if(o){const re=o.call(n,n);we(re)&&(e.data=zn(re))}if(so=!0,s)for(const re in s){const se=s[re],He=oe(se)?se.bind(n,n):oe(se.get)?se.get.bind(n,n):ot,Me=!oe(se)&&oe(se.set)?se.set.bind(n):ot,Ue=j({get:He,set:Me});Object.defineProperty(r,re,{enumerable:!0,configurable:!0,get:()=>Ue.value,set:Fe=>Ue.value=Fe})}if(l)for(const re in l)Xi(l[re],r,n,re);if(a){const re=oe(a)?a.call(n):a;Reflect.ownKeys(re).forEach(se=>{Wt(se,re[se])})}u&&fs(u,e,"c");function U(re,se){J(se)?se.forEach(He=>re(He.bind(n))):se&&re(se.bind(n))}if(U(bc,f),U(Xe,h),U(yc,v),U(Ec,y),U(vc,w),U(gc,L),U(Tc,m),U(xc,X),U(Cc,N),U(Or,b),U(Ar,O),U(wc,z),J(D))if(D.length){const re=e.exposed||(e.exposed={});D.forEach(se=>{Object.defineProperty(re,se,{get:()=>n[se],set:He=>n[se]=He})})}else e.exposed||(e.exposed={});W&&e.render===ot&&(e.render=W),K!=null&&(e.inheritAttrs=K),T&&(e.components=T),R&&(e.directives=R)}function Ac(e,t,n=ot){J(e)&&(e=io(e));for(const r in e){const o=e[r];let s;we(o)?"default"in o?s=Oe(o.from||r,o.default,!0):s=Oe(o.from||r):s=Oe(o),Ie(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function fs(e,t,n){Ze(J(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Xi(e,t,n,r){const o=r.includes(".")?qi(n,r):()=>n[r];if(pe(e)){const s=t[e];oe(s)&&ut(o,s)}else if(oe(e))ut(o,e.bind(n));else if(we(e))if(J(e))e.forEach(s=>Xi(s,t,n,r));else{const s=oe(e.handler)?e.handler.bind(n):t[e.handler];oe(s)&&ut(o,s,e)}}function Ro(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,l=s.get(t);let a;return l?a=l:!o.length&&!n&&!r?a=t:(a={},o.length&&o.forEach(c=>hr(a,c,i,!0)),hr(a,t,i)),we(t)&&s.set(t,a),a}function hr(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&hr(e,s,n,!0),o&&o.forEach(i=>hr(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=kc[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const kc={data:ds,props:hs,emits:hs,methods:xn,computed:xn,beforeCreate:ze,created:ze,beforeMount:ze,mounted:ze,beforeUpdate:ze,updated:ze,beforeDestroy:ze,beforeUnmount:ze,destroyed:ze,unmounted:ze,activated:ze,deactivated:ze,errorCaptured:ze,serverPrefetch:ze,components:xn,directives:xn,watch:Ic,provide:ds,inject:Rc};function ds(e,t){return t?e?function(){return Ae(oe(e)?e.call(this,this):e,oe(t)?t.call(this,this):t)}:t:e}function Rc(e,t){return xn(io(e),io(t))}function io(e){if(J(e)){const t={};for(let n=0;n1)return n&&oe(t)?t.call(r&&r.proxy):t}}function Nc(e,t,n,r=!1){const o={},s={};lr(s,kr,1),e.propsDefaults=Object.create(null),tl(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:Ii(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function Dc(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,l=de(o),[a]=e.propsOptions;let c=!1;if((r||i>0)&&!(i&16)){if(i&8){const u=e.vnode.dynamicProps;for(let f=0;f{a=!0;const[h,v]=nl(f,t,!0);Ae(i,h),v&&l.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!s&&!a)return we(e)&&r.set(e,nn),nn;if(J(s))for(let u=0;u-1,v[1]=w<0||y-1||ue(v,"default"))&&l.push(f)}}}const c=[i,l];return we(e)&&r.set(e,c),c}function ps(e){return e[0]!=="$"}function ms(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function vs(e,t){return ms(e)===ms(t)}function gs(e,t){return J(t)?t.findIndex(n=>vs(n,e)):oe(t)&&vs(t,e)?0:-1}const rl=e=>e[0]==="_"||e==="$stable",Io=e=>J(e)?e.map(tt):[tt(e)],Hc=(e,t,n)=>{if(t._n)return t;const r=Ne((...o)=>Io(t(...o)),n);return r._c=!1,r},ol=(e,t,n)=>{const r=e._ctx;for(const o in e){if(rl(o))continue;const s=e[o];if(oe(s))t[o]=Hc(o,s,r);else if(s!=null){const i=Io(s);t[o]=()=>i}}},sl=(e,t)=>{const n=Io(t);e.slots.default=()=>n},Fc=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=de(t),lr(t,"_",n)):ol(t,e.slots={})}else e.slots={},t&&sl(e,t);lr(e.slots,kr,1)},Bc=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=Ce;if(r.shapeFlag&32){const l=t._;l?n&&l===1?s=!1:(Ae(o,t),!n&&l===1&&delete o._):(s=!t.$stable,ol(t,o)),i=t}else t&&(sl(e,t),i={default:1});if(s)for(const l in o)!rl(l)&&!(l in i)&&delete o[l]};function mr(e,t,n,r,o=!1){if(J(e)){e.forEach((h,v)=>mr(h,t&&(J(t)?t[v]:t),n,r,o));return}if(ln(r)&&!o)return;const s=r.shapeFlag&4?Rr(r.component)||r.component.proxy:r.el,i=o?null:s,{i:l,r:a}=e,c=t&&t.r,u=l.refs===Ce?l.refs={}:l.refs,f=l.setupState;if(c!=null&&c!==a&&(pe(c)?(u[c]=null,ue(f,c)&&(f[c]=null)):Ie(c)&&(c.value=null)),oe(a))kt(a,l,12,[i,u]);else{const h=pe(a),v=Ie(a);if(h||v){const y=()=>{if(e.f){const w=h?ue(f,a)?f[a]:u[a]:a.value;o?J(w)&&vo(w,s):J(w)?w.includes(s)||w.push(s):h?(u[a]=[s],ue(f,a)&&(f[a]=u[a])):(a.value=[s],e.k&&(u[e.k]=a.value))}else h?(u[a]=i,ue(f,a)&&(f[a]=i)):v&&(a.value=i,e.k&&(u[e.k]=i))};i?(y.id=-1,Ve(y,n)):y()}}}let xt=!1;const Zn=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Xn=e=>e.nodeType===8;function zc(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:i,remove:l,insert:a,createComment:c}}=e,u=(g,b)=>{if(!b.hasChildNodes()){n(null,g,b),ur(),b._vnode=g;return}xt=!1,f(b.firstChild,g,null,null,null),ur(),b._vnode=g,xt&&console.error("Hydration completed but contains mismatches.")},f=(g,b,A,O,W,X=!1)=>{const N=Xn(g)&&g.data==="[",m=()=>w(g,b,A,O,W,N),{type:z,ref:D,shapeFlag:K,patchFlag:T}=b;let R=g.nodeType;b.el=g,T===-2&&(X=!1,b.dynamicChildren=null);let I=null;switch(z){case cn:R!==3?b.children===""?(a(b.el=o(""),i(g),g),I=g):I=m():(g.data!==b.children&&(xt=!0,g.data=b.children),I=s(g));break;case Ge:R!==8||N?I=m():I=s(g);break;case Sn:if(N&&(g=s(g),R=g.nodeType),R===1||R===3){I=g;const ie=!b.children.length;for(let U=0;U{X=X||!!b.dynamicChildren;const{type:N,props:m,patchFlag:z,shapeFlag:D,dirs:K}=b,T=N==="input"&&K||N==="option";if(T||z!==-1){if(K&&at(b,null,A,"created"),m)if(T||!X||z&48)for(const I in m)(T&&I.endsWith("value")||Fn(I)&&!Tn(I))&&r(g,I,null,m[I],!1,void 0,A);else m.onClick&&r(g,"onClick",null,m.onClick,!1,void 0,A);let R;if((R=m&&m.onVnodeBeforeMount)&&Qe(R,A,b),K&&at(b,null,A,"beforeMount"),((R=m&&m.onVnodeMounted)||K)&&Vi(()=>{R&&Qe(R,A,b),K&&at(b,null,A,"mounted")},O),D&16&&!(m&&(m.innerHTML||m.textContent))){let I=v(g.firstChild,b,g,A,O,W,X);for(;I;){xt=!0;const ie=I;I=I.nextSibling,l(ie)}}else D&8&&g.textContent!==b.children&&(xt=!0,g.textContent=b.children)}return g.nextSibling},v=(g,b,A,O,W,X,N)=>{N=N||!!b.dynamicChildren;const m=b.children,z=m.length;for(let D=0;D{const{slotScopeIds:N}=b;N&&(W=W?W.concat(N):N);const m=i(g),z=v(s(g),b,m,A,O,W,X);return z&&Xn(z)&&z.data==="]"?s(b.anchor=z):(xt=!0,a(b.anchor=c("]"),m,z),z)},w=(g,b,A,O,W,X)=>{if(xt=!0,b.el=null,X){const z=L(g);for(;;){const D=s(g);if(D&&D!==z)l(D);else break}}const N=s(g),m=i(g);return l(g),n(null,b,m,N,A,O,Zn(m),W),N},L=g=>{let b=0;for(;g;)if(g=s(g),g&&Xn(g)&&(g.data==="["&&b++,g.data==="]")){if(b===0)return s(g);b--}return g};return[u,f]}const Ve=Vi;function jc(e){return Uc(e,zc)}function Uc(e,t){const n=Qr();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:l,createComment:a,setText:c,setElementText:u,parentNode:f,nextSibling:h,setScopeId:v=ot,insertStaticContent:y}=e,w=(d,p,_,E=null,x=null,S=null,H=!1,k=null,M=!!p.dynamicChildren)=>{if(d===p)return;d&&!zt(d,p)&&(E=C(d),Fe(d,x,S,!0),d=null),p.patchFlag===-2&&(M=!1,p.dynamicChildren=null);const{type:P,ref:Y,shapeFlag:V}=p;switch(P){case cn:L(d,p,_,E);break;case Ge:g(d,p,_,E);break;case Sn:d==null&&b(p,_,E,H);break;case ye:T(d,p,_,E,x,S,H,k,M);break;default:V&1?W(d,p,_,E,x,S,H,k,M):V&6?R(d,p,_,E,x,S,H,k,M):(V&64||V&128)&&P.process(d,p,_,E,x,S,H,k,M,$)}Y!=null&&x&&mr(Y,d&&d.ref,S,p||d,!p)},L=(d,p,_,E)=>{if(d==null)r(p.el=l(p.children),_,E);else{const x=p.el=d.el;p.children!==d.children&&c(x,p.children)}},g=(d,p,_,E)=>{d==null?r(p.el=a(p.children||""),_,E):p.el=d.el},b=(d,p,_,E)=>{[d.el,d.anchor]=y(d.children,p,_,E,d.el,d.anchor)},A=({el:d,anchor:p},_,E)=>{let x;for(;d&&d!==p;)x=h(d),r(d,_,E),d=x;r(p,_,E)},O=({el:d,anchor:p})=>{let _;for(;d&&d!==p;)_=h(d),o(d),d=_;o(p)},W=(d,p,_,E,x,S,H,k,M)=>{H=H||p.type==="svg",d==null?X(p,_,E,x,S,H,k,M):z(d,p,x,S,H,k,M)},X=(d,p,_,E,x,S,H,k)=>{let M,P;const{type:Y,props:V,shapeFlag:G,transition:te,dirs:le}=d;if(M=d.el=i(d.type,S,V&&V.is,V),G&8?u(M,d.children):G&16&&m(d.children,M,null,E,x,S&&Y!=="foreignObject",H,k),le&&at(d,null,E,"created"),N(M,d,d.scopeId,H,E),V){for(const ve in V)ve!=="value"&&!Tn(ve)&&s(M,ve,null,V[ve],S,d.children,E,x,$e);"value"in V&&s(M,"value",null,V.value),(P=V.onVnodeBeforeMount)&&Qe(P,E,d)}le&&at(d,null,E,"beforeMount");const _e=(!x||x&&!x.pendingBranch)&&te&&!te.persisted;_e&&te.beforeEnter(M),r(M,p,_),((P=V&&V.onVnodeMounted)||_e||le)&&Ve(()=>{P&&Qe(P,E,d),_e&&te.enter(M),le&&at(d,null,E,"mounted")},x)},N=(d,p,_,E,x)=>{if(_&&v(d,_),E)for(let S=0;S{for(let P=M;P{const k=p.el=d.el;let{patchFlag:M,dynamicChildren:P,dirs:Y}=p;M|=d.patchFlag&16;const V=d.props||Ce,G=p.props||Ce;let te;_&&Nt(_,!1),(te=G.onVnodeBeforeUpdate)&&Qe(te,_,p,d),Y&&at(p,d,_,"beforeUpdate"),_&&Nt(_,!0);const le=x&&p.type!=="foreignObject";if(P?D(d.dynamicChildren,P,k,_,E,le,S):H||se(d,p,k,null,_,E,le,S,!1),M>0){if(M&16)K(k,p,V,G,_,E,x);else if(M&2&&V.class!==G.class&&s(k,"class",null,G.class,x),M&4&&s(k,"style",V.style,G.style,x),M&8){const _e=p.dynamicProps;for(let ve=0;ve<_e.length;ve++){const Se=_e[ve],et=V[Se],Qt=G[Se];(Qt!==et||Se==="value")&&s(k,Se,et,Qt,x,d.children,_,E,$e)}}M&1&&d.children!==p.children&&u(k,p.children)}else!H&&P==null&&K(k,p,V,G,_,E,x);((te=G.onVnodeUpdated)||Y)&&Ve(()=>{te&&Qe(te,_,p,d),Y&&at(p,d,_,"updated")},E)},D=(d,p,_,E,x,S,H)=>{for(let k=0;k{if(_!==E){if(_!==Ce)for(const k in _)!Tn(k)&&!(k in E)&&s(d,k,_[k],null,H,p.children,x,S,$e);for(const k in E){if(Tn(k))continue;const M=E[k],P=_[k];M!==P&&k!=="value"&&s(d,k,P,M,H,p.children,x,S,$e)}"value"in E&&s(d,"value",_.value,E.value)}},T=(d,p,_,E,x,S,H,k,M)=>{const P=p.el=d?d.el:l(""),Y=p.anchor=d?d.anchor:l("");let{patchFlag:V,dynamicChildren:G,slotScopeIds:te}=p;te&&(k=k?k.concat(te):te),d==null?(r(P,_,E),r(Y,_,E),m(p.children,_,Y,x,S,H,k,M)):V>0&&V&64&&G&&d.dynamicChildren?(D(d.dynamicChildren,G,_,x,S,H,k),(p.key!=null||x&&p===x.subTree)&&il(d,p,!0)):se(d,p,_,Y,x,S,H,k,M)},R=(d,p,_,E,x,S,H,k,M)=>{p.slotScopeIds=k,d==null?p.shapeFlag&512?x.ctx.activate(p,_,E,H,M):I(p,_,E,x,S,H,M):ie(d,p,M)},I=(d,p,_,E,x,S,H)=>{const k=d.component=Zc(d,E,x);if(Un(d)&&(k.ctx.renderer=$),Xc(k),k.asyncDep){if(x&&x.registerDep(k,U),!d.el){const M=k.subTree=ee(Ge);g(null,M,p,_)}return}U(k,d,p,_,x,S,H)},ie=(d,p,_)=>{const E=p.component=d.component;if(cc(d,p,_))if(E.asyncDep&&!E.asyncResolved){re(E,p,_);return}else E.next=p,rc(E.update),E.update();else p.el=d.el,E.vnode=p},U=(d,p,_,E,x,S,H)=>{const k=()=>{if(d.isMounted){let{next:Y,bu:V,u:G,parent:te,vnode:le}=d,_e=Y,ve;Nt(d,!1),Y?(Y.el=le.el,re(d,Y,H)):Y=le,V&&Dr(V),(ve=Y.props&&Y.props.onVnodeBeforeUpdate)&&Qe(ve,te,Y,le),Nt(d,!0);const Se=Hr(d),et=d.subTree;d.subTree=Se,w(et,Se,f(et.el),C(et),d,x,S),Y.el=Se.el,_e===null&&uc(d,Se.el),G&&Ve(G,x),(ve=Y.props&&Y.props.onVnodeUpdated)&&Ve(()=>Qe(ve,te,Y,le),x)}else{let Y;const{el:V,props:G}=p,{bm:te,m:le,parent:_e}=d,ve=ln(p);if(Nt(d,!1),te&&Dr(te),!ve&&(Y=G&&G.onVnodeBeforeMount)&&Qe(Y,_e,p),Nt(d,!0),V&&ae){const Se=()=>{d.subTree=Hr(d),ae(V,d.subTree,d,x,null)};ve?p.type.__asyncLoader().then(()=>!d.isUnmounted&&Se()):Se()}else{const Se=d.subTree=Hr(d);w(null,Se,_,E,d,x,S),p.el=Se.el}if(le&&Ve(le,x),!ve&&(Y=G&&G.onVnodeMounted)){const Se=p;Ve(()=>Qe(Y,_e,Se),x)}(p.shapeFlag&256||_e&&ln(_e.vnode)&&_e.vnode.shapeFlag&256)&&d.a&&Ve(d.a,x),d.isMounted=!0,p=_=E=null}},M=d.effect=new yo(k,()=>Lr(P),d.scope),P=d.update=()=>M.run();P.id=d.uid,Nt(d,!0),P()},re=(d,p,_)=>{p.component=d;const E=d.vnode.props;d.vnode=p,d.next=null,Dc(d,p.props,E,_),Bc(d,p.children,_),pn(),is(),mn()},se=(d,p,_,E,x,S,H,k,M=!1)=>{const P=d&&d.children,Y=d?d.shapeFlag:0,V=p.children,{patchFlag:G,shapeFlag:te}=p;if(G>0){if(G&128){Me(P,V,_,E,x,S,H,k,M);return}else if(G&256){He(P,V,_,E,x,S,H,k,M);return}}te&8?(Y&16&&$e(P,x,S),V!==P&&u(_,V)):Y&16?te&16?Me(P,V,_,E,x,S,H,k,M):$e(P,x,S,!0):(Y&8&&u(_,""),te&16&&m(V,_,E,x,S,H,k,M))},He=(d,p,_,E,x,S,H,k,M)=>{d=d||nn,p=p||nn;const P=d.length,Y=p.length,V=Math.min(P,Y);let G;for(G=0;GY?$e(d,x,S,!0,!1,V):m(p,_,E,x,S,H,k,M,V)},Me=(d,p,_,E,x,S,H,k,M)=>{let P=0;const Y=p.length;let V=d.length-1,G=Y-1;for(;P<=V&&P<=G;){const te=d[P],le=p[P]=M?St(p[P]):tt(p[P]);if(zt(te,le))w(te,le,_,null,x,S,H,k,M);else break;P++}for(;P<=V&&P<=G;){const te=d[V],le=p[G]=M?St(p[G]):tt(p[G]);if(zt(te,le))w(te,le,_,null,x,S,H,k,M);else break;V--,G--}if(P>V){if(P<=G){const te=G+1,le=teG)for(;P<=V;)Fe(d[P],x,S,!0),P++;else{const te=P,le=P,_e=new Map;for(P=le;P<=G;P++){const Ke=p[P]=M?St(p[P]):tt(p[P]);Ke.key!=null&&_e.set(Ke.key,P)}let ve,Se=0;const et=G-le+1;let Qt=!1,Yo=0;const _n=new Array(et);for(P=0;P=et){Fe(Ke,x,S,!0);continue}let lt;if(Ke.key!=null)lt=_e.get(Ke.key);else for(ve=le;ve<=G;ve++)if(_n[ve-le]===0&&zt(Ke,p[ve])){lt=ve;break}lt===void 0?Fe(Ke,x,S,!0):(_n[lt-le]=P+1,lt>=Yo?Yo=lt:Qt=!0,w(Ke,p[lt],_,null,x,S,H,k,M),Se++)}const Go=Qt?Vc(_n):nn;for(ve=Go.length-1,P=et-1;P>=0;P--){const Ke=le+P,lt=p[Ke],Jo=Ke+1{const{el:S,type:H,transition:k,children:M,shapeFlag:P}=d;if(P&6){Ue(d.component.subTree,p,_,E);return}if(P&128){d.suspense.move(p,_,E);return}if(P&64){H.move(d,p,_,$);return}if(H===ye){r(S,p,_);for(let V=0;Vk.enter(S),x);else{const{leave:V,delayLeave:G,afterLeave:te}=k,le=()=>r(S,p,_),_e=()=>{V(S,()=>{le(),te&&te()})};G?G(S,le,_e):_e()}else r(S,p,_)},Fe=(d,p,_,E=!1,x=!1)=>{const{type:S,props:H,ref:k,children:M,dynamicChildren:P,shapeFlag:Y,patchFlag:V,dirs:G}=d;if(k!=null&&mr(k,null,_,d,!0),Y&256){p.ctx.deactivate(d);return}const te=Y&1&&G,le=!ln(d);let _e;if(le&&(_e=H&&H.onVnodeBeforeUnmount)&&Qe(_e,p,d),Y&6)it(d.component,_,E);else{if(Y&128){d.suspense.unmount(_,E);return}te&&at(d,null,p,"beforeUnmount"),Y&64?d.type.remove(d,p,_,x,$,E):P&&(S!==ye||V>0&&V&64)?$e(P,p,_,!1,!0):(S===ye&&V&384||!x&&Y&16)&&$e(M,p,_),E&&Et(d)}(le&&(_e=H&&H.onVnodeUnmounted)||te)&&Ve(()=>{_e&&Qe(_e,p,d),te&&at(d,null,p,"unmounted")},_)},Et=d=>{const{type:p,el:_,anchor:E,transition:x}=d;if(p===ye){wt(_,E);return}if(p===Sn){O(d);return}const S=()=>{o(_),x&&!x.persisted&&x.afterLeave&&x.afterLeave()};if(d.shapeFlag&1&&x&&!x.persisted){const{leave:H,delayLeave:k}=x,M=()=>H(_,S);k?k(d.el,S,M):M()}else S()},wt=(d,p)=>{let _;for(;d!==p;)_=h(d),o(d),d=_;o(p)},it=(d,p,_)=>{const{bum:E,scope:x,update:S,subTree:H,um:k}=d;E&&Dr(E),x.stop(),S&&(S.active=!1,Fe(H,d,p,_)),k&&Ve(k,p),Ve(()=>{d.isUnmounted=!0},p),p&&p.pendingBranch&&!p.isUnmounted&&d.asyncDep&&!d.asyncResolved&&d.suspenseId===p.pendingId&&(p.deps--,p.deps===0&&p.resolve())},$e=(d,p,_,E=!1,x=!1,S=0)=>{for(let H=S;Hd.shapeFlag&6?C(d.component.subTree):d.shapeFlag&128?d.suspense.next():h(d.anchor||d.el),B=(d,p,_)=>{d==null?p._vnode&&Fe(p._vnode,null,null,!0):w(p._vnode||null,d,p,null,null,null,_),is(),ur(),p._vnode=d},$={p:w,um:Fe,m:Ue,r:Et,mt:I,mc:m,pc:se,pbc:D,n:C,o:e};let q,ae;return t&&([q,ae]=t($)),{render:B,hydrate:q,createApp:Mc(B,q)}}function Nt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function il(e,t,n=!1){const r=e.children,o=t.children;if(J(r)&&J(o))for(let s=0;s>1,e[n[l]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,i=n[s-1];s-- >0;)n[s]=i,i=t[i];return n}const Wc=e=>e.__isTeleport,ye=Symbol.for("v-fgt"),cn=Symbol.for("v-txt"),Ge=Symbol.for("v-cmt"),Sn=Symbol.for("v-stc"),Pn=[];let rt=null;function F(e=!1){Pn.push(rt=e?null:[])}function qc(){Pn.pop(),rt=Pn[Pn.length-1]||null}let Mn=1;function _s(e){Mn+=e}function ll(e){return e.dynamicChildren=Mn>0?rt||nn:null,qc(),Mn>0&&rt&&rt.push(e),e}function Q(e,t,n,r,o,s){return ll(fe(e,t,n,r,o,s,!0))}function Pe(e,t,n,r,o){return ll(ee(e,t,n,r,o,!0))}function vr(e){return e?e.__v_isVNode===!0:!1}function zt(e,t){return e.type===t.type&&e.key===t.key}const kr="__vInternal",al=({key:e})=>e??null,sr=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?pe(e)||Ie(e)||oe(e)?{i:De,r:e,k:t,f:!!n}:e:null);function fe(e,t=null,n=null,r=0,o=null,s=e===ye?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&al(t),ref:t&&sr(t),scopeId:Ui,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:De};return l?($o(a,n),s&128&&e.normalize(a)):n&&(a.shapeFlag|=pe(n)?8:16),Mn>0&&!i&&rt&&(a.patchFlag>0||s&6)&&a.patchFlag!==32&&rt.push(a),a}const ee=Kc;function Kc(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===Lc)&&(e=Ge),vr(e)){const l=$t(e,t,!0);return n&&$o(l,n),Mn>0&&!s&&rt&&(l.shapeFlag&6?rt[rt.indexOf(e)]=l:rt.push(l)),l.patchFlag|=-2,l}if(ou(e)&&(e=e.__vccOpts),t){t=Yc(t);let{class:l,style:a}=t;l&&!pe(l)&&(t.class=We(l)),we(a)&&($i(a)&&!J(a)&&(a=Ae({},a)),t.style=Bn(a))}const i=pe(e)?1:fc(e)?128:Wc(e)?64:we(e)?4:oe(e)?2:0;return fe(e,t,n,r,o,i,s,!0)}function Yc(e){return e?$i(e)||kr in e?Ae({},e):e:null}function $t(e,t,n=!1){const{props:r,ref:o,patchFlag:s,children:i}=e,l=t?ao(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&al(l),ref:t&&t.ref?n&&o?J(o)?o.concat(sr(t)):[o,sr(t)]:sr(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ye?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&$t(e.ssContent),ssFallback:e.ssFallback&&$t(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Mt(e=" ",t=0){return ee(cn,null,e,t)}function Gc(e,t){const n=ee(Sn,null,e);return n.staticCount=t,n}function Le(e="",t=!1){return t?(F(),Pe(Ge,null,e)):ee(Ge,null,e)}function tt(e){return e==null||typeof e=="boolean"?ee(Ge):J(e)?ee(ye,null,e.slice()):typeof e=="object"?St(e):ee(cn,null,String(e))}function St(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:$t(e)}function $o(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(J(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),$o(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(kr in t)?t._ctx=De:o===3&&De&&(De.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else oe(t)?(t={default:t,_ctx:De},n=32):(t=String(t),r&64?(n=16,t=[Mt(t)]):n=8);e.children=t,e.shapeFlag|=n}function ao(...e){const t={};for(let n=0;nke||De;let Mo,Zt,bs="__VUE_INSTANCE_SETTERS__";(Zt=Qr()[bs])||(Zt=Qr()[bs]=[]),Zt.push(e=>ke=e),Mo=e=>{Zt.length>1?Zt.forEach(t=>t(e)):Zt[0](e)};const un=e=>{Mo(e),e.scope.on()},qt=()=>{ke&&ke.scope.off(),Mo(null)};function ul(e){return e.vnode.shapeFlag&4}let fn=!1;function Xc(e,t=!1){fn=t;const{props:n,children:r}=e.vnode,o=ul(e);Nc(e,n,o,t),Fc(e,r);const s=o?eu(e,t):void 0;return fn=!1,s}function eu(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Mi(new Proxy(e.ctx,Pc));const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?nu(e):null;un(e),pn();const s=kt(r,e,0,[e.props,o]);if(mn(),qt(),gi(s)){if(s.then(qt,qt),t)return s.then(i=>{ys(e,i,t)}).catch(i=>{jn(i,e,0)});e.asyncDep=s}else ys(e,s,t)}else fl(e,t)}function ys(e,t,n){oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:we(t)&&(e.setupState=Di(t)),fl(e,n)}let Es;function fl(e,t,n){const r=e.type;if(!e.render){if(!t&&Es&&!r.render){const o=r.template||Ro(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:a}=r,c=Ae(Ae({isCustomElement:s,delimiters:l},i),a);r.render=Es(o,c)}}e.render=r.render||ot}un(e),pn(),Oc(e),mn(),qt()}function tu(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return qe(e,"get","$attrs"),t[n]}}))}function nu(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return tu(e)},slots:e.slots,emit:e.emit,expose:t}}function Rr(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Di(Mi(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ln)return Ln[n](e)},has(t,n){return n in t||n in Ln}}))}function ru(e,t=!0){return oe(e)?e.displayName||e.name:e.name||t&&e.__name}function ou(e){return oe(e)&&"__vccOpts"in e}const j=(e,t)=>ec(e,t,fn);function ge(e,t,n){const r=arguments.length;return r===2?we(t)&&!J(t)?vr(t)?ee(e,null,[t]):ee(e,t):ee(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&vr(n)&&(n=[n]),ee(e,t,n))}const su=Symbol.for("v-scx"),iu=()=>Oe(su),lu="3.3.4",au="http://www.w3.org/2000/svg",jt=typeof document<"u"?document:null,ws=jt&&jt.createElement("template"),cu={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?jt.createElementNS(au,e):jt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>jt.createTextNode(e),createComment:e=>jt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>jt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{ws.innerHTML=r?`${e}`:e;const l=ws.content;if(r){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function uu(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function fu(e,t,n){const r=e.style,o=pe(n);if(n&&!o){if(t&&!pe(t))for(const s in t)n[s]==null&&co(r,s,"");for(const s in n)co(r,s,n[s])}else{const s=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=s)}}const Cs=/\s*!important$/;function co(e,t,n){if(J(n))n.forEach(r=>co(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=du(e,t);Cs.test(n)?e.setProperty(Yt(r),n.replace(Cs,""),"important"):e[r]=n}}const xs=["Webkit","Moz","ms"],jr={};function du(e,t){const n=jr[t];if(n)return n;let r=ft(t);if(r!=="filter"&&r in e)return jr[t]=r;r=Cr(r);for(let o=0;oUr||(bu.then(()=>Ur=0),Ur=Date.now());function Eu(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Ze(wu(r,n.value),t,5,[r])};return n.value=e,n.attached=yu(),n}function wu(e,t){if(J(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Ss=/^on[a-z]/,Cu=(e,t,n,r,o=!1,s,i,l,a)=>{t==="class"?uu(e,r,o):t==="style"?fu(e,n,r):Fn(t)?mo(t)||gu(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):xu(e,t,r,o))?pu(e,t,r,s,i,l,a):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),hu(e,t,r,o))};function xu(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&Ss.test(t)&&oe(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Ss.test(t)&&pe(n)?!1:t in e}const Tt="transition",bn="animation",Vn=(e,{slots:t})=>ge(mc,Tu(e),t);Vn.displayName="Transition";const dl={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Vn.props=Ae({},Ki,dl);const Dt=(e,t=[])=>{J(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ps=e=>e?J(e)?e.some(t=>t.length>1):e.length>1:!1;function Tu(e){const t={};for(const T in e)T in dl||(t[T]=e[T]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=i,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,y=Lu(o),w=y&&y[0],L=y&&y[1],{onBeforeEnter:g,onEnter:b,onEnterCancelled:A,onLeave:O,onLeaveCancelled:W,onBeforeAppear:X=g,onAppear:N=b,onAppearCancelled:m=A}=t,z=(T,R,I)=>{Ht(T,R?u:l),Ht(T,R?c:i),I&&I()},D=(T,R)=>{T._isLeaving=!1,Ht(T,f),Ht(T,v),Ht(T,h),R&&R()},K=T=>(R,I)=>{const ie=T?N:b,U=()=>z(R,T,I);Dt(ie,[R,U]),Os(()=>{Ht(R,T?a:s),Lt(R,T?u:l),Ps(ie)||As(R,r,w,U)})};return Ae(t,{onBeforeEnter(T){Dt(g,[T]),Lt(T,s),Lt(T,i)},onBeforeAppear(T){Dt(X,[T]),Lt(T,a),Lt(T,c)},onEnter:K(!1),onAppear:K(!0),onLeave(T,R){T._isLeaving=!0;const I=()=>D(T,R);Lt(T,f),Ou(),Lt(T,h),Os(()=>{T._isLeaving&&(Ht(T,f),Lt(T,v),Ps(O)||As(T,r,L,I))}),Dt(O,[T,I])},onEnterCancelled(T){z(T,!1),Dt(A,[T])},onAppearCancelled(T){z(T,!0),Dt(m,[T])},onLeaveCancelled(T){D(T),Dt(W,[T])}})}function Lu(e){if(e==null)return null;if(we(e))return[Vr(e.enter),Vr(e.leave)];{const t=Vr(e);return[t,t]}}function Vr(e){return ca(e)}function Lt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Ht(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function Os(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Su=0;function As(e,t,n,r){const o=e._endId=++Su,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=Pu(e,t);if(!i)return r();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,h),s()},h=v=>{v.target===e&&++u>=a&&f()};setTimeout(()=>{u(n[y]||"").split(", "),o=r(`${Tt}Delay`),s=r(`${Tt}Duration`),i=ks(o,s),l=r(`${bn}Delay`),a=r(`${bn}Duration`),c=ks(l,a);let u=null,f=0,h=0;t===Tt?i>0&&(u=Tt,f=i,h=s.length):t===bn?c>0&&(u=bn,f=c,h=a.length):(f=Math.max(i,c),u=f>0?i>c?Tt:bn:null,h=u?u===Tt?s.length:a.length:0);const v=u===Tt&&/\b(transform|all)(,|$)/.test(r(`${Tt}Property`).toString());return{type:u,timeout:f,propCount:h,hasTransform:v}}function ks(e,t){for(;e.lengthRs(n)+Rs(e[r])))}function Rs(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Ou(){return document.body.offsetHeight}const Au={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},ku=(e,t)=>n=>{if(!("key"in n))return;const r=Yt(n.key);if(t.some(o=>o===r||Au[o]===r))return e(n)},gr={beforeMount(e,{value:t},{transition:n}){e._vod=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):yn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),yn(e,!0),r.enter(e)):r.leave(e,()=>{yn(e,!1)}):yn(e,t))},beforeUnmount(e,{value:t}){yn(e,t)}};function yn(e,t){e.style.display=t?e._vod:"none"}const Ru=Ae({patchProp:Cu},cu);let Wr,Is=!1;function Iu(){return Wr=Is?Wr:jc(Ru),Is=!0,Wr}const $u=(...e)=>{const t=Iu().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Mu(r);if(o)return n(o,!0,o instanceof SVGElement)},t};function Mu(e){return pe(e)?document.querySelector(e):e}const Nu={"v-8daa1a0e":()=>ne(()=>import("./index.html-878c2ead.js"),[]).then(({data:e})=>e),"v-50520335":()=>ne(()=>import("./getstarted.html-604d8647.js"),[]).then(({data:e})=>e),"v-58f396b0":()=>ne(()=>import("./announcer.html-7a51f81c.js"),[]).then(({data:e})=>e),"v-743236a8":()=>ne(()=>import("./acryliccontextmenu.html-5bbdb1ab.js"),[]).then(({data:e})=>e),"v-82811736":()=>ne(()=>import("./menubar.html-7c0f687e.js"),[]).then(({data:e})=>e),"v-6d080da6":()=>ne(()=>import("./RibbonExtraButton.html-eda825ce.js"),[]).then(({data:e})=>e),"v-0927a752":()=>ne(()=>import("./FolderPickerTextbox.html-ab0722f6.js"),[]).then(({data:e})=>e),"v-3dfe4e80":()=>ne(()=>import("./GenericPickerTextbox.html-832f12ca.js"),[]).then(({data:e})=>e),"v-2a0d90d9":()=>ne(()=>import("./MasterAccentSplitButton.html-1d4b84a1.js"),[]).then(({data:e})=>e),"v-d3e07ca4":()=>ne(()=>import("./SettingsTabControl.html-a77c8a24.js"),[]).then(({data:e})=>e),"v-62097648":()=>ne(()=>import("./ribbonbar.html-f3226f98.js"),[]).then(({data:e})=>e),"v-dff51306":()=>ne(()=>import("./ThemedMessageBox.html-e2bb5172.js"),[]).then(({data:e})=>e),"v-6d901540":()=>ne(()=>import("./ThemedInputBox.html-d54e6ab2.js"),[]).then(({data:e})=>e),"v-64a25d33":()=>ne(()=>import("./ThemedOpenFileDialog.html-a55199f6.js"),[]).then(({data:e})=>e),"v-f832d4c0":()=>ne(()=>import("./ThemedSaveFileDialog.html-89b58548.js"),[]).then(({data:e})=>e),"v-6119cdde":()=>ne(()=>import("./ApplicationWindow.html-9115126c.js"),[]).then(({data:e})=>e),"v-4fc0787a":()=>ne(()=>import("./SecondaryWindow.html-7cba5db5.js"),[]).then(({data:e})=>e),"v-6799920a":()=>ne(()=>import("./TabbedApplicationWindow.html-aec0a580.js"),[]).then(({data:e})=>e),"v-74c0b233":()=>ne(()=>import("./omnibar-search-provider.html-81d8f871.js"),[]).then(({data:e})=>e),"v-a77c2404":()=>ne(()=>import("./localize-strings.html-d9e0fe50.js"),[]).then(({data:e})=>e),"v-dca8df42":()=>ne(()=>import("./ThemedSpecialDialogOptions.html-20afc891.js"),[]).then(({data:e})=>e),"v-3706649a":()=>ne(()=>import("./404.html-60b35caa.js"),[]).then(({data:e})=>e)},Du=JSON.parse('{"base":"/Coho.UI/","lang":"en-US","title":"Coho.UI, WPF Library documentation","description":"Coho.UI, WPF Library documentation","head":[],"locales":{}}');var Hu=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),Fu=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=Hu(r);t.has(o)||(t.add(o),n.push(r))}),n},Wn=e=>/^(https?:)?\/\//.test(e),Bu=e=>/^mailto:/.test(e),zu=e=>/^tel:/.test(e),No=e=>Object.prototype.toString.call(e)==="[object Object]",hl=e=>e[e.length-1]==="/"?e.slice(0,-1):e,pl=e=>e[0]==="/"?e.slice(1):e,ml=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const s=o.split("/").length-r.split("/").length;return s!==0?s:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"};const vl={"v-8daa1a0e":Te(()=>ne(()=>import("./index.html-ce787a85.js"),[])),"v-50520335":Te(()=>ne(()=>import("./getstarted.html-89bddd8d.js"),[])),"v-58f396b0":Te(()=>ne(()=>import("./announcer.html-4ababd6c.js"),[])),"v-743236a8":Te(()=>ne(()=>import("./acryliccontextmenu.html-d9ab7f7d.js"),[])),"v-82811736":Te(()=>ne(()=>import("./menubar.html-4d0f469a.js"),[])),"v-6d080da6":Te(()=>ne(()=>import("./RibbonExtraButton.html-2f917ce5.js"),[])),"v-0927a752":Te(()=>ne(()=>import("./FolderPickerTextbox.html-993af2a2.js"),[])),"v-3dfe4e80":Te(()=>ne(()=>import("./GenericPickerTextbox.html-d349b0a2.js"),[])),"v-2a0d90d9":Te(()=>ne(()=>import("./MasterAccentSplitButton.html-800cdc56.js"),[])),"v-d3e07ca4":Te(()=>ne(()=>import("./SettingsTabControl.html-16858dfd.js"),[])),"v-62097648":Te(()=>ne(()=>import("./ribbonbar.html-407dd3cf.js"),[])),"v-dff51306":Te(()=>ne(()=>import("./ThemedMessageBox.html-e81e6a12.js"),[])),"v-6d901540":Te(()=>ne(()=>import("./ThemedInputBox.html-a9c1b6f9.js"),[])),"v-64a25d33":Te(()=>ne(()=>import("./ThemedOpenFileDialog.html-74844ce8.js"),[])),"v-f832d4c0":Te(()=>ne(()=>import("./ThemedSaveFileDialog.html-e7ab8386.js"),[])),"v-6119cdde":Te(()=>ne(()=>import("./ApplicationWindow.html-85d1acf8.js"),[])),"v-4fc0787a":Te(()=>ne(()=>import("./SecondaryWindow.html-8bdfc6d8.js"),[])),"v-6799920a":Te(()=>ne(()=>import("./TabbedApplicationWindow.html-df8f4764.js"),[])),"v-74c0b233":Te(()=>ne(()=>import("./omnibar-search-provider.html-6a600717.js"),[])),"v-a77c2404":Te(()=>ne(()=>import("./localize-strings.html-f8fe7344.js"),[])),"v-dca8df42":Te(()=>ne(()=>import("./ThemedSpecialDialogOptions.html-27641d7b.js"),[])),"v-3706649a":Te(()=>ne(()=>import("./404.html-bbf19de9.js"),[]))};var ju=Symbol(""),Uu=Ee(Nu),gl=vn({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),Pt=Ee(gl),Kt=()=>Pt,_l=Symbol(""),vt=()=>{const e=Oe(_l);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},bl=Symbol(""),Vu=()=>{const e=Oe(bl);if(!e)throw new Error("usePageHead() is called without provider.");return e},Wu=Symbol(""),yl=Symbol(""),qu=()=>{const e=Oe(yl);if(!e)throw new Error("usePageLang() is called without provider.");return e},El=Symbol(""),Ku=()=>{const e=Oe(El);if(!e)throw new Error("usePageLayout() is called without provider.");return e},Do=Symbol(""),Ir=()=>{const e=Oe(Do);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},tn=Ee(Du),wl=()=>tn,Cl=Symbol(""),Ho=()=>{const e=Oe(Cl);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},Yu=Symbol(""),Gu="Layout",Ju="NotFound",ht=zn({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=Uu.value[e];return await(t==null?void 0:t())??gl},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const r=pe(t.description)?t.description:n.description,o=[...J(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return Fu(o)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{let n;if(e.path){const r=e.frontmatter.layout;pe(r)?n=r:n=Gu}else n=Ju;return t[n]},resolveRouteLocale:(e,t)=>ml(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),Fo=he({name:"ClientOnly",setup(e,t){const n=Ee(!1);return Xe(()=>{n.value=!0}),()=>{var r,o;return n.value?(o=(r=t.slots).default)==null?void 0:o.call(r):null}}}),Qu=he({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=Kt(),n=j(()=>vl[e.pageKey||t.value.key]);return()=>n.value?ge(n.value):ge("div","404 Not Found")}}),Gt=(e={})=>e,Bo=e=>Wn(e)?e:`/Coho.UI/${pl(e)}`;function xl(e,t,n){var r,o,s;t===void 0&&(t=50),n===void 0&&(n={});var i=(r=n.isImmediate)!=null&&r,l=(o=n.callback)!=null&&o,a=n.maxWait,c=Date.now(),u=[];function f(){if(a!==void 0){var v=Date.now()-c;if(v+t>=a)return a-v}return t}var h=function(){var v=[].slice.call(arguments),y=this;return new Promise(function(w,L){var g=i&&s===void 0;if(s!==void 0&&clearTimeout(s),s=setTimeout(function(){if(s=void 0,c=Date.now(),!i){var A=e.apply(y,v);l&&l(A),u.forEach(function(O){return(0,O.resolve)(A)}),u=[]}},f()),g){var b=e.apply(y,v);return l&&l(b),w(b)}u.push({resolve:w,reject:L})})};return h.cancel=function(v){s!==void 0&&clearTimeout(s),u.forEach(function(y){return(0,y.reject)(v)}),u=[]},h}/*! + * vue-router v4.2.4 + * (c) 2023 Eduardo San Martin Morote + * @license MIT + */const en=typeof window<"u";function Zu(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const me=Object.assign;function qr(e,t){const n={};for(const r in t){const o=t[r];n[r]=st(o)?o.map(e):e(o)}return n}const On=()=>{},st=Array.isArray,Xu=/\/$/,ef=e=>e.replace(Xu,"");function Kr(e,t,n="/"){let r,o={},s="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return l=0&&(a=-1),a>-1&&(r=t.slice(0,a),s=t.slice(a+1,l>-1?l:t.length),o=e(s)),l>-1&&(r=r||t.slice(0,l),i=t.slice(l,t.length)),r=of(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:i}}function tf(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function $s(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function nf(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&dn(t.matched[r],n.matched[o])&&Tl(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function dn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Tl(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!rf(e[n],t[n]))return!1;return!0}function rf(e,t){return st(e)?Ms(e,t):st(t)?Ms(t,e):e===t}function Ms(e,t){return st(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function of(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];(o===".."||o===".")&&r.push("");let s=n.length-1,i,l;for(i=0;i1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(i-(i===r.length?1:0)).join("/")}var Nn;(function(e){e.pop="pop",e.push="push"})(Nn||(Nn={}));var An;(function(e){e.back="back",e.forward="forward",e.unknown=""})(An||(An={}));function sf(e){if(!e)if(en){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),ef(e)}const lf=/^[^#]+#/;function af(e,t){return e.replace(lf,"#")+t}function cf(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const $r=()=>({left:window.pageXOffset,top:window.pageYOffset});function uf(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=cf(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function Ns(e,t){return(history.state?history.state.position-t:-1)+e}const uo=new Map;function ff(e,t){uo.set(e,t)}function df(e){const t=uo.get(e);return uo.delete(e),t}let hf=()=>location.protocol+"//"+location.host;function Ll(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let l=o.includes(e.slice(s))?e.slice(s).length:1,a=o.slice(l);return a[0]!=="/"&&(a="/"+a),$s(a,"")}return $s(n,e)+r+o}function pf(e,t,n,r){let o=[],s=[],i=null;const l=({state:h})=>{const v=Ll(e,location),y=n.value,w=t.value;let L=0;if(h){if(n.value=v,t.value=h,i&&i===y){i=null;return}L=w?h.position-w.position:0}else r(v);o.forEach(g=>{g(n.value,y,{delta:L,type:Nn.pop,direction:L?L>0?An.forward:An.back:An.unknown})})};function a(){i=n.value}function c(h){o.push(h);const v=()=>{const y=o.indexOf(h);y>-1&&o.splice(y,1)};return s.push(v),v}function u(){const{history:h}=window;h.state&&h.replaceState(me({},h.state,{scroll:$r()}),"")}function f(){for(const h of s)h();s=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",u)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",u,{passive:!0}),{pauseListeners:a,listen:c,destroy:f}}function Ds(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?$r():null}}function mf(e){const{history:t,location:n}=window,r={value:Ll(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(a,c,u){const f=e.indexOf("#"),h=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:hf()+e+a;try{t[u?"replaceState":"pushState"](c,"",h),o.value=c}catch(v){console.error(v),n[u?"replace":"assign"](h)}}function i(a,c){const u=me({},t.state,Ds(o.value.back,a,o.value.forward,!0),c,{position:o.value.position});s(a,u,!0),r.value=a}function l(a,c){const u=me({},o.value,t.state,{forward:a,scroll:$r()});s(u.current,u,!0);const f=me({},Ds(r.value,a,null),{position:u.position+1},c);s(a,f,!1),r.value=a}return{location:r,state:o,push:l,replace:i}}function vf(e){e=sf(e);const t=mf(e),n=pf(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=me({location:"",base:e,go:r,createHref:af.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function gf(e){return typeof e=="string"||e&&typeof e=="object"}function Sl(e){return typeof e=="string"||typeof e=="symbol"}const pt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Pl=Symbol("");var Hs;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Hs||(Hs={}));function hn(e,t){return me(new Error,{type:e,[Pl]:!0},t)}function dt(e,t){return e instanceof Error&&Pl in e&&(t==null||!!(e.type&t))}const Fs="[^/]+?",_f={sensitive:!1,strict:!1,start:!0,end:!0},bf=/[.+*?^${}()[\]/\\]/g;function yf(e,t){const n=me({},_f,t),r=[];let o=n.start?"^":"";const s=[];for(const c of e){const u=c.length?[]:[90];n.strict&&!c.length&&(o+="/");for(let f=0;ft.length?t.length===1&&t[0]===40+40?1:-1:0}function wf(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const Cf={type:0,value:""},xf=/[a-zA-Z0-9_]/;function Tf(e){if(!e)return[[]];if(e==="/")return[[Cf]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(v){throw new Error(`ERR (${n})/"${c}": ${v}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let l=0,a,c="",u="";function f(){c&&(n===0?s.push({type:0,value:c}):n===1||n===2||n===3?(s.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:c,regexp:u,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),c="")}function h(){c+=a}for(;l{i(b)}:On}function i(u){if(Sl(u)){const f=r.get(u);f&&(r.delete(u),n.splice(n.indexOf(f),1),f.children.forEach(i),f.alias.forEach(i))}else{const f=n.indexOf(u);f>-1&&(n.splice(f,1),u.record.name&&r.delete(u.record.name),u.children.forEach(i),u.alias.forEach(i))}}function l(){return n}function a(u){let f=0;for(;f=0&&(u.record.path!==n[f].record.path||!Ol(u,n[f]));)f++;n.splice(f,0,u),u.record.name&&!js(u)&&r.set(u.record.name,u)}function c(u,f){let h,v={},y,w;if("name"in u&&u.name){if(h=r.get(u.name),!h)throw hn(1,{location:u});w=h.record.name,v=me(zs(f.params,h.keys.filter(b=>!b.optional).map(b=>b.name)),u.params&&zs(u.params,h.keys.map(b=>b.name))),y=h.stringify(v)}else if("path"in u)y=u.path,h=n.find(b=>b.re.test(y)),h&&(v=h.parse(y),w=h.record.name);else{if(h=f.name?r.get(f.name):n.find(b=>b.re.test(f.path)),!h)throw hn(1,{location:u,currentLocation:f});w=h.record.name,v=me({},f.params,u.params),y=h.stringify(v)}const L=[];let g=h;for(;g;)L.unshift(g.record),g=g.parent;return{name:w,path:y,params:v,matched:L,meta:Af(L)}}return e.forEach(u=>s(u)),{addRoute:s,resolve:c,removeRoute:i,getRoutes:l,getRecordMatcher:o}}function zs(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Pf(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Of(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function Of(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function js(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Af(e){return e.reduce((t,n)=>me(t,n.meta),{})}function Us(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Ol(e,t){return t.children.some(n=>n===e||Ol(e,n))}const Al=/#/g,kf=/&/g,Rf=/\//g,If=/=/g,$f=/\?/g,kl=/\+/g,Mf=/%5B/g,Nf=/%5D/g,Rl=/%5E/g,Df=/%60/g,Il=/%7B/g,Hf=/%7C/g,$l=/%7D/g,Ff=/%20/g;function zo(e){return encodeURI(""+e).replace(Hf,"|").replace(Mf,"[").replace(Nf,"]")}function Bf(e){return zo(e).replace(Il,"{").replace($l,"}").replace(Rl,"^")}function fo(e){return zo(e).replace(kl,"%2B").replace(Ff,"+").replace(Al,"%23").replace(kf,"%26").replace(Df,"`").replace(Il,"{").replace($l,"}").replace(Rl,"^")}function zf(e){return fo(e).replace(If,"%3D")}function jf(e){return zo(e).replace(Al,"%23").replace($f,"%3F")}function Uf(e){return e==null?"":jf(e).replace(Rf,"%2F")}function _r(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function Vf(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&fo(s)):[r&&fo(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function Wf(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=st(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const qf=Symbol(""),Ws=Symbol(""),Mr=Symbol(""),jo=Symbol(""),ho=Symbol("");function En(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function Ot(e,t,n,r,o){const s=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((i,l)=>{const a=f=>{f===!1?l(hn(4,{from:n,to:t})):f instanceof Error?l(f):gf(f)?l(hn(2,{from:t,to:f})):(s&&r.enterCallbacks[o]===s&&typeof f=="function"&&s.push(f),i())},c=e.call(r&&r.instances[o],t,n,a);let u=Promise.resolve(c);e.length<3&&(u=u.then(a)),u.catch(f=>l(f))})}function Yr(e,t,n,r){const o=[];for(const s of e)for(const i in s.components){let l=s.components[i];if(!(t!=="beforeRouteEnter"&&!s.instances[i]))if(Kf(l)){const c=(l.__vccOpts||l)[t];c&&o.push(Ot(c,n,r,s,i))}else{let a=l();o.push(()=>a.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${i}" at "${s.path}"`));const u=Zu(c)?c.default:c;s.components[i]=u;const h=(u.__vccOpts||u)[t];return h&&Ot(h,n,r,s,i)()}))}}return o}function Kf(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function qs(e){const t=Oe(Mr),n=Oe(jo),r=j(()=>t.resolve(Z(e.to))),o=j(()=>{const{matched:a}=r.value,{length:c}=a,u=a[c-1],f=n.matched;if(!u||!f.length)return-1;const h=f.findIndex(dn.bind(null,u));if(h>-1)return h;const v=Ks(a[c-2]);return c>1&&Ks(u)===v&&f[f.length-1].path!==v?f.findIndex(dn.bind(null,a[c-2])):h}),s=j(()=>o.value>-1&&Qf(n.params,r.value.params)),i=j(()=>o.value>-1&&o.value===n.matched.length-1&&Tl(n.params,r.value.params));function l(a={}){return Jf(a)?t[Z(e.replace)?"replace":"push"](Z(e.to)).catch(On):Promise.resolve()}return{route:r,href:j(()=>r.value.href),isActive:s,isExactActive:i,navigate:l}}const Yf=he({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:qs,setup(e,{slots:t}){const n=zn(qs(e)),{options:r}=Oe(Mr),o=j(()=>({[Ys(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Ys(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:ge("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),Gf=Yf;function Jf(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Qf(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!st(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function Ks(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Ys=(e,t,n)=>e??t??n,Zf=he({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Oe(ho),o=j(()=>e.route||r.value),s=Oe(Ws,0),i=j(()=>{let c=Z(s);const{matched:u}=o.value;let f;for(;(f=u[c])&&!f.components;)c++;return c}),l=j(()=>o.value.matched[i.value]);Wt(Ws,j(()=>i.value+1)),Wt(qf,l),Wt(ho,o);const a=Ee();return ut(()=>[a.value,l.value,e.name],([c,u,f],[h,v,y])=>{u&&(u.instances[f]=c,v&&v!==u&&c&&c===h&&(u.leaveGuards.size||(u.leaveGuards=v.leaveGuards),u.updateGuards.size||(u.updateGuards=v.updateGuards))),c&&u&&(!v||!dn(u,v)||!h)&&(u.enterCallbacks[f]||[]).forEach(w=>w(c))},{flush:"post"}),()=>{const c=o.value,u=e.name,f=l.value,h=f&&f.components[u];if(!h)return Gs(n.default,{Component:h,route:c});const v=f.props[u],y=v?v===!0?c.params:typeof v=="function"?v(c):v:null,L=ge(h,me({},y,t,{onVnodeUnmounted:g=>{g.component.isUnmounted&&(f.instances[u]=null)},ref:a}));return Gs(n.default,{Component:L,route:c})||L}}});function Gs(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Ml=Zf;function Xf(e){const t=Sf(e.routes,e),n=e.parseQuery||Vf,r=e.stringifyQuery||Vs,o=e.history,s=En(),i=En(),l=En(),a=Po(pt);let c=pt;en&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=qr.bind(null,C=>""+C),f=qr.bind(null,Uf),h=qr.bind(null,_r);function v(C,B){let $,q;return Sl(C)?($=t.getRecordMatcher(C),q=B):q=C,t.addRoute(q,$)}function y(C){const B=t.getRecordMatcher(C);B&&t.removeRoute(B)}function w(){return t.getRoutes().map(C=>C.record)}function L(C){return!!t.getRecordMatcher(C)}function g(C,B){if(B=me({},B||a.value),typeof C=="string"){const _=Kr(n,C,B.path),E=t.resolve({path:_.path},B),x=o.createHref(_.fullPath);return me(_,E,{params:h(E.params),hash:_r(_.hash),redirectedFrom:void 0,href:x})}let $;if("path"in C)$=me({},C,{path:Kr(n,C.path,B.path).path});else{const _=me({},C.params);for(const E in _)_[E]==null&&delete _[E];$=me({},C,{params:f(_)}),B.params=f(B.params)}const q=t.resolve($,B),ae=C.hash||"";q.params=u(h(q.params));const d=tf(r,me({},C,{hash:Bf(ae),path:q.path})),p=o.createHref(d);return me({fullPath:d,hash:ae,query:r===Vs?Wf(C.query):C.query||{}},q,{redirectedFrom:void 0,href:p})}function b(C){return typeof C=="string"?Kr(n,C,a.value.path):me({},C)}function A(C,B){if(c!==C)return hn(8,{from:B,to:C})}function O(C){return N(C)}function W(C){return O(me(b(C),{replace:!0}))}function X(C){const B=C.matched[C.matched.length-1];if(B&&B.redirect){const{redirect:$}=B;let q=typeof $=="function"?$(C):$;return typeof q=="string"&&(q=q.includes("?")||q.includes("#")?q=b(q):{path:q},q.params={}),me({query:C.query,hash:C.hash,params:"path"in q?{}:C.params},q)}}function N(C,B){const $=c=g(C),q=a.value,ae=C.state,d=C.force,p=C.replace===!0,_=X($);if(_)return N(me(b(_),{state:typeof _=="object"?me({},ae,_.state):ae,force:d,replace:p}),B||$);const E=$;E.redirectedFrom=B;let x;return!d&&nf(r,q,$)&&(x=hn(16,{to:E,from:q}),Ue(q,q,!0,!1)),(x?Promise.resolve(x):D(E,q)).catch(S=>dt(S)?dt(S,2)?S:Me(S):se(S,E,q)).then(S=>{if(S){if(dt(S,2))return N(me({replace:p},b(S.to),{state:typeof S.to=="object"?me({},ae,S.to.state):ae,force:d}),B||E)}else S=T(E,q,!0,p,ae);return K(E,q,S),S})}function m(C,B){const $=A(C,B);return $?Promise.reject($):Promise.resolve()}function z(C){const B=wt.values().next().value;return B&&typeof B.runWithContext=="function"?B.runWithContext(C):C()}function D(C,B){let $;const[q,ae,d]=ed(C,B);$=Yr(q.reverse(),"beforeRouteLeave",C,B);for(const _ of q)_.leaveGuards.forEach(E=>{$.push(Ot(E,C,B))});const p=m.bind(null,C,B);return $.push(p),$e($).then(()=>{$=[];for(const _ of s.list())$.push(Ot(_,C,B));return $.push(p),$e($)}).then(()=>{$=Yr(ae,"beforeRouteUpdate",C,B);for(const _ of ae)_.updateGuards.forEach(E=>{$.push(Ot(E,C,B))});return $.push(p),$e($)}).then(()=>{$=[];for(const _ of d)if(_.beforeEnter)if(st(_.beforeEnter))for(const E of _.beforeEnter)$.push(Ot(E,C,B));else $.push(Ot(_.beforeEnter,C,B));return $.push(p),$e($)}).then(()=>(C.matched.forEach(_=>_.enterCallbacks={}),$=Yr(d,"beforeRouteEnter",C,B),$.push(p),$e($))).then(()=>{$=[];for(const _ of i.list())$.push(Ot(_,C,B));return $.push(p),$e($)}).catch(_=>dt(_,8)?_:Promise.reject(_))}function K(C,B,$){l.list().forEach(q=>z(()=>q(C,B,$)))}function T(C,B,$,q,ae){const d=A(C,B);if(d)return d;const p=B===pt,_=en?history.state:{};$&&(q||p?o.replace(C.fullPath,me({scroll:p&&_&&_.scroll},ae)):o.push(C.fullPath,ae)),a.value=C,Ue(C,B,$,p),Me()}let R;function I(){R||(R=o.listen((C,B,$)=>{if(!it.listening)return;const q=g(C),ae=X(q);if(ae){N(me(ae,{replace:!0}),q).catch(On);return}c=q;const d=a.value;en&&ff(Ns(d.fullPath,$.delta),$r()),D(q,d).catch(p=>dt(p,12)?p:dt(p,2)?(N(p.to,q).then(_=>{dt(_,20)&&!$.delta&&$.type===Nn.pop&&o.go(-1,!1)}).catch(On),Promise.reject()):($.delta&&o.go(-$.delta,!1),se(p,q,d))).then(p=>{p=p||T(q,d,!1),p&&($.delta&&!dt(p,8)?o.go(-$.delta,!1):$.type===Nn.pop&&dt(p,20)&&o.go(-1,!1)),K(q,d,p)}).catch(On)}))}let ie=En(),U=En(),re;function se(C,B,$){Me(C);const q=U.list();return q.length?q.forEach(ae=>ae(C,B,$)):console.error(C),Promise.reject(C)}function He(){return re&&a.value!==pt?Promise.resolve():new Promise((C,B)=>{ie.add([C,B])})}function Me(C){return re||(re=!C,I(),ie.list().forEach(([B,$])=>C?$(C):B()),ie.reset()),C}function Ue(C,B,$,q){const{scrollBehavior:ae}=e;if(!en||!ae)return Promise.resolve();const d=!$&&df(Ns(C.fullPath,0))||(q||!$)&&history.state&&history.state.scroll||null;return Tr().then(()=>ae(C,B,d)).then(p=>p&&uf(p)).catch(p=>se(p,C,B))}const Fe=C=>o.go(C);let Et;const wt=new Set,it={currentRoute:a,listening:!0,addRoute:v,removeRoute:y,hasRoute:L,getRoutes:w,resolve:g,options:e,push:O,replace:W,go:Fe,back:()=>Fe(-1),forward:()=>Fe(1),beforeEach:s.add,beforeResolve:i.add,afterEach:l.add,onError:U.add,isReady:He,install(C){const B=this;C.component("RouterLink",Gf),C.component("RouterView",Ml),C.config.globalProperties.$router=B,Object.defineProperty(C.config.globalProperties,"$route",{enumerable:!0,get:()=>Z(a)}),en&&!Et&&a.value===pt&&(Et=!0,O(o.location).catch(ae=>{}));const $={};for(const ae in pt)Object.defineProperty($,ae,{get:()=>a.value[ae],enumerable:!0});C.provide(Mr,B),C.provide(jo,Ii($)),C.provide(ho,a);const q=C.unmount;wt.add(C),C.unmount=function(){wt.delete(C),wt.size<1&&(c=pt,R&&R(),R=null,a.value=pt,Et=!1,re=!1),q()}}};function $e(C){return C.reduce((B,$)=>B.then(()=>z($)),Promise.resolve())}return it}function ed(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;idn(c,l))?r.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(c=>dn(c,a))||o.push(a))}return[n,r,o]}function gn(){return Oe(Mr)}function Jt(){return Oe(jo)}const td=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:r=5})=>{const o=gn(),i=xl(()=>{var w,L;const l=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(l-0)h.some(b=>b.hash===g.hash));for(let g=0;g=(((w=b.parentElement)==null?void 0:w.offsetTop)??0)-r,W=!A||l<(((L=A.parentElement)==null?void 0:L.offsetTop)??0)-r;if(!(O&&W))continue;const N=decodeURIComponent(o.currentRoute.value.hash),m=decodeURIComponent(b.hash);if(N===m)return;if(f){for(let z=g+1;z{window.addEventListener("scroll",i)}),Or(()=>{window.removeEventListener("scroll",i)})},Js=async(e,t)=>{const{scrollBehavior:n}=e.options;e.options.scrollBehavior=void 0,await e.replace({query:e.currentRoute.value.query,hash:t}).finally(()=>e.options.scrollBehavior=n)},nd="a.sidebar-item",rd=".header-anchor",od=300,sd=5,id=Gt({setup(){td({headerLinkSelector:nd,headerAnchorSelector:rd,delay:od,offset:sd})}}),Qs=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,ld=()=>window.scrollTo({top:0,behavior:"smooth"});const ad=he({name:"BackToTop",setup(){const e=Ee(0),t=j(()=>e.value>300),n=xl(()=>{e.value=Qs()},100);Xe(()=>{e.value=Qs(),window.addEventListener("scroll",()=>n())});const r=ge("div",{class:"back-to-top",onClick:ld});return()=>ge(Vn,{name:"back-to-top"},()=>t.value?r:null)}}),cd=Gt({rootComponents:[ad]});const ud=ge("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[ge("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),ge("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),fd=he({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const t=Ir(),n=j(()=>e.locales[t.value]??{openInNewWindow:"open in new window"});return()=>ge("span",[ud,ge("span",{class:"external-link-icon-sr-only"},n.value.openInNewWindow)])}}),dd={"/":{openInNewWindow:"open in new window"}},hd=Gt({enhance({app:e}){e.component("ExternalLinkIcon",ge(fd,{locales:dd}))}});/*! medium-zoom 1.0.8 | MIT License | https://github.com/francoischalifour/medium-zoom */var Ft=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==void 0?arguments[1]:{},r=window.Promise||function(T){function R(){}T(R,R)},o=function(T){var R=T.target;if(R===z){y();return}A.indexOf(R)!==-1&&w({target:R})},s=function(){if(!(W||!m.original)){var T=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(X-T)>N.scrollOffset&&setTimeout(y,150)}},i=function(T){var R=T.key||T.keyCode;(R==="Escape"||R==="Esc"||R===27)&&y()},l=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},R=T;if(T.background&&(z.style.background=T.background),T.container&&T.container instanceof Object&&(R.container=Ft({},N.container,T.container)),T.template){var I=ir(T.template)?T.template:document.querySelector(T.template);R.template=I}return N=Ft({},N,R),A.forEach(function(ie){ie.dispatchEvent(Xt("medium-zoom:update",{detail:{zoom:D}}))}),D},a=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(Ft({},N,T))},c=function(){for(var T=arguments.length,R=Array(T),I=0;I0?R.reduce(function(U,re){return[].concat(U,Xs(re))},[]):A;return ie.forEach(function(U){U.classList.remove("medium-zoom-image"),U.dispatchEvent(Xt("medium-zoom:detach",{detail:{zoom:D}}))}),A=A.filter(function(U){return ie.indexOf(U)===-1}),D},f=function(T,R){var I=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return A.forEach(function(ie){ie.addEventListener("medium-zoom:"+T,R,I)}),O.push({type:"medium-zoom:"+T,listener:R,options:I}),D},h=function(T,R){var I=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return A.forEach(function(ie){ie.removeEventListener("medium-zoom:"+T,R,I)}),O=O.filter(function(ie){return!(ie.type==="medium-zoom:"+T&&ie.listener.toString()===R.toString())}),D},v=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},R=T.target,I=function(){var U={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},re=void 0,se=void 0;if(N.container)if(N.container instanceof Object)U=Ft({},U,N.container),re=U.width-U.left-U.right-N.margin*2,se=U.height-U.top-U.bottom-N.margin*2;else{var He=ir(N.container)?N.container:document.querySelector(N.container),Me=He.getBoundingClientRect(),Ue=Me.width,Fe=Me.height,Et=Me.left,wt=Me.top;U=Ft({},U,{width:Ue,height:Fe,left:Et,top:wt})}re=re||U.width-N.margin*2,se=se||U.height-N.margin*2;var it=m.zoomedHd||m.original,$e=Zs(it)?re:it.naturalWidth||re,C=Zs(it)?se:it.naturalHeight||se,B=it.getBoundingClientRect(),$=B.top,q=B.left,ae=B.width,d=B.height,p=Math.min(Math.max(ae,$e),re)/ae,_=Math.min(Math.max(d,C),se)/d,E=Math.min(p,_),x=(-q+(re-ae)/2+N.margin+U.left)/E,S=(-$+(se-d)/2+N.margin+U.top)/E,H="scale("+E+") translate3d("+x+"px, "+S+"px, 0)";m.zoomed.style.transform=H,m.zoomedHd&&(m.zoomedHd.style.transform=H)};return new r(function(ie){if(R&&A.indexOf(R)===-1){ie(D);return}var U=function Ue(){W=!1,m.zoomed.removeEventListener("transitionend",Ue),m.original.dispatchEvent(Xt("medium-zoom:opened",{detail:{zoom:D}})),ie(D)};if(m.zoomed){ie(D);return}if(R)m.original=R;else if(A.length>0){var re=A;m.original=re[0]}else{ie(D);return}if(m.original.dispatchEvent(Xt("medium-zoom:open",{detail:{zoom:D}})),X=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,W=!0,m.zoomed=vd(m.original),document.body.appendChild(z),N.template){var se=ir(N.template)?N.template:document.querySelector(N.template);m.template=document.createElement("div"),m.template.appendChild(se.content.cloneNode(!0)),document.body.appendChild(m.template)}if(m.original.parentElement&&m.original.parentElement.tagName==="PICTURE"&&m.original.currentSrc&&(m.zoomed.src=m.original.currentSrc),document.body.appendChild(m.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),m.original.classList.add("medium-zoom-image--hidden"),m.zoomed.classList.add("medium-zoom-image--opened"),m.zoomed.addEventListener("click",y),m.zoomed.addEventListener("transitionend",U),m.original.getAttribute("data-zoom-src")){m.zoomedHd=m.zoomed.cloneNode(),m.zoomedHd.removeAttribute("srcset"),m.zoomedHd.removeAttribute("sizes"),m.zoomedHd.removeAttribute("loading"),m.zoomedHd.src=m.zoomed.getAttribute("data-zoom-src"),m.zoomedHd.onerror=function(){clearInterval(He),console.warn("Unable to reach the zoom image target "+m.zoomedHd.src),m.zoomedHd=null,I()};var He=setInterval(function(){m.zoomedHd.complete&&(clearInterval(He),m.zoomedHd.classList.add("medium-zoom-image--opened"),m.zoomedHd.addEventListener("click",y),document.body.appendChild(m.zoomedHd),I())},10)}else if(m.original.hasAttribute("srcset")){m.zoomedHd=m.zoomed.cloneNode(),m.zoomedHd.removeAttribute("sizes"),m.zoomedHd.removeAttribute("loading");var Me=m.zoomedHd.addEventListener("load",function(){m.zoomedHd.removeEventListener("load",Me),m.zoomedHd.classList.add("medium-zoom-image--opened"),m.zoomedHd.addEventListener("click",y),document.body.appendChild(m.zoomedHd),I()})}else I()})},y=function(){return new r(function(T){if(W||!m.original){T(D);return}var R=function I(){m.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(m.zoomed),m.zoomedHd&&document.body.removeChild(m.zoomedHd),document.body.removeChild(z),m.zoomed.classList.remove("medium-zoom-image--opened"),m.template&&document.body.removeChild(m.template),W=!1,m.zoomed.removeEventListener("transitionend",I),m.original.dispatchEvent(Xt("medium-zoom:closed",{detail:{zoom:D}})),m.original=null,m.zoomed=null,m.zoomedHd=null,m.template=null,T(D)};W=!0,document.body.classList.remove("medium-zoom--opened"),m.zoomed.style.transform="",m.zoomedHd&&(m.zoomedHd.style.transform=""),m.template&&(m.template.style.transition="opacity 150ms",m.template.style.opacity=0),m.original.dispatchEvent(Xt("medium-zoom:close",{detail:{zoom:D}})),m.zoomed.addEventListener("transitionend",R)})},w=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},R=T.target;return m.original?y():v({target:R})},L=function(){return N},g=function(){return A},b=function(){return m.original},A=[],O=[],W=!1,X=0,N=n,m={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(t)==="[object Object]"?N=t:(t||typeof t=="string")&&c(t),N=Ft({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},N);var z=md(N.background);document.addEventListener("click",o),document.addEventListener("keyup",i),document.addEventListener("scroll",s),window.addEventListener("resize",y);var D={open:v,close:y,toggle:w,update:l,clone:a,attach:c,detach:u,on:f,off:h,getOptions:L,getImages:g,getZoomedImage:b};return D};function _d(e,t){t===void 0&&(t={});var n=t.insertAt;if(!(!e||typeof document>"u")){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var bd=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";_d(bd);const yd=gd,Ed=Symbol("mediumZoom");const wd=".theme-default-content > img, .theme-default-content :not(a) > img",Cd={},xd=300,Td=Gt({enhance({app:e,router:t}){const n=yd(Cd);n.refresh=(r=wd)=>{n.detach(),n.attach(r)},e.provide(Ed,n),t.afterEach(()=>{setTimeout(()=>n.refresh(),xd)})}});/** + * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT + */const ce={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
'},status:null,set:e=>{const t=ce.isStarted();e=Gr(e,ce.settings.minimum,1),ce.status=e===1?null:e;const n=ce.render(!t),r=n.querySelector(ce.settings.barSelector),o=ce.settings.speed,s=ce.settings.easing;return n.offsetWidth,Ld(i=>{tr(r,{transform:"translate3d("+ei(e)+"%,0,0)",transition:"all "+o+"ms "+s}),e===1?(tr(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout(function(){tr(n,{transition:"all "+o+"ms linear",opacity:"0"}),setTimeout(function(){ce.remove(),i()},o)},o)):setTimeout(()=>i(),o)}),ce},isStarted:()=>typeof ce.status=="number",start:()=>{ce.status||ce.set(0);const e=()=>{setTimeout(()=>{ce.status&&(ce.trickle(),e())},ce.settings.trickleSpeed)};return ce.settings.trickle&&e(),ce},done:e=>!e&&!ce.status?ce:ce.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=ce.status;return t?(typeof e!="number"&&(e=(1-t)*Gr(Math.random()*t,.1,.95)),t=Gr(t+e,0,.994),ce.set(t)):ce.start()},trickle:()=>ce.inc(Math.random()*ce.settings.trickleRate),render:e=>{if(ce.isRendered())return document.getElementById("nprogress");ti(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=ce.settings.template;const n=t.querySelector(ce.settings.barSelector),r=e?"-100":ei(ce.status||0),o=document.querySelector(ce.settings.parent);return tr(n,{transition:"all 0 linear",transform:"translate3d("+r+"%,0,0)"}),o!==document.body&&ti(o,"nprogress-custom-parent"),o==null||o.appendChild(t),t},remove:()=>{ni(document.documentElement,"nprogress-busy"),ni(document.querySelector(ce.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&Sd(e)},isRendered:()=>!!document.getElementById("nprogress")},Gr=(e,t,n)=>en?n:e,ei=e=>(-1+e)*100,Ld=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),e.length===1&&t()}}(),tr=function(){const e=["Webkit","O","Moz","ms"],t={};function n(i){return i.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(l,a){return a.toUpperCase()})}function r(i){const l=document.body.style;if(i in l)return i;let a=e.length;const c=i.charAt(0).toUpperCase()+i.slice(1);let u;for(;a--;)if(u=e[a]+c,u in l)return u;return i}function o(i){return i=n(i),t[i]??(t[i]=r(i))}function s(i,l,a){l=o(l),i.style[l]=a}return function(i,l){for(const a in l){const c=l[a];c!==void 0&&Object.prototype.hasOwnProperty.call(l,a)&&s(i,a,c)}}}(),Nl=(e,t)=>(typeof e=="string"?e:Uo(e)).indexOf(" "+t+" ")>=0,ti=(e,t)=>{const n=Uo(e),r=n+t;Nl(n,t)||(e.className=r.substring(1))},ni=(e,t)=>{const n=Uo(e);if(!Nl(e,t))return;const r=n.replace(" "+t+" "," ");e.className=r.substring(1,r.length-1)},Uo=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),Sd=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)};const Pd=()=>{Xe(()=>{const e=gn(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||ce.start()}),e.afterEach(n=>{t.add(n.path),ce.done()})})},Od=Gt({setup(){Pd()}}),Ad=JSON.parse(`{"sidebar":[{"text":"","children":[{"text":"Introduction","link":"/index.md","children":[]},{"text":"Getting started","link":"/getstarted.md","children":[]}]},{"text":"Windows","children":[{"text":"ApplicationWindow","link":"/windows/ApplicationWindow.md"},{"text":"SecondaryWindow","link":"/windows/SecondaryWindow.md"},{"text":"TabbedApplicationWindow","link":"/windows/TabbedApplicationWindow.md"}]},{"text":"Controls","children":[{"text":"AcrylicContextMenu","link":"/controls/acryliccontextmenu.md"},{"text":"Announcer","link":"/controls/announcer.md"},{"text":"FolderPickerTextbox","link":"/controls/FolderPickerTextbox.md"},{"text":"MasterAccentSplitButton","link":"/controls/MasterAccentSplitButton.md"},{"text":"MenuBar","link":"/controls/MenuBar.md"},{"text":"RibbonBar","link":"/controls/Ribbonbar.md"},{"text":"SettingsTabControl","link":"/controls/SettingsTabControl.md"}]},{"text":"Themed Dialogs","children":[{"text":"ThemedInputBox","link":"/dialogs/ThemedInputBox.md"},{"text":"ThemedMessageBox","link":"/dialogs/ThemedMessageBox.md"},{"text":"ThemedOpenFileDialog","link":"/dialogs/ThemedOpenFileDialog.md"}]},{"text":"Classes","children":[{"text":"ThemedSpecialDialogOptions","link":"/classes/ThemedSpecialDialogOptions.md"}]},{"text":"How-Tos","children":[{"text":"Build custom search provider for the Omnibar","link":"/howto/omnibar-search-provider.md"},{"text":"Localize default strings","link":"/howto/localize-strings.md"}]}],"navbar":[],"locales":{"/":{"selectLanguageName":"English"}},"colorMode":"auto","colorModeSwitch":true,"logo":null,"repo":null,"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebarDepth":2,"editLink":true,"editLinkText":"Edit this page","lastUpdated":true,"lastUpdatedText":"Last Updated","contributors":true,"contributorsText":"Contributors","notFound":["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}`),kd=Ee(Ad),Dl=()=>kd,Hl=Symbol(""),Rd=()=>{const e=Oe(Hl);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},Id=(e,t)=>{const{locales:n,...r}=e;return{...r,...n==null?void 0:n[t]}},$d=Gt({enhance({app:e}){const t=Dl(),n=e._context.provides[Do],r=j(()=>Id(t.value,n.value));e.provide(Hl,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),Md=he({__name:"Badge",props:{type:{type:String,required:!1,default:"tip"},text:{type:String,required:!1,default:""},vertical:{type:String,required:!1,default:void 0}},setup(e){return(t,n)=>(F(),Q("span",{class:We(["badge",e.type]),style:Bn({verticalAlign:e.vertical})},[be(t.$slots,"default",{},()=>[Mt(Re(e.text),1)])],6))}}),xe=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},Nd=xe(Md,[["__file","Badge.vue"]]),Dd=he({name:"CodeGroup",slots:Object,setup(e,{slots:t}){const n=Ee(-1),r=Ee([]),o=(l=n.value)=>{l{l>0?n.value=l-1:n.value=r.value.length-1,r.value[n.value].focus()},i=(l,a)=>{l.key===" "||l.key==="Enter"?(l.preventDefault(),n.value=a):l.key==="ArrowRight"?(l.preventDefault(),o(a)):l.key==="ArrowLeft"&&(l.preventDefault(),s(a))};return()=>{var a;const l=(((a=t.default)==null?void 0:a.call(t))||[]).filter(c=>c.type.name==="CodeGroupItem").map(c=>(c.props===null&&(c.props={}),c));return l.length===0?null:(n.value<0||n.value>l.length-1?(n.value=l.findIndex(c=>c.props.active===""||c.props.active===!0),n.value===-1&&(n.value=0)):l.forEach((c,u)=>{c.props.active=u===n.value}),ge("div",{class:"code-group"},[ge("div",{class:"code-group__nav"},ge("ul",{class:"code-group__ul"},l.map((c,u)=>{const f=u===n.value;return ge("li",{class:"code-group__li"},ge("button",{ref:h=>{h&&(r.value[u]=h)},class:{"code-group__nav-tab":!0,"code-group__nav-tab-active":f},ariaPressed:f,ariaExpanded:f,onClick:()=>n.value=u,onKeydown:h=>i(h,u)},c.props.title))}))),l]))}}}),Hd=["aria-selected"],Fd=he({name:"CodeGroupItem"}),Bd=he({...Fd,props:{title:{type:String,required:!0},active:{type:Boolean,required:!1,default:!1}},setup(e){return(t,n)=>(F(),Q("div",{class:We(["code-group-item",{"code-group-item__active":e.active}]),"aria-selected":e.active},[be(t.$slots,"default")],10,Hd))}}),zd=xe(Bd,[["__file","CodeGroupItem.vue"]]);var jd=Object.defineProperty,Ud=Object.defineProperties,Vd=Object.getOwnPropertyDescriptors,ri=Object.getOwnPropertySymbols,Wd=Object.prototype.hasOwnProperty,qd=Object.prototype.propertyIsEnumerable,oi=(e,t,n)=>t in e?jd(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Kd=(e,t)=>{for(var n in t||(t={}))Wd.call(t,n)&&oi(e,n,t[n]);if(ri)for(var n of ri(t))qd.call(t,n)&&oi(e,n,t[n]);return e},Yd=(e,t)=>Ud(e,Vd(t));function si(e,t){var n;const r=Po();return Wi(()=>{r.value=e()},Yd(Kd({},t),{flush:(n=t==null?void 0:t.flush)!=null?n:"sync"})),vn(r)}function Fl(e){return wi()?(_a(e),!0):!1}function Dn(e){return typeof e=="function"?e():Z(e)}const Gd=typeof window<"u",Bl=()=>{};function Jd(e,t){function n(...r){return new Promise((o,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(o).catch(s)})}return n}const zl=e=>e();function Qd(e=zl){const t=Ee(!0);function n(){t.value=!1}function r(){t.value=!0}const o=(...s)=>{t.value&&e(...s)};return{isActive:vn(t),pause:n,resume:r,eventFilter:o}}function Zd(...e){if(e.length!==1)return Za(...e);const t=e[0];return typeof t=="function"?vn(Ga(()=>({get:t,set:Bl}))):Ee(t)}function Xd(e=!1,t={}){const{truthyValue:n=!0,falsyValue:r=!1}=t,o=Ie(e),s=Ee(e);function i(l){if(arguments.length)return s.value=l,s.value;{const a=Dn(n);return s.value=s.value===a?Dn(r):a,s.value}}return o?i:[s,i]}var ii=Object.getOwnPropertySymbols,eh=Object.prototype.hasOwnProperty,th=Object.prototype.propertyIsEnumerable,nh=(e,t)=>{var n={};for(var r in e)eh.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&ii)for(var r of ii(e))t.indexOf(r)<0&&th.call(e,r)&&(n[r]=e[r]);return n};function rh(e,t,n={}){const r=n,{eventFilter:o=zl}=r,s=nh(r,["eventFilter"]);return ut(e,Jd(o,t),s)}var oh=Object.defineProperty,sh=Object.defineProperties,ih=Object.getOwnPropertyDescriptors,br=Object.getOwnPropertySymbols,jl=Object.prototype.hasOwnProperty,Ul=Object.prototype.propertyIsEnumerable,li=(e,t,n)=>t in e?oh(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,lh=(e,t)=>{for(var n in t||(t={}))jl.call(t,n)&&li(e,n,t[n]);if(br)for(var n of br(t))Ul.call(t,n)&&li(e,n,t[n]);return e},ah=(e,t)=>sh(e,ih(t)),ch=(e,t)=>{var n={};for(var r in e)jl.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&br)for(var r of br(e))t.indexOf(r)<0&&Ul.call(e,r)&&(n[r]=e[r]);return n};function uh(e,t,n={}){const r=n,{eventFilter:o}=r,s=ch(r,["eventFilter"]),{eventFilter:i,pause:l,resume:a,isActive:c}=Qd(o);return{stop:rh(e,t,ah(lh({},s),{eventFilter:i})),pause:l,resume:a,isActive:c}}function fh(e){var t;const n=Dn(e);return(t=n==null?void 0:n.$el)!=null?t:n}const yr=Gd?window:void 0;function ai(...e){let t,n,r,o;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,o]=e,t=yr):[t,n,r,o]=e,!t)return Bl;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],i=()=>{s.forEach(u=>u()),s.length=0},l=(u,f,h,v)=>(u.addEventListener(f,h,v),()=>u.removeEventListener(f,h,v)),a=ut(()=>[fh(t),Dn(o)],([u,f])=>{i(),u&&s.push(...n.flatMap(h=>r.map(v=>l(u,h,v,f))))},{immediate:!0,flush:"post"}),c=()=>{a(),i()};return Fl(c),c}function dh(){const e=Ee(!1);return cl()&&Xe(()=>{e.value=!0}),e}function hh(e){const t=dh();return j(()=>(t.value,!!e()))}function ph(e,t={}){const{window:n=yr}=t,r=hh(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let o;const s=Ee(!1),i=()=>{o&&("removeEventListener"in o?o.removeEventListener("change",l):o.removeListener(l))},l=()=>{r.value&&(i(),o=n.matchMedia(Zd(e).value),s.value=!!(o!=null&&o.matches),o&&("addEventListener"in o?o.addEventListener("change",l):o.addListener(l)))};return Wi(l),Fl(()=>i()),s}const nr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},rr="__vueuse_ssr_handlers__",mh=vh();function vh(){return rr in nr||(nr[rr]=nr[rr]||{}),nr[rr]}function gh(e,t){return mh[e]||t}function _h(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}var bh=Object.defineProperty,ci=Object.getOwnPropertySymbols,yh=Object.prototype.hasOwnProperty,Eh=Object.prototype.propertyIsEnumerable,ui=(e,t,n)=>t in e?bh(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,fi=(e,t)=>{for(var n in t||(t={}))yh.call(t,n)&&ui(e,n,t[n]);if(ci)for(var n of ci(t))Eh.call(t,n)&&ui(e,n,t[n]);return e};const wh={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},di="vueuse-storage";function Ch(e,t,n,r={}){var o;const{flush:s="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:a=!0,mergeDefaults:c=!1,shallow:u,window:f=yr,eventFilter:h,onError:v=m=>{console.error(m)}}=r,y=(u?Po:Ee)(t);if(!n)try{n=gh("getDefaultStorage",()=>{var m;return(m=yr)==null?void 0:m.localStorage})()}catch(m){v(m)}if(!n)return y;const w=Dn(t),L=_h(w),g=(o=r.serializer)!=null?o:wh[L],{pause:b,resume:A}=uh(y,()=>O(y.value),{flush:s,deep:i,eventFilter:h});return f&&l&&(ai(f,"storage",N),ai(f,di,X)),N(),y;function O(m){try{if(m==null)n.removeItem(e);else{const z=g.write(m),D=n.getItem(e);D!==z&&(n.setItem(e,z),f&&f.dispatchEvent(new CustomEvent(di,{detail:{key:e,oldValue:D,newValue:z,storageArea:n}})))}}catch(z){v(z)}}function W(m){const z=m?m.newValue:n.getItem(e);if(z==null)return a&&w!==null&&n.setItem(e,g.write(w)),w;if(!m&&c){const D=g.read(z);return typeof c=="function"?c(D,w):L==="object"&&!Array.isArray(D)?fi(fi({},w),D):D}else return typeof z!="string"?z:g.read(z)}function X(m){N(m.detail)}function N(m){if(!(m&&m.storageArea!==n)){if(m&&m.key==null){y.value=w;return}if(!(m&&m.key!==e)){b();try{y.value=W(m)}catch(z){v(z)}finally{m?Tr(A):A()}}}}}function xh(e){return ph("(prefers-color-scheme: dark)",e)}const Th=()=>Dl(),je=()=>Rd(),Vl=Symbol(""),Vo=()=>{const e=Oe(Vl);if(!e)throw new Error("useDarkMode() is called without provider.");return e},Lh=()=>{const e=je(),t=xh(),n=Ch("vuepress-color-scheme",e.value.colorMode),r=j({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?n.value="auto":n.value=o?"dark":"light"}});Wt(Vl,r),Sh(r)},Sh=e=>{const t=(n=e.value)=>{const r=window==null?void 0:window.document.querySelector("html");r==null||r.classList.toggle("dark",n)};Xe(()=>{ut(e,t,{immediate:!0})}),Ar(()=>t())},Wl=(...e)=>{const n=gn().resolve(...e),r=n.matched[n.matched.length-1];if(!(r!=null&&r.redirect))return n;const{redirect:o}=r,s=oe(o)?o(n):o,i=pe(s)?{path:s}:s;return Wl({hash:n.hash,query:n.query,params:n.params,...i})},Wo=e=>{const t=Wl(encodeURI(e));return{text:t.meta.title||e,link:t.name==="404"?e:t.fullPath}};let Jr=null,wn=null;const Ph={wait:()=>Jr,pending:()=>{Jr=new Promise(e=>wn=e)},resolve:()=>{wn==null||wn(),Jr=null,wn=null}},ql=()=>Ph,Kl=Symbol("sidebarItems"),qo=()=>{const e=Oe(Kl);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},Oh=()=>{const e=je(),t=vt(),n=j(()=>Ah(t.value,e.value));Wt(Kl,n)},Ah=(e,t)=>{const n=e.sidebar??t.sidebar??"auto",r=e.sidebarDepth??t.sidebarDepth??2;return e.home||n===!1?[]:n==="auto"?Rh(r):J(n)?Yl(n,r):No(n)?Ih(n,r):[]},kh=(e,t)=>({text:e.title,link:e.link,children:Ko(e.children,t)}),Ko=(e,t)=>t>0?e.map(n=>kh(n,t-1)):[],Rh=e=>{const t=Kt();return[{text:t.value.title,children:Ko(t.value.headers,e)}]},Yl=(e,t)=>{const n=Jt(),r=Kt(),o=s=>{var l;let i;if(pe(s)?i=Wo(s):i=s,i.children)return{...i,children:i.children.map(a=>o(a))};if(i.link===n.path){const a=((l=r.value.headers[0])==null?void 0:l.level)===1?r.value.headers[0].children:r.value.headers;return{...i,children:Ko(a,t)}}return i};return e.map(s=>o(s))},Ih=(e,t)=>{const n=Jt(),r=ml(e,n.path),o=e[r]??[];return Yl(o,t)},$h="719px",Mh={mobile:$h};var Hn;(function(e){e.MOBILE="mobile"})(Hn||(Hn={}));var mi;const Nh={[Hn.MOBILE]:Number.parseInt((mi=Mh.mobile)==null?void 0:mi.replace("px",""),10)},Gl=(e,t)=>{const n=Nh[e];Number.isInteger(n)&&Xe(()=>{t(n),window.addEventListener("resize",()=>t(n),!1),window.addEventListener("orientationchange",()=>t(n),!1)})},Dh={},Hh={class:"theme-default-content"};function Fh(e,t){const n=bt("Content");return F(),Q("div",Hh,[ee(n)])}const Bh=xe(Dh,[["render",Fh],["__file","HomeContent.vue"]]),zh={key:0,class:"features"},jh=he({__name:"HomeFeatures",setup(e){const t=vt(),n=j(()=>J(t.value.features)?t.value.features:[]);return(r,o)=>n.value.length?(F(),Q("div",zh,[(F(!0),Q(ye,null,It(n.value,s=>(F(),Q("div",{key:s.title,class:"feature"},[fe("h2",null,Re(s.title),1),fe("p",null,Re(s.details),1)]))),128))])):Le("v-if",!0)}}),Uh=xe(jh,[["__file","HomeFeatures.vue"]]),Vh=["innerHTML"],Wh=["textContent"],qh=he({__name:"HomeFooter",setup(e){const t=vt(),n=j(()=>t.value.footer),r=j(()=>t.value.footerHtml);return(o,s)=>n.value?(F(),Q(ye,{key:0},[Le(" eslint-disable-next-line vue/no-v-html "),r.value?(F(),Q("div",{key:0,class:"footer",innerHTML:n.value},null,8,Vh)):(F(),Q("div",{key:1,class:"footer",textContent:Re(n.value)},null,8,Wh))],64)):Le("v-if",!0)}}),Kh=xe(qh,[["__file","HomeFooter.vue"]]),Yh=["href","rel","target","aria-label"],Gh=he({inheritAttrs:!1}),Jh=he({...Gh,__name:"AutoLink",props:{item:{type:Object,required:!0}},setup(e){const t=e,n=Jt(),r=wl(),{item:o}=Oo(t),s=j(()=>Wn(o.value.link)),i=j(()=>Bu(o.value.link)||zu(o.value.link)),l=j(()=>{if(!i.value){if(o.value.target)return o.value.target;if(s.value)return"_blank"}}),a=j(()=>l.value==="_blank"),c=j(()=>!s.value&&!i.value&&!a.value),u=j(()=>{if(!i.value){if(o.value.rel)return o.value.rel;if(a.value)return"noopener noreferrer"}}),f=j(()=>o.value.ariaLabel||o.value.text),h=j(()=>{const w=Object.keys(r.value.locales);return w.length?!w.some(L=>L===o.value.link):o.value.link!=="/"}),v=j(()=>h.value?n.path.startsWith(o.value.link):!1),y=j(()=>c.value?o.value.activeMatch?new RegExp(o.value.activeMatch).test(n.path):v.value:!1);return(w,L)=>{const g=bt("RouterLink"),b=bt("AutoLinkExternalIcon");return c.value?(F(),Pe(g,ao({key:0,class:{"router-link-active":y.value},to:Z(o).link,"aria-label":f.value},w.$attrs),{default:Ne(()=>[be(w.$slots,"before"),Mt(" "+Re(Z(o).text)+" ",1),be(w.$slots,"after")]),_:3},16,["class","to","aria-label"])):(F(),Q("a",ao({key:1,class:"external-link",href:Z(o).link,rel:u.value,target:l.value,"aria-label":f.value},w.$attrs),[be(w.$slots,"before"),Mt(" "+Re(Z(o).text)+" ",1),a.value?(F(),Pe(b,{key:0})):Le("v-if",!0),be(w.$slots,"after")],16,Yh))}}}),gt=xe(Jh,[["__file","AutoLink.vue"]]),Qh={class:"hero"},Zh={key:0,id:"main-title"},Xh={key:1,class:"description"},ep={key:2,class:"actions"},tp=he({__name:"HomeHero",setup(e){const t=vt(),n=Ho(),r=Vo(),o=j(()=>r.value&&t.value.heroImageDark!==void 0?t.value.heroImageDark:t.value.heroImage),s=j(()=>t.value.heroAlt||l.value||"hero"),i=j(()=>t.value.heroHeight||280),l=j(()=>t.value.heroText===null?null:t.value.heroText||n.value.title||"Hello"),a=j(()=>t.value.tagline===null?null:t.value.tagline||n.value.description||"Welcome to your VuePress site"),c=j(()=>J(t.value.actions)?t.value.actions.map(({text:f,link:h,type:v="primary"})=>({text:f,link:h,type:v})):[]),u=()=>{if(!o.value)return null;const f=ge("img",{src:Bo(o.value),alt:s.value,height:i.value});return t.value.heroImageDark===void 0?f:ge(Fo,()=>f)};return(f,h)=>(F(),Q("header",Qh,[ee(u),l.value?(F(),Q("h1",Zh,Re(l.value),1)):Le("v-if",!0),a.value?(F(),Q("p",Xh,Re(a.value),1)):Le("v-if",!0),c.value.length?(F(),Q("p",ep,[(F(!0),Q(ye,null,It(c.value,v=>(F(),Pe(gt,{key:v.text,class:We(["action-button",[v.type]]),item:v},null,8,["class","item"]))),128))])):Le("v-if",!0)]))}}),np=xe(tp,[["__file","HomeHero.vue"]]),rp={class:"home"},op=he({__name:"Home",setup(e){return(t,n)=>(F(),Q("main",rp,[ee(np),ee(Uh),ee(Bh),ee(Kh)]))}}),sp=xe(op,[["__file","Home.vue"]]),ip=he({__name:"NavbarBrand",setup(e){const t=Ir(),n=Ho(),r=je(),o=Vo(),s=j(()=>r.value.home||t.value),i=j(()=>n.value.title),l=j(()=>o.value&&r.value.logoDark!==void 0?r.value.logoDark:r.value.logo),a=()=>{if(!l.value)return null;const c=ge("img",{class:"logo",src:Bo(l.value),alt:i.value});return r.value.logoDark===void 0?c:ge(Fo,()=>c)};return(c,u)=>{const f=bt("RouterLink");return F(),Pe(f,{to:s.value},{default:Ne(()=>[ee(a),i.value?(F(),Q("span",{key:0,class:We(["site-name",{"can-hide":l.value}])},Re(i.value),3)):Le("v-if",!0)]),_:1},8,["to"])}}}),lp=xe(ip,[["__file","NavbarBrand.vue"]]),ap=he({__name:"DropdownTransition",setup(e){const t=r=>{r.style.height=r.scrollHeight+"px"},n=r=>{r.style.height=""};return(r,o)=>(F(),Pe(Vn,{name:"dropdown",onEnter:t,onAfterEnter:n,onBeforeLeave:t},{default:Ne(()=>[be(r.$slots,"default")]),_:3}))}}),Jl=xe(ap,[["__file","DropdownTransition.vue"]]),cp=["aria-label"],up={class:"title"},fp=fe("span",{class:"arrow down"},null,-1),dp=["aria-label"],hp={class:"title"},pp={class:"navbar-dropdown"},mp={class:"navbar-dropdown-subtitle"},vp={key:1},gp={class:"navbar-dropdown-subitem-wrapper"},_p=he({__name:"NavbarDropdown",props:{item:{type:Object,required:!0}},setup(e){const t=e,{item:n}=Oo(t),r=j(()=>n.value.ariaLabel||n.value.text),o=Ee(!1),s=Jt();ut(()=>s.path,()=>{o.value=!1});const i=a=>{a.detail===0?o.value=!o.value:o.value=!1},l=(a,c)=>c[c.length-1]===a;return(a,c)=>(F(),Q("div",{class:We(["navbar-dropdown-wrapper",{open:o.value}])},[fe("button",{class:"navbar-dropdown-title",type:"button","aria-label":r.value,onClick:i},[fe("span",up,Re(Z(n).text),1),fp],8,cp),fe("button",{class:"navbar-dropdown-title-mobile",type:"button","aria-label":r.value,onClick:c[0]||(c[0]=u=>o.value=!o.value)},[fe("span",hp,Re(Z(n).text),1),fe("span",{class:We(["arrow",o.value?"down":"right"])},null,2)],8,dp),ee(Jl,null,{default:Ne(()=>[dr(fe("ul",pp,[(F(!0),Q(ye,null,It(Z(n).children,u=>(F(),Q("li",{key:u.text,class:"navbar-dropdown-item"},[u.children?(F(),Q(ye,{key:0},[fe("h4",mp,[u.link?(F(),Pe(gt,{key:0,item:u,onFocusout:f=>l(u,Z(n).children)&&u.children.length===0&&(o.value=!1)},null,8,["item","onFocusout"])):(F(),Q("span",vp,Re(u.text),1))]),fe("ul",gp,[(F(!0),Q(ye,null,It(u.children,f=>(F(),Q("li",{key:f.link,class:"navbar-dropdown-subitem"},[ee(gt,{item:f,onFocusout:h=>l(f,u.children)&&l(u,Z(n).children)&&(o.value=!1)},null,8,["item","onFocusout"])]))),128))])],64)):(F(),Pe(gt,{key:1,item:u,onFocusout:f=>l(u,Z(n).children)&&(o.value=!1)},null,8,["item","onFocusout"]))]))),128))],512),[[gr,o.value]])]),_:1})],2))}}),bp=xe(_p,[["__file","NavbarDropdown.vue"]]),hi=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),yp=(e,t)=>{if(t.hash===e)return!0;const n=hi(t.path),r=hi(e);return n===r},Ql=(e,t)=>e.link&&yp(e.link,t)?!0:e.children?e.children.some(n=>Ql(n,t)):!1,Zl=e=>!Wn(e)||/github\.com/.test(e)?"GitHub":/bitbucket\.org/.test(e)?"Bitbucket":/gitlab\.com/.test(e)?"GitLab":/gitee\.com/.test(e)?"Gitee":null,Ep={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},wp=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=Zl(e);return n!==null?Ep[n]:null},Cp=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:r,editLinkPattern:o})=>{if(!r)return null;const s=wp({docsRepo:e,editLinkPattern:o});return s?s.replace(/:repo/,Wn(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,pl(`${hl(n)}/${r}`)):null},xp={key:0,class:"navbar-items"},Tp=he({__name:"NavbarItems",setup(e){const t=()=>{const u=gn(),f=Ir(),h=wl(),v=Ho(),y=Th(),w=je();return j(()=>{const L=Object.keys(h.value.locales);if(L.length<2)return[];const g=u.currentRoute.value.path,b=u.currentRoute.value.fullPath;return[{text:`${w.value.selectLanguageText}`,ariaLabel:`${w.value.selectLanguageAriaLabel??w.value.selectLanguageText}`,children:L.map(O=>{var D,K;const W=((D=h.value.locales)==null?void 0:D[O])??{},X=((K=y.value.locales)==null?void 0:K[O])??{},N=`${W.lang}`,m=X.selectLanguageName??N;let z;if(N===v.value.lang)z=b;else{const T=g.replace(f.value,O);u.getRoutes().some(R=>R.path===T)?z=b.replace(g,T):z=X.home??O}return{text:m,link:z}})}]})},n=()=>{const u=je(),f=j(()=>u.value.repo),h=j(()=>f.value?Zl(f.value):null),v=j(()=>f.value&&!Wn(f.value)?`https://github.com/${f.value}`:f.value),y=j(()=>v.value?u.value.repoLabel?u.value.repoLabel:h.value===null?"Source":h.value:null);return j(()=>!v.value||!y.value?[]:[{text:y.value,link:v.value}])},r=u=>pe(u)?Wo(u):u.children?{...u,children:u.children.map(r)}:u,o=()=>{const u=je();return j(()=>(u.value.navbar||[]).map(r))},s=Ee(!1),i=o(),l=t(),a=n(),c=j(()=>[...i.value,...l.value,...a.value]);return Gl(Hn.MOBILE,u=>{window.innerWidthc.value.length?(F(),Q("nav",xp,[(F(!0),Q(ye,null,It(c.value,h=>(F(),Q("div",{key:h.text,class:"navbar-item"},[h.children?(F(),Pe(bp,{key:0,item:h,class:We(s.value?"mobile":"")},null,8,["item","class"])):(F(),Pe(gt,{key:1,item:h},null,8,["item"]))]))),128))])):Le("v-if",!0)}}),Xl=xe(Tp,[["__file","NavbarItems.vue"]]),Lp=["title"],Sp={class:"icon",focusable:"false",viewBox:"0 0 32 32"},Pp=Gc('',9),Op=[Pp],Ap={class:"icon",focusable:"false",viewBox:"0 0 32 32"},kp=fe("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1),Rp=[kp],Ip=he({__name:"ToggleColorModeButton",setup(e){const t=je(),n=Vo(),r=()=>{n.value=!n.value};return(o,s)=>(F(),Q("button",{class:"toggle-color-mode-button",title:Z(t).toggleColorMode,onClick:r},[dr((F(),Q("svg",Sp,Op,512)),[[gr,!Z(n)]]),dr((F(),Q("svg",Ap,Rp,512)),[[gr,Z(n)]])],8,Lp))}}),$p=xe(Ip,[["__file","ToggleColorModeButton.vue"]]),Mp=["title"],Np=fe("div",{class:"icon","aria-hidden":"true"},[fe("span"),fe("span"),fe("span")],-1),Dp=[Np],Hp=he({__name:"ToggleSidebarButton",emits:["toggle"],setup(e){const t=je();return(n,r)=>(F(),Q("div",{class:"toggle-sidebar-button",title:Z(t).toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:r[0]||(r[0]=o=>n.$emit("toggle"))},Dp,8,Mp))}}),Fp=xe(Hp,[["__file","ToggleSidebarButton.vue"]]),Bp=he({__name:"Navbar",emits:["toggle-sidebar"],setup(e){const t=je(),n=Ee(null),r=Ee(null),o=Ee(0),s=j(()=>o.value?{maxWidth:o.value+"px"}:{});Gl(Hn.MOBILE,l=>{var c;const a=i(n.value,"paddingLeft")+i(n.value,"paddingRight");window.innerWidth{const c=bt("NavbarSearch");return F(),Q("header",{ref_key:"navbar",ref:n,class:"navbar"},[ee(Fp,{onToggle:a[0]||(a[0]=u=>l.$emit("toggle-sidebar"))}),fe("span",{ref_key:"navbarBrand",ref:r},[ee(lp)],512),fe("div",{class:"navbar-items-wrapper",style:Bn(s.value)},[be(l.$slots,"before"),ee(Xl,{class:"can-hide"}),be(l.$slots,"after"),Z(t).colorModeSwitch?(F(),Pe($p,{key:0})):Le("v-if",!0),ee(c)],4)],512)}}}),zp=xe(Bp,[["__file","Navbar.vue"]]),jp={class:"page-meta"},Up={key:0,class:"meta-item edit-link"},Vp={key:1,class:"meta-item last-updated"},Wp={class:"meta-item-label"},qp={class:"meta-item-info"},Kp={key:2,class:"meta-item contributors"},Yp={class:"meta-item-label"},Gp={class:"meta-item-info"},Jp=["title"],Qp=he({__name:"PageMeta",setup(e){const t=()=>{const a=je(),c=Kt(),u=vt();return j(()=>{if(!(u.value.editLink??a.value.editLink??!0))return null;const{repo:h,docsRepo:v=h,docsBranch:y="main",docsDir:w="",editLinkText:L}=a.value;if(!v)return null;const g=Cp({docsRepo:v,docsBranch:y,docsDir:w,filePathRelative:c.value.filePathRelative,editLinkPattern:u.value.editLinkPattern??a.value.editLinkPattern});return g?{text:L??"Edit this page",link:g}:null})},n=()=>{const a=je(),c=Kt(),u=vt();return j(()=>{var v,y;return!(u.value.lastUpdated??a.value.lastUpdated??!0)||!((v=c.value.git)!=null&&v.updatedTime)?null:new Date((y=c.value.git)==null?void 0:y.updatedTime).toLocaleString()})},r=()=>{const a=je(),c=Kt(),u=vt();return j(()=>{var h;return u.value.contributors??a.value.contributors??!0?((h=c.value.git)==null?void 0:h.contributors)??null:null})},o=je(),s=t(),i=n(),l=r();return(a,c)=>{const u=bt("ClientOnly");return F(),Q("footer",jp,[Z(s)?(F(),Q("div",Up,[ee(gt,{class:"meta-item-label",item:Z(s)},null,8,["item"])])):Le("v-if",!0),Z(i)?(F(),Q("div",Vp,[fe("span",Wp,Re(Z(o).lastUpdatedText)+": ",1),ee(u,null,{default:Ne(()=>[fe("span",qp,Re(Z(i)),1)]),_:1})])):Le("v-if",!0),Z(l)&&Z(l).length?(F(),Q("div",Kp,[fe("span",Yp,Re(Z(o).contributorsText)+": ",1),fe("span",Gp,[(F(!0),Q(ye,null,It(Z(l),(f,h)=>(F(),Q(ye,{key:h},[fe("span",{class:"contributor",title:`email: ${f.email}`},Re(f.name),9,Jp),h!==Z(l).length-1?(F(),Q(ye,{key:0},[Mt(", ")],64)):Le("v-if",!0)],64))),128))])])):Le("v-if",!0)])}}}),Zp=xe(Qp,[["__file","PageMeta.vue"]]),Xp={key:0,class:"page-nav"},em={class:"inner"},tm={key:0,class:"prev"},nm={key:1,class:"next"},rm=he({__name:"PageNav",setup(e){const t=a=>a===!1?null:pe(a)?Wo(a):No(a)?a:!1,n=(a,c,u)=>{const f=a.findIndex(h=>h.link===c);if(f!==-1){const h=a[f+u];return h!=null&&h.link?h:null}for(const h of a)if(h.children){const v=n(h.children,c,u);if(v)return v}return null},r=vt(),o=qo(),s=Jt(),i=j(()=>{const a=t(r.value.prev);return a!==!1?a:n(o.value,s.path,-1)}),l=j(()=>{const a=t(r.value.next);return a!==!1?a:n(o.value,s.path,1)});return(a,c)=>i.value||l.value?(F(),Q("nav",Xp,[fe("p",em,[i.value?(F(),Q("span",tm,[ee(gt,{item:i.value},null,8,["item"])])):Le("v-if",!0),l.value?(F(),Q("span",nm,[ee(gt,{item:l.value},null,8,["item"])])):Le("v-if",!0)])])):Le("v-if",!0)}}),om=xe(rm,[["__file","PageNav.vue"]]),sm={class:"page"},im={class:"theme-default-content"},lm=he({__name:"Page",setup(e){return(t,n)=>{const r=bt("Content");return F(),Q("main",sm,[be(t.$slots,"top"),fe("div",im,[be(t.$slots,"content-top"),ee(r),be(t.$slots,"content-bottom")]),ee(Zp),ee(om),be(t.$slots,"bottom")])}}}),am=xe(lm,[["__file","Page.vue"]]),cm=["onKeydown"],um={class:"sidebar-item-children"},fm=he({__name:"SidebarItem",props:{item:{type:Object,required:!0},depth:{type:Number,required:!1,default:0}},setup(e){const t=e,{item:n,depth:r}=Oo(t),o=Jt(),s=gn(),i=j(()=>Ql(n.value,o)),l=j(()=>({"sidebar-item":!0,"sidebar-heading":r.value===0,active:i.value,collapsible:n.value.collapsible})),a=j(()=>n.value.collapsible?i.value:!0),[c,u]=Xd(a.value),f=v=>{n.value.collapsible&&(v.preventDefault(),u())},h=s.afterEach(v=>{Tr(()=>{c.value=a.value})});return Or(()=>{h()}),(v,y)=>{var L;const w=bt("SidebarItem",!0);return F(),Q("li",null,[Z(n).link?(F(),Pe(gt,{key:0,class:We(l.value),item:Z(n)},null,8,["class","item"])):(F(),Q("p",{key:1,tabindex:"0",class:We(l.value),onClick:f,onKeydown:ku(f,["enter"])},[Mt(Re(Z(n).text)+" ",1),Z(n).collapsible?(F(),Q("span",{key:0,class:We(["arrow",Z(c)?"down":"right"])},null,2)):Le("v-if",!0)],42,cm)),(L=Z(n).children)!=null&&L.length?(F(),Pe(Jl,{key:2},{default:Ne(()=>[dr(fe("ul",um,[(F(!0),Q(ye,null,It(Z(n).children,g=>(F(),Pe(w,{key:`${Z(r)}${g.text}${g.link}`,item:g,depth:Z(r)+1},null,8,["item","depth"]))),128))],512),[[gr,Z(c)]])]),_:1})):Le("v-if",!0)])}}}),dm=xe(fm,[["__file","SidebarItem.vue"]]),hm={key:0,class:"sidebar-items"},pm=he({__name:"SidebarItems",setup(e){const t=Jt(),n=qo();return Xe(()=>{ut(()=>t.hash,r=>{const o=document.querySelector(".sidebar");if(!o)return;const s=document.querySelector(`.sidebar a.sidebar-item[href="${t.path}${r}"]`);if(!s)return;const{top:i,height:l}=o.getBoundingClientRect(),{top:a,height:c}=s.getBoundingClientRect();ai+l&&s.scrollIntoView(!1)})}),(r,o)=>Z(n).length?(F(),Q("ul",hm,[(F(!0),Q(ye,null,It(Z(n),s=>(F(),Pe(dm,{key:`${s.text}${s.link}`,item:s},null,8,["item"]))),128))])):Le("v-if",!0)}}),mm=xe(pm,[["__file","SidebarItems.vue"]]),vm={class:"sidebar"},gm=he({__name:"Sidebar",setup(e){return(t,n)=>(F(),Q("aside",vm,[ee(Xl),be(t.$slots,"top"),ee(mm),be(t.$slots,"bottom")]))}}),_m=xe(gm,[["__file","Sidebar.vue"]]),bm=he({__name:"Layout",setup(e){const t=Kt(),n=vt(),r=je(),o=j(()=>n.value.navbar!==!1&&r.value.navbar!==!1),s=qo(),i=Ee(!1),l=L=>{i.value=typeof L=="boolean"?L:!i.value},a={x:0,y:0},c=L=>{a.x=L.changedTouches[0].clientX,a.y=L.changedTouches[0].clientY},u=L=>{const g=L.changedTouches[0].clientX-a.x,b=L.changedTouches[0].clientY-a.y;Math.abs(g)>Math.abs(b)&&Math.abs(g)>40&&(g>0&&a.x<=80?l(!0):l(!1))},f=j(()=>[{"no-navbar":!o.value,"no-sidebar":!s.value.length,"sidebar-open":i.value},n.value.pageClass]);let h;Xe(()=>{h=gn().afterEach(()=>{l(!1)})}),Ar(()=>{h()});const v=ql(),y=v.resolve,w=v.pending;return(L,g)=>(F(),Q("div",{class:We(["theme-container",f.value]),onTouchstart:c,onTouchend:u},[be(L.$slots,"navbar",{},()=>[o.value?(F(),Pe(zp,{key:0,onToggleSidebar:l},{before:Ne(()=>[be(L.$slots,"navbar-before")]),after:Ne(()=>[be(L.$slots,"navbar-after")]),_:3})):Le("v-if",!0)]),fe("div",{class:"sidebar-mask",onClick:g[0]||(g[0]=b=>l(!1))}),be(L.$slots,"sidebar",{},()=>[ee(_m,null,{top:Ne(()=>[be(L.$slots,"sidebar-top")]),bottom:Ne(()=>[be(L.$slots,"sidebar-bottom")]),_:3})]),be(L.$slots,"page",{},()=>[Z(n).home?(F(),Pe(sp,{key:0})):(F(),Pe(Vn,{key:1,name:"fade-slide-y",mode:"out-in",onBeforeEnter:Z(y),onBeforeLeave:Z(w)},{default:Ne(()=>[(F(),Pe(am,{key:Z(t).path},{top:Ne(()=>[be(L.$slots,"page-top")]),"content-top":Ne(()=>[be(L.$slots,"page-content-top")]),"content-bottom":Ne(()=>[be(L.$slots,"page-content-bottom")]),bottom:Ne(()=>[be(L.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"]))])],34))}}),ym=xe(bm,[["__file","Layout.vue"]]),Em={class:"theme-container"},wm={class:"page"},Cm={class:"theme-default-content"},xm=fe("h1",null,"404",-1),Tm=he({__name:"NotFound",setup(e){const t=Ir(),n=je(),r=n.value.notFound??["Not Found"],o=()=>r[Math.floor(Math.random()*r.length)],s=n.value.home??t.value,i=n.value.backToHome??"Back to home";return(l,a)=>{const c=bt("RouterLink");return F(),Q("div",Em,[fe("main",wm,[fe("div",Cm,[xm,fe("blockquote",null,Re(o()),1),ee(c,{to:Z(s)},{default:Ne(()=>[Mt(Re(Z(i)),1)]),_:1},8,["to"])])])])}}}),Lm=xe(Tm,[["__file","NotFound.vue"]]);const Sm=Gt({enhance({app:e,router:t}){e.component("Badge",Nd),e.component("CodeGroup",Dd),e.component("CodeGroupItem",zd),e.component("AutoLinkExternalIcon",()=>{const r=e.component("ExternalLinkIcon");return r?ge(r):null}),e.component("NavbarSearch",()=>{const r=e.component("Docsearch")||e.component("SearchBox");return r?ge(r):null});const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await ql().wait(),n(...r))},setup(){Lh(),Oh()},layouts:{Layout:ym,NotFound:Lm}}),or=[id,cd,hd,Td,Od,$d,Sm],Pm=[["v-8daa1a0e","/",{title:"Coho.UI Documentation"},["/index.md"]],["v-50520335","/getstarted.html",{title:"Getting started with Coho.UI"},[":md"]],["v-58f396b0","/controls/announcer.html",{title:"Announcer control"},[":md"]],["v-743236a8","/controls/acryliccontextmenu.html",{title:"The AcrylicContextMenu control"},[":md"]],["v-82811736","/controls/menubar.html",{title:"MenuBar control"},[":md"]],["v-6d080da6","/controls/RibbonExtraButton.html",{title:"RibbonExtraButton control"},[":md"]],["v-0927a752","/controls/FolderPickerTextbox.html",{title:"FolderPickerTextbox Control"},[":md"]],["v-3dfe4e80","/controls/GenericPickerTextbox.html",{title:""},[":md"]],["v-2a0d90d9","/controls/MasterAccentSplitButton.html",{title:"MasterAccentSplitButton Control"},[":md"]],["v-d3e07ca4","/controls/SettingsTabControl.html",{title:"SettingsTabControl Control"},[":md"]],["v-62097648","/controls/ribbonbar.html",{title:"RibbonBar control"},[":md"]],["v-dff51306","/dialogs/ThemedMessageBox.html",{title:"ThemedMessageBox dialog"},[":md"]],["v-6d901540","/dialogs/ThemedInputBox.html",{title:"ThemedInputBox dialog"},[":md"]],["v-64a25d33","/dialogs/ThemedOpenFileDialog.html",{title:"ThemedOpenFileDialog dialog"},[":md"]],["v-f832d4c0","/dialogs/ThemedSaveFileDialog.html",{title:"ThemedSaveFileDialog dialog"},[":md"]],["v-6119cdde","/windows/ApplicationWindow.html",{title:"ApplicationWindow"},[":md"]],["v-4fc0787a","/windows/SecondaryWindow.html",{title:"SecondaryWindow"},[":md"]],["v-6799920a","/windows/TabbedApplicationWindow.html",{title:"TabbedApplicationWindow"},[":md"]],["v-74c0b233","/howto/omnibar-search-provider.html",{title:"Build custom search provider for the Omnibar"},[":md"]],["v-a77c2404","/howto/localize-strings.html",{title:"Localize default strings"},[":md"]],["v-dca8df42","/classes/ThemedSpecialDialogOptions.html",{title:"ThemedSpecialDialogOptions class"},[":md"]],["v-3706649a","/404.html",{title:""},[]]];var pi=he({name:"Vuepress",setup(){const e=Ku();return()=>ge(e.value)}}),Om=()=>Pm.reduce((e,[t,n,r,o])=>(e.push({name:t,path:n,component:pi,meta:r},{path:n.endsWith("/")?n+"index.html":n.substring(0,n.length-5),redirect:n},...o.map(s=>({path:s===":md"?n.substring(0,n.length-5)+".md":s,redirect:n}))),e),[{name:"404",path:"/:catchAll(.*)",component:pi}]),Am=vf,km=()=>{const e=Xf({history:Am(hl("/Coho.UI/")),routes:Om(),scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{var r;(t.path!==n.path||n===pt)&&([Pt.value]=await Promise.all([ht.resolvePageData(t.name),(r=vl[t.name])==null?void 0:r.__asyncLoader()]))}),e},Rm=e=>{e.component("ClientOnly",Fo),e.component("Content",Qu)},Im=(e,t,n)=>{const r=j(()=>ht.resolveLayouts(n)),o=si(()=>t.currentRoute.value.path),s=si(()=>ht.resolveRouteLocale(tn.value.locales,o.value)),i=j(()=>ht.resolveSiteLocaleData(tn.value,s.value)),l=j(()=>ht.resolvePageFrontmatter(Pt.value)),a=j(()=>ht.resolvePageHeadTitle(Pt.value,i.value)),c=j(()=>ht.resolvePageHead(a.value,l.value,i.value)),u=j(()=>ht.resolvePageLang(Pt.value,i.value)),f=j(()=>ht.resolvePageLayout(Pt.value,r.value));return e.provide(ju,r),e.provide(_l,l),e.provide(Wu,a),e.provide(bl,c),e.provide(yl,u),e.provide(El,f),e.provide(Do,s),e.provide(Cl,i),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>l.value},$head:{get:()=>c.value},$headTitle:{get:()=>a.value},$lang:{get:()=>u.value},$page:{get:()=>Pt.value},$routeLocale:{get:()=>s.value},$site:{get:()=>tn.value},$siteLocale:{get:()=>i.value},$withBase:{get:()=>Bo}}),{layouts:r,pageData:Pt,pageFrontmatter:l,pageHead:c,pageHeadTitle:a,pageLang:u,pageLayout:f,routeLocale:s,siteData:tn,siteLocaleData:i}},$m=()=>{const e=Vu(),t=qu(),n=Ee([]),r=()=>{e.value.forEach(s=>{const i=Mm(s);i&&n.value.push(i)})},o=()=>{document.documentElement.lang=t.value,n.value.forEach(s=>{s.parentNode===document.head&&document.head.removeChild(s)}),n.value.splice(0,n.value.length),e.value.forEach(s=>{const i=Nm(s);i!==null&&(document.head.appendChild(i),n.value.push(i))})};Wt(Yu,o),Xe(()=>{r(),o(),ut(()=>e.value,o)})},Mm=([e,t,n=""])=>{const r=Object.entries(t).map(([l,a])=>pe(a)?`[${l}=${JSON.stringify(a)}]`:a===!0?`[${l}]`:"").join(""),o=`head > ${e}${r}`;return Array.from(document.querySelectorAll(o)).find(l=>l.innerText===n)||null},Nm=([e,t,n])=>{if(!pe(e))return null;const r=document.createElement(e);return No(t)&&Object.entries(t).forEach(([o,s])=>{pe(s)?r.setAttribute(o,s):s===!0&&r.setAttribute(o,"")}),pe(n)&&r.appendChild(document.createTextNode(n)),r},Dm=$u,Hm=async()=>{var n;const e=Dm({name:"VuepressApp",setup(){var r;$m();for(const o of or)(r=o.setup)==null||r.call(o);return()=>[ge(Ml),...or.flatMap(({rootComponents:o=[]})=>o.map(s=>ge(s)))]}}),t=km();Rm(e),Im(e,t,or);for(const r of or)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:tn}));return e.use(t),{app:e,router:t}};Hm().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{xe as _,fe as a,Mt as b,Q as c,Hm as createVueApp,ee as d,Gc as e,F as o,bt as r,Ne as w}; diff --git a/docs/assets/contextmenu-59f27041.png b/docs/assets/contextmenu-59f27041.png new file mode 100644 index 0000000..3712143 Binary files /dev/null and b/docs/assets/contextmenu-59f27041.png differ diff --git a/docs/assets/getstarted.html-89bddd8d.js b/docs/assets/getstarted.html-89bddd8d.js new file mode 100644 index 0000000..bd8ca2d --- /dev/null +++ b/docs/assets/getstarted.html-89bddd8d.js @@ -0,0 +1,33 @@ +import{_ as s,r as o,o as a,c as i,a as e,b as n,d as l,e as r}from"./app-47cf4121.js";const c={},u=e("h1",{id:"getting-started-with-coho-ui",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#getting-started-with-coho-ui","aria-hidden":"true"},"#"),n(" Getting started with Coho.UI")],-1),d={href:"https://www.nuget.org/packages/Coho.UI/",target:"_blank",rel:"noopener noreferrer"},p=r(`

Define your theme

Have a look at the sample application, the file App.xaml contains all the required resources to make it work nicely. Just change the brushes to make it yours.

You must define the Font Family and Font size to use.

  • FontFamily AppFont: Defines the font to use in the UI.
  • system:Double AppFontSize: Defines the font size to use in the UI.

Example:

<FontFamily x:Key="AppFont">Segoe UI Variable Display,Segoe UI</FontFamily>
+<system:Double x:Key="AppFontSize">14</system:Double>
+

You must define your color theme using specified resource names.

  • Color ChromeBorderActiveColor: Defines the color of the window border when it is active.
  • Brush AccentColor: Defines the accent color to be used on various UI elements.
  • Brush AccentColorDark: Defines the darker accent color to be used on various UI elements (used for hover state for example).
  • Brush AccentColorDarker: Defines the even darker accent color to be used on various UI elements (used for pressed state for example).
  • Brush IconsAccentColor: Defines the color to be used in Coho.UI bundled isons.
  • Brush AccentButtonBorderColor: Defines the brush to be used for border on buttons that use the PrimaryButton style.

Example:

<Color x:Key="ChromeBorderActiveColor">#038387</Color>
+<LinearGradientBrush x:Key="AccentButtonBorderColor" StartPoint="0,0.9" EndPoint="0,1">
+   <GradientStop Color="#038387" Offset="0" />
+   <GradientStop Color="#026163" Offset="1" />
+</LinearGradientBrush>
+
+<SolidColorBrush x:Key="AccentColor" Color="#038387" />
+<SolidColorBrush x:Key="TitleBarAccentedColor" Color="#038387" />
+<SolidColorBrush x:Key="IconsAccentColor" Color="#038387" />
+<SolidColorBrush x:Key="AccentColorDark" Color="#026163" />
+<SolidColorBrush x:Key="AccentColorDarker" Color="#024D4F" />
+

Configure the UIController (NEW in V2)

public MainWindow()
+{
+    InitializeComponent();
+
+    // Example: Register a custom resource file to be used only in Dark mode
+    // For example, your own implementation of Dark Theme
+    UIController.RegisterThemedMergedResourceName("/DarkTheme.xaml", ThemeScheme.Dark);
+    
+    // Example: Register a custom resource file to be used only in Light mode
+    // For example, your own implementation of Light Theme
+    UIController.RegisterThemedMergedResourceName("/LightTheme.xaml", ThemeScheme.Light);
+    
+    // Example: Register a custom resource file to be loaded in ANY mode (null in argument 2)
+    // The resource will be reloaded when the user switches the theme to ensure dynamic resources are correct
+    UIController.RegisterThemedMergedResourceName("/Styles/Icons.xaml", null);
+
+    // This line is important, we want the app to start with Ligth theme
+    UIController.Init(ThemeScheme.Light);
+}
+
`,12);function m(h,v){const t=o("ExternalLinkIcon");return a(),i("div",null,[u,e("p",null,[e("a",d,[n("https://www.nuget.org/packages/Coho.UI/"),l(t)])]),p])}const k=s(c,[["render",m],["__file","getstarted.html.vue"]]);export{k as default}; diff --git a/docs/assets/index.html-ce787a85.js b/docs/assets/index.html-ce787a85.js new file mode 100644 index 0000000..2ba4242 --- /dev/null +++ b/docs/assets/index.html-ce787a85.js @@ -0,0 +1 @@ +import{_ as t,r as n,o as r,c,a as e,b as o,d as s,e as i}from"./app-47cf4121.js";const d={},h=e("h1",{id:"coho-ui-documentation",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#coho-ui-documentation","aria-hidden":"true"},"#"),o(" Coho.UI Documentation")],-1),u={href:"https://www.nuget.org/packages/Coho.UI/",target:"_blank",rel:"noopener noreferrer"},l=i('

Introduction to V2

The V2 contains a lot of new things, but also breaking changes. Please read this page before you update your projects.

Breaking changes

  • The Icon property of MenuItem is now supposed to be a Brush object.
',4);function p(_,g){const a=n("ExternalLinkIcon");return r(),c("div",null,[h,e("p",null,[e("a",u,[o("https://www.nuget.org/packages/Coho.UI/"),s(a)])]),l])}const b=t(d,[["render",p],["__file","index.html.vue"]]);export{b as default}; diff --git a/docs/assets/inputbox-46f6e584.png b/docs/assets/inputbox-46f6e584.png new file mode 100644 index 0000000..20edb68 Binary files /dev/null and b/docs/assets/inputbox-46f6e584.png differ diff --git a/docs/assets/localize-strings.html-d9e0fe50.js b/docs/assets/localize-strings.html-d9e0fe50.js new file mode 100644 index 0000000..f72ae0e --- /dev/null +++ b/docs/assets/localize-strings.html-d9e0fe50.js @@ -0,0 +1 @@ +const t=JSON.parse('{"key":"v-a77c2404","path":"/howto/localize-strings.html","title":"Localize default strings","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Table of default strings","slug":"table-of-default-strings","link":"#table-of-default-strings","children":[]},{"level":2,"title":"Customize strings","slug":"customize-strings","link":"#customize-strings","children":[]}],"git":{},"filePathRelative":"howto/localize-strings.md"}');export{t as data}; diff --git a/docs/assets/localize-strings.html-f8fe7344.js b/docs/assets/localize-strings.html-f8fe7344.js new file mode 100644 index 0000000..167764d --- /dev/null +++ b/docs/assets/localize-strings.html-f8fe7344.js @@ -0,0 +1,10 @@ +import{_ as o,r as a,o as u,c as d,a as e,b as n,d as l,w as s,e as i}from"./app-47cf4121.js";const c={},r=e("h1",{id:"localize-default-strings",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#localize-default-strings","aria-hidden":"true"},"#"),n(" Localize default strings")],-1),p=e("p",null,"Coho.UI comes with default texts in English. You can however customize them to improve your UX.",-1),h=e("h2",{id:"table-of-default-strings",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#table-of-default-strings","aria-hidden":"true"},"#"),n(" Table of default strings")],-1),m=e("thead",null,[e("tr",null,[e("th",null,"Class name"),e("th",null,"Property name"),e("th",null,"Default value"),e("th",null,"Description")])],-1),_=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.GenericText")]),e("td",null,[e("code",null,"Copy")]),e("td",null,"Copy"),e("td",null,'The text used to perform the "copy to clipboard" action')],-1),x=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.GenericText")]),e("td",null,[e("code",null,"Cut")]),e("td",null,"Cut"),e("td",null,'The text used to perform the "cut to clipboard" action')],-1),g=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.GenericText")]),e("td",null,[e("code",null,"Paste")]),e("td",null,"Paste"),e("td",null,'The text used to perform the "paste from clipboard" action')],-1),b=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.GenericText")]),e("td",null,[e("code",null,"SelectAll")]),e("td",null,"Select all"),e("td",null,'The text used to perform the "select all content" action')],-1),k=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.GenericText")]),e("td",null,[e("code",null,"Ok")]),e("td",null,"OK"),e("td",null,"The text used that is displayed in the Ok buttons in dialogs")],-1),T=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.GenericText")]),e("td",null,[e("code",null,"Yes")]),e("td",null,"Yes"),e("td",null,"The text used that is displayed in the Yes buttons in dialogs")],-1),f=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.GenericText")]),e("td",null,[e("code",null,"No")]),e("td",null,"No"),e("td",null,"The text used that is displayed in the No buttons in dialogs")],-1),v=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.GenericText")]),e("td",null,[e("code",null,"HelpGenericHint")]),e("td",null,"Press F1 to get help."),e("td",null,"The text used in the Omnibar results and in the ribbon/QAT buttons tooltips")],-1),C=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.GenericText")]),e("td",null,[e("code",null,"MoreOptions")]),e("td",null,"More options"),e("td",null,"The text used in various contexts when other options are available to the user")],-1),y=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.OmnibarTexts")]),e("td",null,[e("code",null,"NoResult")]),e("td",null,"No result found."),e("td",null,"The text used when the omnibar search did not return any result")],-1),I=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.OmnibarTexts")]),e("td",null,[e("code",null,"PlaceholderText")]),e("td",null,"Search or type a command"),e("td",null,"The text used as a placeholder when the focus is not set to the omnibar")],-1),O=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.OmnibarTexts")]),e("td",null,[e("code",null,"ResultsCommandsGroupName")]),e("td",null,"Commands"),e("td",null,"The text used to group results in the omnibar results popup")],-1),U=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.OmnibarTexts")]),e("td",null,[e("code",null,"ResultsOtherServices")]),e("td",null,"Other searches..."),e("td",null,"The text used to group results in the omnibar results popup")],-1),w=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.OmnibarTexts")]),e("td",null,[e("code",null,"ResultsInFiles")]),e("td",null,"Results found in files"),e("td",null,"The text used to group results in the omnibar results popup")],-1),G=e("tr",null,[e("td",null,[e("code",null,"Coho.UI.OmnibarTexts")]),e("td",null,[e("code",null,"SearchInFiles")]),e("td",null,"Search in files..."),e("td",null,'The text used to start the "Find in files" command')],-1),F=e("td",null,[e("code",null,"Coho.UI.DialogsText")],-1),z=e("td",null,[e("code",null,"Open")],-1),R=e("td",null,"Open",-1),D=e("td",null,[e("code",null,"Coho.UI.DialogsText")],-1),N=e("td",null,[e("code",null,"FileName")],-1),S=e("td",null,"File name",-1),Y=e("td",null,[e("code",null,"Coho.UI.DialogsText")],-1),L=e("td",null,[e("code",null,"FolderParentLevel")],-1),P=e("td",null,"Parent",-1),E=i(`

Customize strings

You can easily change the default values using your own strings.

This example shows how to change text using a static value:

private void OnLoaded(object sender, RoutedEventArgs e)
+{
+    Coho.UI.GenericText.Yes = "YES!";
+}
+

This example shows how to change text using your own localized strings:

private void OnLoaded(object sender, RoutedEventArgs e)
+{
+    // Localization.Resources is the class name of your RESX generated class
+    Coho.UI.GenericText.Yes = Localization.Resources.GenericYes;
+}
+
`,6);function A(V,B){const t=a("RouterLink");return u(),d("div",null,[r,p,h,e("table",null,[m,e("tbody",null,[_,x,g,b,k,T,f,v,C,y,I,O,U,w,G,e("tr",null,[F,z,R,e("td",null,[n("The text of the default button of the "),l(t,{to:"/dialogs/ThemedOpenFileDialog.html"},{default:s(()=>[n("ThemedOpenFileDialog")]),_:1})])]),e("tr",null,[D,N,S,e("td",null,[n("The text next to the file name textbox in the "),l(t,{to:"/dialogs/ThemedOpenFileDialog.html"},{default:s(()=>[n("ThemedOpenFileDialog")]),_:1})])]),e("tr",null,[Y,L,P,e("td",null,[n("The text of the browse top folder button in the "),l(t,{to:"/dialogs/ThemedOpenFileDialog.html"},{default:s(()=>[n("ThemedOpenFileDialog")]),_:1})])])])]),E])}const q=o(c,[["render",A],["__file","localize-strings.html.vue"]]);export{q as default}; diff --git a/docs/assets/menubar-c76215b8.png b/docs/assets/menubar-c76215b8.png new file mode 100644 index 0000000..3595446 Binary files /dev/null and b/docs/assets/menubar-c76215b8.png differ diff --git a/docs/assets/menubar.html-4d0f469a.js b/docs/assets/menubar.html-4d0f469a.js new file mode 100644 index 0000000..c68118f --- /dev/null +++ b/docs/assets/menubar.html-4d0f469a.js @@ -0,0 +1,15 @@ +import{_ as e,o as a,c as n,e as t}from"./app-47cf4121.js";const i="/Coho.UI/assets/menubar-c76215b8.png",r={},d=t('

MenuBar control

Namespace: Coho.UI.Controls.Menus

Properties

ExtraButtons

Type: List<UIElement>

QatCommands

Type: List<string>

ShowQAT

Type: Bool

ShowQATLabels

Type: Bool

EnableAnimations

Type: Bool

Methods

GetCommandIdentifier(MenuItem cmd)

Returns the identifier of the provided MenuItem. It is used to memorize the Quick Access Toolbar commands for example.

Arguments

  • MenuItem cmd: The menu item you want to get the unique identifier.
    Note: The MenuItem must have a Name property set to work properly.

Exceptions

  • NullReferenceException: Occurs when the provided cmd has no FrameworkElement.Name property.

Events

None.

Examples

<menus:MenuBar ShowQAT="True" x:Name="MainMenuBar">
+
+    <menus:MenuBar.ExtraButtons>
+        <ui3:RibbonExtraButton Text="Publish"
+                               IsPrimary="true" Icon="{x:Null}"
+                               Padding="6,4"
+                               Margin="8,0,0,0" />
+    </menus:MenuBar.ExtraButtons>
+
+    <MenuItem Header="{x:Static localization:Resources.MenuFile}">
+        <MenuItem Header="{x:Static localization:Resources.MenuNew}">
+        </MenuItem>
+    </MenuItem>
+</menus:MenuBar>
+
`,25),o=[d];function s(c,l){return a(),n("div",null,o)}const h=e(r,[["render",s],["__file","menubar.html.vue"]]);export{h as default}; diff --git a/docs/assets/menubar.html-7c0f687e.js b/docs/assets/menubar.html-7c0f687e.js new file mode 100644 index 0000000..e53a11f --- /dev/null +++ b/docs/assets/menubar.html-7c0f687e.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-82811736","path":"/controls/menubar.html","title":"MenuBar control","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Properties","slug":"properties","link":"#properties","children":[{"level":3,"title":"ExtraButtons","slug":"extrabuttons","link":"#extrabuttons","children":[]},{"level":3,"title":"QatCommands","slug":"qatcommands","link":"#qatcommands","children":[]},{"level":3,"title":"ShowQAT","slug":"showqat","link":"#showqat","children":[]},{"level":3,"title":"ShowQATLabels","slug":"showqatlabels","link":"#showqatlabels","children":[]},{"level":3,"title":"EnableAnimations","slug":"enableanimations","link":"#enableanimations","children":[]}]},{"level":2,"title":"Methods","slug":"methods","link":"#methods","children":[{"level":3,"title":"GetCommandIdentifier(MenuItem cmd)","slug":"getcommandidentifier-menuitem-cmd","link":"#getcommandidentifier-menuitem-cmd","children":[]}]},{"level":2,"title":"Events","slug":"events","link":"#events","children":[]},{"level":2,"title":"Examples","slug":"examples","link":"#examples","children":[]}],"git":{},"filePathRelative":"controls/menubar.md"}');export{e as data}; diff --git a/docs/assets/messagebox-c1159a2e.png b/docs/assets/messagebox-c1159a2e.png new file mode 100644 index 0000000..8456f5e Binary files /dev/null and b/docs/assets/messagebox-c1159a2e.png differ diff --git a/docs/assets/omnibar-search-provider.html-6a600717.js b/docs/assets/omnibar-search-provider.html-6a600717.js new file mode 100644 index 0000000..593b4f2 --- /dev/null +++ b/docs/assets/omnibar-search-provider.html-6a600717.js @@ -0,0 +1,49 @@ +import{_ as n,o as s,c as a,e}from"./app-47cf4121.js";const t={},c=e(`

Build custom search provider for the Omnibar

The ApplicationWindow provides an Omnibar search bar in the window chrome title bar. By default it will search through the ribbon commands to provide the user a quick and easy access.
You can extend this feature by adding you own search provider. For example, you may want to help your users to find files in a project, or any other item that your application manages.
This article will help you create and register a new search provider for the built-in omnibar search.

The service class

Your custom search provider must inherit from OmnibarSearchServiceBase.
This is a typical content of a custom search provider:

public class CustomOmnibarSearchService : OmnibarSearchServiceBase
+{
+    // The text that will be displayed in the drop down popup
+    public override string DisplayName
+    {
+        get
+        {
+            return "Search in files...";
+        }
+    }
+
+    // The icon that will be shown next to the text above
+    public override Brush Icon
+    {
+        get
+        {
+            return Brushes.Transparent;
+        }
+    }
+
+    // The results to show after the user has launched your search provider
+    public override IEnumerable<OmnibarSearchResult> ExecuteSearch(string terms)
+    {
+        // Perform your search operation using the argument "terms" that contains the text typed by the user.
+        // Then return the list of results.
+    }
+}
+

Once registered, this search provider will look like this:
image

Register your service provider

To make the application know your custom search provider, you have to register it using the OmnibarSearchService.RegisterOmnibarSearchService() method in the Window_Loaded event.

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
+{
+    ...
+    // Register your custom service in the Window_Loaded event
+    OmnibarSearchService.RegisterOmnibarSearchService(new CustomOmnibarSearchService());
+}
+

Handle the search result click

After the search, when the user clicks a result in the drop down list, the event OmnibarSearchService.SearchResultClicked is raised. You can listen to it to perform the corresponding action.

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
+{
+    ...
+    OmnibarSearchService.RegisterOmnibarSearchService(new CustomOmnibarSearchService());
+    
+    // Add this line to handle the click event on a search result.
+    OmnibarSearchService.SearchResultClicked += OmnibarSearchServiceOnSearchResultClicked;
+}
+
+private void OmnibarSearchServiceOnSearchResultClicked(object? sender, OmnibarSearchResult e)
+{
+    // Do something with the result that the user has selected.
+    MessageBox.Show("You clicked " + e.CommandTabName);
+}
+
+
`,12),i=[c];function o(r,p){return s(),a("div",null,i)}const u=n(t,[["render",o],["__file","omnibar-search-provider.html.vue"]]);export{u as default}; diff --git a/docs/assets/opendialog-d7c265c9.png b/docs/assets/opendialog-d7c265c9.png new file mode 100644 index 0000000..f809276 Binary files /dev/null and b/docs/assets/opendialog-d7c265c9.png differ diff --git a/docs/assets/ribbonbar-93de235a.png b/docs/assets/ribbonbar-93de235a.png new file mode 100644 index 0000000..3e5352a Binary files /dev/null and b/docs/assets/ribbonbar-93de235a.png differ diff --git a/docs/assets/ribbonbar.html-407dd3cf.js b/docs/assets/ribbonbar.html-407dd3cf.js new file mode 100644 index 0000000..6a23ef0 --- /dev/null +++ b/docs/assets/ribbonbar.html-407dd3cf.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,e as r}from"./app-47cf4121.js";const n="/Coho.UI/assets/ribbonbar-93de235a.png",o={},i=r('

RibbonBar control

Namespace: Coho.UI.Controls.Ribbon

Properties

ExtraButtons

Type: List<UIElement>

QatCommands

Type: List<string>

ShowQAT

Type: Bool

ShowQATLabels

Type: Bool

EnableAnimations

Type: Bool

Methods

GetCommandIdentifier(FrameworkElement cmd)

Returns the identifier of the provided FrameworkElement. It is used to memorize the Quick Access Toolbar commands for example.

Arguments

  • FrameworkElement cmd: The ribbon item you want to get the unique identifier.
    Note: The FrameworkElement must have a Name property set to work properly.

Exceptions

  • NullReferenceException: Occurs when the provided cmd has no FrameworkElement.Name property.

HideAllContextualTabs()

Hides all contextual tabs.

Arguments

None.

Returns

Void.

Exceptions

None.

HideContextualTab(RibbonTabItem ribbonTab)

Hides the provided contextual tab.

Arguments

  • RibbonTabItem ribbonTab: The contextual tab you want to hide.

Returns

Void.

Exceptions

None.

ShowContextualTab(RibbonTabItem ribbonTab)

Shows the provided contextual tab and makes it the current selected tab.

Arguments

  • RibbonTabItem ribbonTab: The contextual tab you want to show.

Returns

Void.

Exceptions

None.

Events

None.

Examples

',48),d=[i];function h(s,c){return a(),t("div",null,d)}const l=e(o,[["render",h],["__file","ribbonbar.html.vue"]]);export{l as default}; diff --git a/docs/assets/ribbonbar.html-f3226f98.js b/docs/assets/ribbonbar.html-f3226f98.js new file mode 100644 index 0000000..061ccb1 --- /dev/null +++ b/docs/assets/ribbonbar.html-f3226f98.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-62097648","path":"/controls/ribbonbar.html","title":"RibbonBar control","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Properties","slug":"properties","link":"#properties","children":[{"level":3,"title":"ExtraButtons","slug":"extrabuttons","link":"#extrabuttons","children":[]},{"level":3,"title":"QatCommands","slug":"qatcommands","link":"#qatcommands","children":[]},{"level":3,"title":"ShowQAT","slug":"showqat","link":"#showqat","children":[]},{"level":3,"title":"ShowQATLabels","slug":"showqatlabels","link":"#showqatlabels","children":[]},{"level":3,"title":"EnableAnimations","slug":"enableanimations","link":"#enableanimations","children":[]}]},{"level":2,"title":"Methods","slug":"methods","link":"#methods","children":[{"level":3,"title":"GetCommandIdentifier(FrameworkElement cmd)","slug":"getcommandidentifier-frameworkelement-cmd","link":"#getcommandidentifier-frameworkelement-cmd","children":[]},{"level":3,"title":"HideAllContextualTabs()","slug":"hideallcontextualtabs","link":"#hideallcontextualtabs","children":[]},{"level":3,"title":"HideContextualTab(RibbonTabItem ribbonTab)","slug":"hidecontextualtab-ribbontabitem-ribbontab","link":"#hidecontextualtab-ribbontabitem-ribbontab","children":[]},{"level":3,"title":"ShowContextualTab(RibbonTabItem ribbonTab)","slug":"showcontextualtab-ribbontabitem-ribbontab","link":"#showcontextualtab-ribbontabitem-ribbontab","children":[]}]},{"level":2,"title":"Events","slug":"events","link":"#events","children":[]},{"level":2,"title":"Examples","slug":"examples","link":"#examples","children":[]}],"git":{},"filePathRelative":"controls/ribbonbar.md"}');export{e as data}; diff --git a/docs/assets/settingstab-f30ee798.png b/docs/assets/settingstab-f30ee798.png new file mode 100644 index 0000000..395c10e Binary files /dev/null and b/docs/assets/settingstab-f30ee798.png differ diff --git a/docs/classes/ThemedSpecialDialogOptions.html b/docs/classes/ThemedSpecialDialogOptions.html index e9e63ea..9edb04e 100644 --- a/docs/classes/ThemedSpecialDialogOptions.html +++ b/docs/classes/ThemedSpecialDialogOptions.html @@ -24,10 +24,10 @@ ThemedSpecialDialogOptions class | Coho.UI, WPF Library documentation - + -

ThemedSpecialDialogOptions class

This class is used to configure the behavior of the ThemedOpenFileDialog dialog.

Properties

DefaultHeight

Type: int
Default value: 650
The DefaultHeight property defines the initial height of the dialog in pixels.

DefaultWidth

Type: int
Default value: 920
The DefaultWidth property defines the initial width of the dialog in pixels.

FileTypes

Type: Dictionary<string, string>
Default value: default
The FileTypes property defines the extensions that are supported by the dialog.

InitialDirectory

Type: string
Default value: String.Empty
The InitialDirectory property defines the first folder to show when the dialog is opened.

ShowDefaultSpecialFolders

Type: bool
Default value: true
The ShowDefaultSpecialFolders property defines if the special folders (Documents, Images, Videos...) section will be displayed. This property has no effect if the ShowNavigationPane property is set to false.

ShowNavigationPane

Type: bool
Default value: true
The ShowNavigationPane property defines if the navigation pane (on the left side) will be displayed.

Methods

None.

Events

None.

- +

ThemedSpecialDialogOptions class

This class is used to configure the behavior of the ThemedOpenFileDialog dialog.

Properties

DefaultHeight

Type: int
Default value: 650
The DefaultHeight property defines the initial height of the dialog in pixels.

DefaultWidth

Type: int
Default value: 920
The DefaultWidth property defines the initial width of the dialog in pixels.

FileTypes

Type: Dictionary<string, string>
Default value: default
The FileTypes property defines the extensions that are supported by the dialog.

InitialDirectory

Type: string
Default value: String.Empty
The InitialDirectory property defines the first folder to show when the dialog is opened.

ShowDefaultSpecialFolders

Type: bool
Default value: true
The ShowDefaultSpecialFolders property defines if the special folders (Documents, Images, Videos...) section will be displayed. This property has no effect if the ShowNavigationPane property is set to false.

ShowNavigationPane

Type: bool
Default value: true
The ShowNavigationPane property defines if the navigation pane (on the left side) will be displayed.

Methods

None.

Events

None.

+ diff --git a/docs/controls/FolderPickerTextbox.html b/docs/controls/FolderPickerTextbox.html index de4b691..af8f4b4 100644 --- a/docs/controls/FolderPickerTextbox.html +++ b/docs/controls/FolderPickerTextbox.html @@ -24,11 +24,11 @@ FolderPickerTextbox Control | Coho.UI, WPF Library documentation - + -

FolderPickerTextbox Control

Namespace: Coho.UI.Controls.Textboxes, inherits from TextBox

The FolderPickerTextbox is a text box that contains a button that allows the user to open the native folder picker dialog to select a folder.

Properties

Text

Type: string
The value of the text box.

Events

SelectionChanged

Type:EventHandler<string>
This event fires when the users selects a path in the folder picker dialog. The string argument is the selected path.

Examples

Example 1

<textboxes:FolderPickerTextbox x:Name="TbDefaultFolder" Width="240" />
+    

FolderPickerTextbox Control

Namespace: Coho.UI.Controls.Textboxes, inherits from TextBox

The FolderPickerTextbox is a text box that contains a button that allows the user to open the native folder picker dialog to select a folder.

Properties

Text

Type: string
The value of the text box.

Events

SelectionChanged

Type:EventHandler<string>
This event fires when the users selects a path in the folder picker dialog. The string argument is the selected path.

Examples

Example 1

<textboxes:FolderPickerTextbox x:Name="TbDefaultFolder" Width="240" />
 
- + diff --git a/docs/controls/GenericPickerTextbox.html b/docs/controls/GenericPickerTextbox.html index b6d6dbe..b8a497f 100644 --- a/docs/controls/GenericPickerTextbox.html +++ b/docs/controls/GenericPickerTextbox.html @@ -24,10 +24,10 @@ Coho.UI, WPF Library documentation - + - - + + diff --git a/docs/controls/MasterAccentSplitButton.html b/docs/controls/MasterAccentSplitButton.html index 31b3167..eed378c 100644 --- a/docs/controls/MasterAccentSplitButton.html +++ b/docs/controls/MasterAccentSplitButton.html @@ -24,10 +24,10 @@ MasterAccentSplitButton Control | Coho.UI, WPF Library documentation - + -

MasterAccentSplitButton Control

Namespace: Coho.UI.Controls.Buttons, inherits from Button

The MasterAccentSplitButton is a button that it usually used to start an activity in the application. For example, in Microsoft Office, you can find them in the Backstage view, to create new documents. It's a split button that uses the AccentColor resource as background. The text uses a semi bold weight. It supports an icon (brush resource).

Properties

Type: object
The content of the dropdown menu.

Icon

Type: brush
The icon to display in the button.

Text

Type: string
The text to display in the button.

Methods

None.

Events

Click

Type: RoutedEventHandler
Occurs when the user clicks the left part of the button.

Examples

Example 1

<buttons:MasterAccentSplitButton Text="Create new" Icon="{DynamicResource IconMagic}" Click="MasterAccentSplitButton_Click">
+    

MasterAccentSplitButton Control

Namespace: Coho.UI.Controls.Buttons, inherits from Button

The MasterAccentSplitButton is a button that it usually used to start an activity in the application. For example, in Microsoft Office, you can find them in the Backstage view, to create new documents. It's a split button that uses the AccentColor resource as background. The text uses a semi bold weight. It supports an icon (brush resource).

Properties

Type: object
The content of the dropdown menu.

Icon

Type: brush
The icon to display in the button.

Text

Type: string
The text to display in the button.

Methods

None.

Events

Click

Type: RoutedEventHandler
Occurs when the user clicks the left part of the button.

Examples

Example 1

<buttons:MasterAccentSplitButton Text="Create new" Icon="{DynamicResource IconMagic}" Click="MasterAccentSplitButton_Click">
    <buttons:MasterAccentSplitButton.DropDownContent>
       <StackPanel>
          <MenuItem Header="Item 1" />
@@ -36,6 +36,6 @@
    </buttons:MasterAccentSplitButton.DropDownContent>
 </buttons:MasterAccentSplitButton>
 
- + diff --git a/docs/controls/SettingsTabControl.html b/docs/controls/SettingsTabControl.html new file mode 100644 index 0000000..fe434be --- /dev/null +++ b/docs/controls/SettingsTabControl.html @@ -0,0 +1,45 @@ + + + + + + + + + SettingsTabControl Control | Coho.UI, WPF Library documentation + + + + +

SettingsTabControl Control

Namespace: Coho.UI.Controls.TabControl, inherits from TabControl

The SettingsTabControl provides a TabControl to use in settings purpose.

Properties

Title

Type: string
The main title to be displayed at the top of the control, before the current section title.

Methods

None.

Events

None.

Examples

Example 1

<tabControl:SettingsTabControl Title="{x:Static localization:Resources.MenuSettings}">
+    <tabControl:SettingsTabControlItem Title="{x:Static localization:Resources.SettingsSectionGeneral}">
+    
+    ...
+    
+    </tabControl:SettingsTabControlItem>
+    <tabControl:SettingsTabControlItem Title="{x:Static localization:Resources.SettingsSectionEditor}">
+    
+    ...
+    
+    </tabControl:SettingsTabControlItem>
+</tabControl:SettingsTabControl>
+
+ + + diff --git a/docs/controls/acryliccontextmenu.html b/docs/controls/acryliccontextmenu.html index 5af05fd..caa9219 100644 --- a/docs/controls/acryliccontextmenu.html +++ b/docs/controls/acryliccontextmenu.html @@ -24,10 +24,10 @@ The AcrylicContextMenu control | Coho.UI, WPF Library documentation - + -

The AcrylicContextMenu control

Namespace: Coho.UI.Controls.Menus, inherits from ContextMenu

The AcrylicContextMenu uses the Acrylic texture on Windows 11. It will automatically fallback to a legacy style when it is not available.

Properties

None.

Methods

None.

Events

None.

Examples

This example shows how to attach an AcrylicContextMenu on a Border.

<Border Width="150" Height="150" Background="Silver">
+    

The AcrylicContextMenu control

Namespace: Coho.UI.Controls.Menus, inherits from ContextMenu

The AcrylicContextMenu uses the Acrylic texture on Windows 11. It will automatically fallback to a legacy style when it is not available.

Properties

None.

Methods

None.

Events

None.

Examples

This example shows how to attach an AcrylicContextMenu on a Border.

<Border Width="150" Height="150" Background="Silver">
 	<Border.ContextMenu>
 		<menus:AcrylicContextMenu>
 			<MenuItem Header="Test 1"/>
@@ -37,6 +37,6 @@
 	</Border.ContextMenu>
 </Border>
 
- + diff --git a/docs/controls/announcer.html b/docs/controls/announcer.html index 90db746..4c25d8a 100644 --- a/docs/controls/announcer.html +++ b/docs/controls/announcer.html @@ -24,10 +24,10 @@ Announcer control | Coho.UI, WPF Library documentation - + -

Announcer control

Namespace: Coho.UI.Controls.Announcer

The Announcer is a slider that allows you to specify the number of items per page and the template of bound items.

Properties

AnnounceTemplate

Type: DataTemplate
The AnnounceTemplate property defines the template to be used to display items in the slider.

IsLoadingContent

Type: DependencyProperty, bool
The IsLoadingContent property is used to hide control content and display a LoadingRing to indicate that content is being loaded.

ItemsPerView

Type: DependencyProperty, int
The ItemsPerView property is used to set the number of items per page. When there are more items than this value, the user can slide content using the arrows on the top right of the control.

ItemsSource

Type: IEnumerable<object>
The ItemsSource property is used to set the collection of objects to display.

Label

Type: DependencyProperty, string
The Label property is used to set the text displayed at the top of the Announcer control.

Methods

None.

Events

None.

Examples

Example 1

This example shows how to set the AnnounceTemplate property from Xaml.

<announcer:Announcer AnnouncesAreaMargin="0,8,0,0" Margin="0,8" ItemsPerView="4"
+    

Announcer control

Namespace: Coho.UI.Controls.Announcer

The Announcer is a slider that allows you to specify the number of items per page and the template of bound items.

Properties

AnnounceTemplate

Type: DataTemplate
The AnnounceTemplate property defines the template to be used to display items in the slider.

IsLoadingContent

Type: DependencyProperty, bool
The IsLoadingContent property is used to hide control content and display a LoadingRing to indicate that content is being loaded.

ItemsPerView

Type: DependencyProperty, int
The ItemsPerView property is used to set the number of items per page. When there are more items than this value, the user can slide content using the arrows on the top right of the control.

ItemsSource

Type: IEnumerable<object>
The ItemsSource property is used to set the collection of objects to display.

Label

Type: DependencyProperty, string
The Label property is used to set the text displayed at the top of the Announcer control.

Methods

None.

Events

None.

Examples

Example 1

This example shows how to set the AnnounceTemplate property from Xaml.

<announcer:Announcer AnnouncesAreaMargin="0,8,0,0" Margin="0,8" ItemsPerView="4"
                                      x:Name="AnnouncesPresenter" MinHeight="200">
                     <announcer:Announcer.AnnounceTemplate>
                         <DataTemplate>
@@ -57,6 +57,6 @@
                      Label="{x:Static localization:Resources.OnlineResourcesDescription}">
 </announcer:Announcer>
 
- + diff --git a/docs/controls/menubar.html b/docs/controls/menubar.html index 21ec948..7531239 100644 --- a/docs/controls/menubar.html +++ b/docs/controls/menubar.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - The MenuBar control | Coho.UI, WPF Library documentation + MenuBar control | Coho.UI, WPF Library documentation - + -

The MenuBar control

Namespace: Coho.UI.Controls.Menus

Properties

ExtraButtons

Type: List<UIElement>

QatCommands

Type: List<UIElement>

ShowQAT

Type: Bool

ShowQATLabels

Type: Bool

EnableAnimations

Type: Bool

Methods

GetCommandIdentifier(MenuItem cmd)

Returns the identifier of the provided MenuItem. It is used to memorize the Quick Access Toolbar commands for example.

Arguments

  • MenuItem cmd: The menu item you want to get the unique identifier.
    Note: The MenuItem must have a Name property set to work properly.

Exceptions

  • NullReferenceException: Occurs when the provided cmd has no FrameworkElement.Name property.

Events

None.

Examples

<menus:MenuBar ShowQAT="True" x:Name="MainMenuBar">
+    

MenuBar control

Namespace: Coho.UI.Controls.Menus

Properties

ExtraButtons

Type: List<UIElement>

QatCommands

Type: List<string>

ShowQAT

Type: Bool

ShowQATLabels

Type: Bool

EnableAnimations

Type: Bool

Methods

GetCommandIdentifier(MenuItem cmd)

Returns the identifier of the provided MenuItem. It is used to memorize the Quick Access Toolbar commands for example.

Arguments

  • MenuItem cmd: The menu item you want to get the unique identifier.
    Note: The MenuItem must have a Name property set to work properly.

Exceptions

  • NullReferenceException: Occurs when the provided cmd has no FrameworkElement.Name property.

Events

None.

Examples

<menus:MenuBar ShowQAT="True" x:Name="MainMenuBar">
 
     <menus:MenuBar.ExtraButtons>
         <ui3:RibbonExtraButton Text="Publish"
@@ -42,6 +42,6 @@
     </MenuItem>
 </menus:MenuBar>
 
- + diff --git a/docs/controls/ribbonbar.html b/docs/controls/ribbonbar.html new file mode 100644 index 0000000..93180f8 --- /dev/null +++ b/docs/controls/ribbonbar.html @@ -0,0 +1,33 @@ + + + + + + + + + RibbonBar control | Coho.UI, WPF Library documentation + + + + +

RibbonBar control

Namespace: Coho.UI.Controls.Ribbon

Properties

ExtraButtons

Type: List<UIElement>

QatCommands

Type: List<string>

ShowQAT

Type: Bool

ShowQATLabels

Type: Bool

EnableAnimations

Type: Bool

Methods

GetCommandIdentifier(FrameworkElement cmd)

Returns the identifier of the provided FrameworkElement. It is used to memorize the Quick Access Toolbar commands for example.

Arguments

  • FrameworkElement cmd: The ribbon item you want to get the unique identifier.
    Note: The FrameworkElement must have a Name property set to work properly.

Exceptions

  • NullReferenceException: Occurs when the provided cmd has no FrameworkElement.Name property.

HideAllContextualTabs()

Hides all contextual tabs.

Arguments

None.

Returns

Void.

Exceptions

None.

HideContextualTab(RibbonTabItem ribbonTab)

Hides the provided contextual tab.

Arguments

  • RibbonTabItem ribbonTab: The contextual tab you want to hide.

Returns

Void.

Exceptions

None.

ShowContextualTab(RibbonTabItem ribbonTab)

Shows the provided contextual tab and makes it the current selected tab.

Arguments

  • RibbonTabItem ribbonTab: The contextual tab you want to show.

Returns

Void.

Exceptions

None.

Events

None.

Examples

+ + + diff --git a/docs/dialogs/ThemedInputBox.html b/docs/dialogs/ThemedInputBox.html index c79088e..f1b33bd 100644 --- a/docs/dialogs/ThemedInputBox.html +++ b/docs/dialogs/ThemedInputBox.html @@ -24,16 +24,16 @@ ThemedInputBox dialog | Coho.UI, WPF Library documentation - + -

ThemedInputBox dialog

The ThemedInputBox is a dialog that provides a message and a TextBox so that the user can enter text.

Properties

None.

Methods

static string? Show(string message, string title, string defaultValue = "")

Shows a modal dialog using the current theme. Returns a string?.
If the returned value is null, it means that the user selected the Cancel button or closed the dialog.

Arguments

  • string message : The message to display.
  • string title : The title of the dialog.
  • string defaultValue : The text to write in the TextBox by default when the dialog opens.

static string? Show(string message, string title, string defaultValue, string defaultButtonText, string secondaryButtonText)

Shows a modal dialog using the current theme. Returns a string?.
If the returned value is null, it means that the user selected the Cancel button or closed the dialog.

Arguments

  • string message : The message to display.
  • string title : The title of the dialog.
  • string defaultValue : The text to write in the TextBox by default when the dialog opens.
  • string defaultButtonText : The text to display in the default button.
  • string secondaryButtonText : The text to in the the secondary button.

static string? Show(string message, string title, Window owner, string defaultValue = "", string? defaultButtonText = null, string? secondaryButtonText = null

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.
This method can be used to override the default texts and provide a better UX while still using the default framework components.
This method should be used with the MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo arguments. The Yes button will be replaced with the defaultButtonText value, and the No button will be replaced with the secondaryButtonText.

Arguments

  • string message : The message to display.
  • string title : The title of the dialog.
  • Window owner : The window that owns the dialog; used for the modal behavior.
  • string defaultValue : The text to write in the TextBox by default when the dialog opens.
  • string defaultButtonText : The text to display in the default button.
  • string secondaryButtonText : The text to in the the secondary button.

Events

None.

Examples

Example 1

This example shows how to use the ThemedInputBox from C# and handle the result.

string? value = ThemedInputBox.Show("Please provide name for this folder:", "Rename folder", this);
+    

ThemedInputBox dialog

The ThemedInputBox is a dialog that provides a message and a TextBox so that the user can enter text.

Properties

None.

Methods

static string? Show(string message, string title, string defaultValue = "")

Shows a modal dialog using the current theme. Returns a string?.
If the returned value is null, it means that the user selected the Cancel button or closed the dialog.

Arguments

  • string message : The message to display.
  • string title : The title of the dialog.
  • string defaultValue : The text to write in the TextBox by default when the dialog opens.

static string? Show(string message, string title, string defaultValue, string defaultButtonText, string secondaryButtonText)

Shows a modal dialog using the current theme. Returns a string?.
If the returned value is null, it means that the user selected the Cancel button or closed the dialog.

Arguments

  • string message : The message to display.
  • string title : The title of the dialog.
  • string defaultValue : The text to write in the TextBox by default when the dialog opens.
  • string defaultButtonText : The text to display in the default button.
  • string secondaryButtonText : The text to in the the secondary button.

static string? Show(string message, string title, Window owner, string defaultValue = "", string? defaultButtonText = null, string? secondaryButtonText = null

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.
This method can be used to override the default texts and provide a better UX while still using the default framework components.
This method should be used with the MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo arguments. The Yes button will be replaced with the defaultButtonText value, and the No button will be replaced with the secondaryButtonText.

Arguments

  • string message : The message to display.
  • string title : The title of the dialog.
  • Window owner : The window that owns the dialog; used for the modal behavior.
  • string defaultValue : The text to write in the TextBox by default when the dialog opens.
  • string defaultButtonText : The text to display in the default button.
  • string secondaryButtonText : The text to in the the secondary button.

Events

None.

Examples

Example 1

This example shows how to use the ThemedInputBox from C# and handle the result.

string? value = ThemedInputBox.Show("Please provide name for this folder:", "Rename folder", this);
 
 if (!string.IsNullOrEmpty(value))
 {
     // some code to rename a folder
 }
 
- + diff --git a/docs/dialogs/ThemedMessageBox.html b/docs/dialogs/ThemedMessageBox.html index 97b6a95..05eb074 100644 --- a/docs/dialogs/ThemedMessageBox.html +++ b/docs/dialogs/ThemedMessageBox.html @@ -24,10 +24,10 @@ ThemedMessageBox dialog | Coho.UI, WPF Library documentation - + -

ThemedMessageBox dialog

The ThemedMessageBox is a dialog that replaces the default MessageBox using the current theme.

Properties

None.

Methods

static MessageBoxResult Show(string message, string title, MessageBoxButton button)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.

Arguments

  • string message : The message to display
  • string title : The title of the dialog
  • MessageBoxButton button : The buttons to display

static MessageBoxResult Show(string message, string title, MessageBoxButton button, string defaultButtonText, string secondaryButtonText)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.
This method can be used to override the default texts and provide a better UX while still using the default framework components.
This method should be used with the MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo arguments. The Yes button will be replaced with the defaultButtonText value, and the No button will be replaced with the secondaryButtonText.

Arguments

  • string message : The message to display
  • string title : The title of the dialog
  • MessageBoxButton : The buttons to display
  • string defaultButtonText : The text to display in the default button (the Yes button when using MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo)
  • string secondaryButtonText : The text to in the the secondary button (the No button when using MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo)

static MessageBoxResult Show(string message, string title, Window owner, MessageBoxButton button, string? defaultButtonText = null, string? secondaryButtonText = null)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.
This method can be used to override the default texts and provide a better UX while still using the default framework components.
This method should be used with the MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo arguments. The Yes button will be replaced with the defaultButtonText value, and the No button will be replaced with the secondaryButtonText.

Arguments

  • string message : The message to display
  • Window owner: The Window that will own the dialog
  • string title : The title of the dialog
  • MessageBoxButton : The buttons to display
  • string defaultButtonText : The text to display in the default button (the Yes button when using MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo)
  • string secondaryButtonText : The text to in the the secondary button (the No button when using MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo)

Events

None.

Examples

Example 1

This example shows how to use the ThemedMessageBox from C# and handle the result.

MessageBoxResult quest = ThemedMessageBox.Show("Do you want to save changes?", "Save changes", MessageBoxButton.YesNoCancel);
+    

ThemedMessageBox dialog

The ThemedMessageBox is a dialog that replaces the default MessageBox using the current theme.

Properties

None.

Methods

static MessageBoxResult Show(string message, string title, MessageBoxButton button)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.

Arguments

  • string message : The message to display
  • string title : The title of the dialog
  • MessageBoxButton button : The buttons to display

static MessageBoxResult Show(string message, string title, MessageBoxButton button, string defaultButtonText, string secondaryButtonText)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.
This method can be used to override the default texts and provide a better UX while still using the default framework components.
This method should be used with the MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo arguments. The Yes button will be replaced with the defaultButtonText value, and the No button will be replaced with the secondaryButtonText.

Arguments

  • string message : The message to display
  • string title : The title of the dialog
  • MessageBoxButton : The buttons to display
  • string defaultButtonText : The text to display in the default button (the Yes button when using MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo)
  • string secondaryButtonText : The text to in the the secondary button (the No button when using MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo)

static MessageBoxResult Show(string message, string title, Window owner, MessageBoxButton button, string? defaultButtonText = null, string? secondaryButtonText = null)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.
This method can be used to override the default texts and provide a better UX while still using the default framework components.
This method should be used with the MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo arguments. The Yes button will be replaced with the defaultButtonText value, and the No button will be replaced with the secondaryButtonText.

Arguments

  • string message : The message to display
  • Window owner: The Window that will own the dialog
  • string title : The title of the dialog
  • MessageBoxButton : The buttons to display
  • string defaultButtonText : The text to display in the default button (the Yes button when using MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo)
  • string secondaryButtonText : The text to in the the secondary button (the No button when using MessageBoxButton.YesNoCancel or MessageBoxButton.YesNo)

Events

None.

Examples

Example 1

This example shows how to use the ThemedMessageBox from C# and handle the result.

MessageBoxResult quest = ThemedMessageBox.Show("Do you want to save changes?", "Save changes", MessageBoxButton.YesNoCancel);
 
 switch (quest)
 {
@@ -42,6 +42,6 @@
     break;
 }
 
- + diff --git a/docs/dialogs/ThemedOpenFileDialog.html b/docs/dialogs/ThemedOpenFileDialog.html index 5a70cd8..f1f8794 100644 --- a/docs/dialogs/ThemedOpenFileDialog.html +++ b/docs/dialogs/ThemedOpenFileDialog.html @@ -24,10 +24,10 @@ ThemedOpenFileDialog dialog | Coho.UI, WPF Library documentation - + -

ThemedOpenFileDialog dialog

The ThemedOpenFileDialog is a dialog that replaces the default OpenFileDialog using the current theme.

Properties

None.

Methods

static string? Show(string title, Dictionary<string, string> fileTypes, Window owner)

Opens a dialog that lets the user browse the computer to open an existing file. Returns a string?.
When the result is null, it means that the user has closed the dialog without selecting a file.

Arguments

  • string title : The title of the dialog
  • Dictionary<string, string> fileTypes : The supported extensions
  • Window owner: The Window that will own the dialog

static string? Show(string title, ThemedSpecialDialogOptions options, Window owner, string? defaultButtonText = null, string? secondaryButtonText = null)

Opens a dialog that lets the user browse the computer to open an existing file. Returns a string?.
When the result is null, it means that the user has closed the dialog without selecting a file.

Arguments

  • string title : The title of the dialog
  • ThemedSpecialDialogOptions options : The options to configure the dialog
  • Window owner: The Window that will own the dialog
  • string defaultButtonText : The text to display in the default button
  • string secondaryButtonText : The text to in the the secondary button

Events

None.

Examples

Example 1

This example shows how to localize the ThemedOpenFileDialog texts.

public MainWindow()
+    

ThemedOpenFileDialog dialog

The ThemedOpenFileDialog is a dialog that replaces the default OpenFileDialog using the current theme.

Properties

None.

Methods

static string? Show(string title, Dictionary<string, string> fileTypes, Window owner)

Opens a dialog that lets the user browse the computer to open an existing file. Returns a string?.
When the result is null, it means that the user has closed the dialog without selecting a file.

Arguments

  • string title : The title of the dialog
  • Dictionary<string, string> fileTypes : The supported extensions
  • Window owner: The Window that will own the dialog

static string? Show(string title, ThemedSpecialDialogOptions options, Window owner, string? defaultButtonText = null, string? secondaryButtonText = null)

Opens a dialog that lets the user browse the computer to open an existing file. Returns a string?.
When the result is null, it means that the user has closed the dialog without selecting a file.

Arguments

  • string title : The title of the dialog
  • ThemedSpecialDialogOptions options : The options to configure the dialog
  • Window owner: The Window that will own the dialog
  • string defaultButtonText : The text to display in the default button
  • string secondaryButtonText : The text to in the the secondary button

Events

None.

Examples

Example 1

This example shows how to localize the ThemedOpenFileDialog texts.

public MainWindow()
 {
   InitializeComponent();
   Loaded += OnLoaded;
@@ -60,6 +60,6 @@
     // open the selected file in your application
 }
 
- + diff --git a/docs/dialogs/ThemedSaveFileDialog.html b/docs/dialogs/ThemedSaveFileDialog.html index 2b64a73..9fbad18 100644 --- a/docs/dialogs/ThemedSaveFileDialog.html +++ b/docs/dialogs/ThemedSaveFileDialog.html @@ -24,10 +24,10 @@ ThemedSaveFileDialog dialog | Coho.UI, WPF Library documentation - + -

ThemedSaveFileDialog dialog

The ThemedSaveFileDialog is a dialog that replaces the default SaveFileDialog using the current theme.

Properties

None.

Methods

Show(string message, string title, MessageBoxButton button)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.

Arguments

  • string message : The message to display
  • string title : The title of the dialog
  • MessageBoxButton button : The buttons to display

Events

None.

Examples

Example 1

This example shows how to use the ThemedMessageBox from C# and handle the result.

string? filePath = ThemedOpenFileDialog.Show("Open file",
+    

ThemedSaveFileDialog dialog

The ThemedSaveFileDialog is a dialog that replaces the default SaveFileDialog using the current theme.

Properties

None.

Methods

Show(string message, string title, MessageBoxButton button)

Shows a modal dialog using the current theme. Returns a MessageBoxResult that represents the choice of the user.

Arguments

  • string message : The message to display
  • string title : The title of the dialog
  • MessageBoxButton button : The buttons to display

Events

None.

Examples

Example 1

This example shows how to use the ThemedMessageBox from C# and handle the result.

string? filePath = ThemedOpenFileDialog.Show("Open file",
                     new Dictionary<string, string>()
                     {
                         {"All supported file types (*.md;*.pwdp)", "*.md;*.pwdp"},
@@ -42,6 +42,6 @@
     // open the selected file in your application
 }
 
- + diff --git a/docs/getstarted.html b/docs/getstarted.html index f85a79b..4ad5a25 100644 --- a/docs/getstarted.html +++ b/docs/getstarted.html @@ -24,10 +24,10 @@ Getting started with Coho.UI | Coho.UI, WPF Library documentation - + -

Getting started with Coho.UI

https://www.nuget.org/packages/Coho.UI/open in new window

Define your theme

Have a look at the sample application, the file App.xaml contains all the required resources to make it work nicely. Just change the brushes to make it yours.

You must define the Font Family and Font size to use.

  • FontFamily AppFont: Defines the font to use in the UI.
  • system:Double AppFontSize: Defines the font size to use in the UI.

Example:

<FontFamily x:Key="AppFont">Segoe UI Variable Display,Segoe UI</FontFamily>
+    

Getting started with Coho.UI

https://www.nuget.org/packages/Coho.UI/open in new window

Define your theme

Have a look at the sample application, the file App.xaml contains all the required resources to make it work nicely. Just change the brushes to make it yours.

You must define the Font Family and Font size to use.

  • FontFamily AppFont: Defines the font to use in the UI.
  • system:Double AppFontSize: Defines the font size to use in the UI.

Example:

<FontFamily x:Key="AppFont">Segoe UI Variable Display,Segoe UI</FontFamily>
 <system:Double x:Key="AppFontSize">14</system:Double>
 

You must define your color theme using specified resource names.

  • Color ChromeBorderActiveColor: Defines the color of the window border when it is active.
  • Brush AccentColor: Defines the accent color to be used on various UI elements.
  • Brush AccentColorDark: Defines the darker accent color to be used on various UI elements (used for hover state for example).
  • Brush AccentColorDarker: Defines the even darker accent color to be used on various UI elements (used for pressed state for example).
  • Brush IconsAccentColor: Defines the color to be used in Coho.UI bundled isons.
  • Brush AccentButtonBorderColor: Defines the brush to be used for border on buttons that use the PrimaryButton style.

Example:

<Color x:Key="ChromeBorderActiveColor">#038387</Color>
 <LinearGradientBrush x:Key="AccentButtonBorderColor" StartPoint="0,0.9" EndPoint="0,1">
@@ -60,6 +60,6 @@
     UIController.Init(ThemeScheme.Light);
 }
 
- + diff --git a/docs/howto/localize-strings.html b/docs/howto/localize-strings.html new file mode 100644 index 0000000..ed1eb1b --- /dev/null +++ b/docs/howto/localize-strings.html @@ -0,0 +1,42 @@ + + + + + + + + + Localize default strings | Coho.UI, WPF Library documentation + + + + +

Localize default strings

Coho.UI comes with default texts in English. You can however customize them to improve your UX.

Table of default strings

Class nameProperty nameDefault valueDescription
Coho.UI.GenericTextCopyCopyThe text used to perform the "copy to clipboard" action
Coho.UI.GenericTextCutCutThe text used to perform the "cut to clipboard" action
Coho.UI.GenericTextPastePasteThe text used to perform the "paste from clipboard" action
Coho.UI.GenericTextSelectAllSelect allThe text used to perform the "select all content" action
Coho.UI.GenericTextOkOKThe text used that is displayed in the Ok buttons in dialogs
Coho.UI.GenericTextYesYesThe text used that is displayed in the Yes buttons in dialogs
Coho.UI.GenericTextNoNoThe text used that is displayed in the No buttons in dialogs
Coho.UI.GenericTextHelpGenericHintPress F1 to get help.The text used in the Omnibar results and in the ribbon/QAT buttons tooltips
Coho.UI.GenericTextMoreOptionsMore optionsThe text used in various contexts when other options are available to the user
Coho.UI.OmnibarTextsNoResultNo result found.The text used when the omnibar search did not return any result
Coho.UI.OmnibarTextsPlaceholderTextSearch or type a commandThe text used as a placeholder when the focus is not set to the omnibar
Coho.UI.OmnibarTextsResultsCommandsGroupNameCommandsThe text used to group results in the omnibar results popup
Coho.UI.OmnibarTextsResultsOtherServicesOther searches...The text used to group results in the omnibar results popup
Coho.UI.OmnibarTextsResultsInFilesResults found in filesThe text used to group results in the omnibar results popup
Coho.UI.OmnibarTextsSearchInFilesSearch in files...The text used to start the "Find in files" command
Coho.UI.DialogsTextOpenOpenThe text of the default button of the ThemedOpenFileDialog
Coho.UI.DialogsTextFileNameFile nameThe text next to the file name textbox in the ThemedOpenFileDialog
Coho.UI.DialogsTextFolderParentLevelParentThe text of the browse top folder button in the ThemedOpenFileDialog

Customize strings

You can easily change the default values using your own strings.

This example shows how to change text using a static value:

private void OnLoaded(object sender, RoutedEventArgs e)
+{
+    Coho.UI.GenericText.Yes = "YES!";
+}
+

This example shows how to change text using your own localized strings:

private void OnLoaded(object sender, RoutedEventArgs e)
+{
+    // Localization.Resources is the class name of your RESX generated class
+    Coho.UI.GenericText.Yes = Localization.Resources.GenericYes;
+}
+
+ + + diff --git a/docs/howto/omnibar-search-provider.html b/docs/howto/omnibar-search-provider.html index 37cb53b..4fd790a 100644 --- a/docs/howto/omnibar-search-provider.html +++ b/docs/howto/omnibar-search-provider.html @@ -24,10 +24,10 @@ Build custom search provider for the Omnibar | Coho.UI, WPF Library documentation - + -

Build custom search provider for the Omnibar

The ApplicationWindow provides an Omnibar search bar in the window chrome title bar. By default it will search through the ribbon commands to provide the user a quick and easy access.
You can extend this feature by adding you own search provider. For example, you may want to help your users to find files in a project, or any other item that your application manages.
This article will help you create and register a new search provider for the built-in omnibar search.

The service class

Your custom search provider must inherit from OmnibarSearchServiceBase.
This is a typical content of a custom search provider:

public class CustomOmnibarSearchService : OmnibarSearchServiceBase
+    

Build custom search provider for the Omnibar

The ApplicationWindow provides an Omnibar search bar in the window chrome title bar. By default it will search through the ribbon commands to provide the user a quick and easy access.
You can extend this feature by adding you own search provider. For example, you may want to help your users to find files in a project, or any other item that your application manages.
This article will help you create and register a new search provider for the built-in omnibar search.

The service class

Your custom search provider must inherit from OmnibarSearchServiceBase.
This is a typical content of a custom search provider:

public class CustomOmnibarSearchService : OmnibarSearchServiceBase
 {
     // The text that will be displayed in the drop down popup
     public override string DisplayName
@@ -76,6 +76,6 @@
 }
 
 
- + diff --git a/docs/index.html b/docs/index.html index 63836dc..fab1cb5 100644 --- a/docs/index.html +++ b/docs/index.html @@ -24,10 +24,10 @@ Coho.UI Documentation | Coho.UI, WPF Library documentation - + -

Coho.UI Documentation

https://www.nuget.org/packages/Coho.UI/open in new window

Introduction to V2

The V2 contains a lot of new things, but also breaking changes. Please read this page before you update your projects.

Breaking changes

  • The Icon property of MenuItem is now supposed to be a Brush object.
- + + diff --git a/docs/windows/ApplicationWindow.html b/docs/windows/ApplicationWindow.html index 2ec4ecb..583b3a4 100644 --- a/docs/windows/ApplicationWindow.html +++ b/docs/windows/ApplicationWindow.html @@ -24,10 +24,10 @@ ApplicationWindow | Coho.UI, WPF Library documentation - + - - + + diff --git a/docs/windows/SecondaryWindow.html b/docs/windows/SecondaryWindow.html index 05402ab..37d0507 100644 --- a/docs/windows/SecondaryWindow.html +++ b/docs/windows/SecondaryWindow.html @@ -24,10 +24,10 @@ SecondaryWindow | Coho.UI, WPF Library documentation - + - - + + diff --git a/docs/windows/TabbedApplicationWindow.html b/docs/windows/TabbedApplicationWindow.html index 70c3e3a..61176da 100644 --- a/docs/windows/TabbedApplicationWindow.html +++ b/docs/windows/TabbedApplicationWindow.html @@ -24,10 +24,10 @@ TabbedApplicationWindow | Coho.UI, WPF Library documentation - + - - + +