{floatingContent}
diff --git a/src/Components/Menus/MainMenu.tsx b/src/Components/Menus/MainMenu.tsx
new file mode 100644
index 0000000..0933189
--- /dev/null
+++ b/src/Components/Menus/MainMenu.tsx
@@ -0,0 +1,16 @@
+import React from "react";
+import {classes} from "../../Utils";
+
+/**
+ * Main component of a main menu.
+ */
+export function MainMenu({children, className, ...props}: React.PropsWithChildren
>)
+{
+ return (
+
+
+
+ );
+}
diff --git a/src/Components/Menus/MainMenuItem.tsx b/src/Components/Menus/MainMenuItem.tsx
new file mode 100644
index 0000000..ef4c202
--- /dev/null
+++ b/src/Components/Menus/MainMenuItem.tsx
@@ -0,0 +1,35 @@
+import React from "react";
+import {classes, Modify} from "../../Utils";
+import {SubmenuFloat} from "./SubmenuFloat";
+
+export type MainMenuItemProperties = React.PropsWithChildren, {
+}>>;
+
+/**
+ * Main component of a main menu item.
+ */
+export const MainMenuItem = React.forwardRef(function SubmenuItem({children, ...props}: MainMenuItemProperties, ref)
+{
+ return (
+
+ {children}
+
+ );
+});
+
+/**
+ * A main menu item that open a submenu.
+ */
+export function MainMenuItemSubmenu({submenu, className, children, ...props}: Modify)
+{
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/Components/Menus/Submenu.tsx b/src/Components/Menus/Submenu.tsx
new file mode 100644
index 0000000..c2c2b19
--- /dev/null
+++ b/src/Components/Menus/Submenu.tsx
@@ -0,0 +1,14 @@
+import React from "react";
+import {classes} from "../../Utils";
+
+/**
+ * Main component of a submenu.
+ */
+export function Submenu({className, children, ...props}: React.PropsWithChildren>)
+{
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/Components/Menus/SubmenuFloat.tsx b/src/Components/Menus/SubmenuFloat.tsx
new file mode 100644
index 0000000..d00b58b
--- /dev/null
+++ b/src/Components/Menus/SubmenuFloat.tsx
@@ -0,0 +1,24 @@
+import React from "react";
+import {Float, FloatProperties} from "../Floating/Float";
+import {classes, Modify} from "../../Utils";
+
+/**
+ * Add a submenu which opens on click on the child.
+ */
+export function SubmenuFloat({submenu, className, mode, children, content, ...props}: Modify)
+{
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/Components/Menus/SubmenuItem.tsx b/src/Components/Menus/SubmenuItem.tsx
new file mode 100644
index 0000000..1a5dccb
--- /dev/null
+++ b/src/Components/Menus/SubmenuItem.tsx
@@ -0,0 +1,33 @@
+import React from "react";
+import {classes, Modify} from "../../Utils";
+import {SubmenuFloat} from "./SubmenuFloat";
+
+export type SubmenuItemProperties = React.PropsWithChildren, {
+}>>;
+
+/**
+ * Main component of a submenu item.
+ */
+export const SubmenuItem = React.forwardRef(function SubmenuItem({className, children, ...props}: SubmenuItemProperties, ref)
+{
+ return (
+ {children}
+ );
+});
+
+/**
+ * A submenu item that open a submenu.
+ */
+export function SubmenuItemSubmenu({submenu, className, children, ...props}: Modify)
+{
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/Components/Select/Suggestible.tsx b/src/Components/Select/Suggestible.tsx
index bd293ae..492abc0 100644
--- a/src/Components/Select/Suggestible.tsx
+++ b/src/Components/Select/Suggestible.tsx
@@ -16,7 +16,7 @@ export function Suggestible({className, suggestions, mode, content, role, childr
mode = mode ?? "focus";
return (
-
+
{children}
);
diff --git a/src/styles/_colors.less b/src/styles/_colors.less
index 1f9b7dd..c4653e5 100644
--- a/src/styles/_colors.less
+++ b/src/styles/_colors.less
@@ -35,6 +35,7 @@
@blue-darker: #0657C5; --blue-darker: @blue-darker;
@blue-background: #9DC8FF; --blue-background: @blue-background;
@blue-background-darker: #7EA9E1; --blue-background-darker: @blue-background-darker;
+ @blue-gradient: linear-gradient(33deg, @blue 0%, @blue-lighter 100%), @blue; --blue-gradient: @blue-gradient;
@orange-lighter: #E77220; --orange-lighter: @orange-lighter;
@orange: #D06112; --orange: @orange;
@@ -72,9 +73,16 @@
@primary: @blue; --primary: @primary;
@primary-darker: @blue-darker; --primary-darker: @primary-darker;
@primary-background: @blue-background; --primary-background: @primary-background;
+ @primary-background-darker: @blue-background-darker; --primary-background-darker: @primary-background-darker;
+ @primary-gradient: @blue-gradient; --primary-gradient: @primary-gradient;
@secondary-lighter: @orange-lighter; --secondary-lighter: @secondary-lighter;
@secondary: @orange; --secondary: @secondary;
@secondary-darker: @orange-darker; --secondary-darker: @secondary-darker;
@secondary-background: @orange-background; --secondary-background: @secondary-background;
+ @secondary-background-darker: @orange-background-darker; --secondary-background-darker: @secondary-background-darker;
+
+
+
+ @menu-hover: rgba(255, 255, 255, 0.15); --menu-hover: @menu-hover;
}
diff --git a/src/styles/_components.less b/src/styles/_components.less
index 3659dd5..d21d60e 100644
--- a/src/styles/_components.less
+++ b/src/styles/_components.less
@@ -8,6 +8,7 @@
@import "components/_link";
@import "components/_list";
@import "components/_loaders";
+@import "components/_menus";
@import "components/_select";
@import "components/_steps";
@import "components/_table";
diff --git a/src/styles/components/_menus.less b/src/styles/components/_menus.less
new file mode 100644
index 0000000..3bc0861
--- /dev/null
+++ b/src/styles/components/_menus.less
@@ -0,0 +1,2 @@
+@import "menus/_main-menu";
+@import "menus/_submenu";
diff --git a/src/styles/components/menus/_main-menu.less b/src/styles/components/menus/_main-menu.less
new file mode 100644
index 0000000..ffe1217
--- /dev/null
+++ b/src/styles/components/menus/_main-menu.less
@@ -0,0 +1,74 @@
+nav.main.menu
+{
+ background: var(--primary-gradient);
+ color: var(--background);
+
+ .floating
+ {
+ justify-content: flex-start;
+ }
+ .floating[data-placement="left-start"]
+ {
+ justify-content: flex-end;
+ }
+
+ > ul
+ {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+
+ margin: 0;
+ padding: 0;
+
+ list-style: none;
+
+ > li
+ {
+ margin: 0;
+ padding: 0;
+
+ > a
+ {
+ transition: background 0.2s ease;
+ display: block;
+
+ padding: 0.75em 1em;
+
+ background: transparent;
+ color: var(--background);
+
+ text-align: center;
+ text-decoration: none;
+ cursor: pointer;
+
+ &:hover
+ {
+ background: var(--menu-hover);
+ }
+ }
+ }
+ }
+
+
+ .submenu.card
+ {
+ box-shadow: 0 0 0.15em 0 var(--foreground-shadow);
+ border: none;
+ background: var(--primary-gradient);
+
+ .submenu
+ {
+ > .item
+ {
+ color: var(--background);
+
+ &:hover
+ {
+ background: var(--menu-hover);
+ }
+ }
+ }
+ }
+}
diff --git a/src/styles/components/menus/_submenu.less b/src/styles/components/menus/_submenu.less
new file mode 100644
index 0000000..166aee1
--- /dev/null
+++ b/src/styles/components/menus/_submenu.less
@@ -0,0 +1,37 @@
+.submenu.card
+{
+ margin: -1px!important;
+ padding: 0;
+
+ .floating
+ {
+ justify-content: flex-start;
+ }
+ .floating[data-placement="left-start"]
+ {
+ justify-content: flex-end;
+ }
+
+ .submenu
+ {
+ display: flex;
+ flex-direction: column;
+
+ > .item
+ {
+ transition: background 0.2s ease;
+
+ padding: 0.75em;
+
+ color: var(--foreground);
+
+ text-decoration: none;
+ cursor: pointer;
+
+ &:hover
+ {
+ background: var(--background-darker);
+ }
+ }
+ }
+}