diff --git a/api.html b/api.html index e13ab4e..6ab730c 100644 --- a/api.html +++ b/api.html @@ -6,45 +6,46 @@
- The mumax3 input syntax is a subset of Go's syntax, somewhat similar to C. It is case-independent however, so msat is the same as Msat or MSAT.
+ The mumax3 input syntax is a subset of Go's syntax, somewhat similar to C. It is case-independent however, somsat
is the same as Msat
or MSAT
.
pow(x,y)
should be used.
x := pi*(3+4)/5
x = pow(x, 3)
@@ -117,7 +124,7 @@ Control structures
Implicit functions
- Some of the API features accept a function as argument (e.g.: RunWhile(func()bool)
, or all input parameters). In that case, and only in this case, the argument is implicitly converted to a function, which is re-evaluated each time it's needed. E.g.:
+ Some of the API features accept a function as argument (e.g.: RunWhile(func()bool)
, or all input parameters). In that case, and only in this case, the argument is implicitly converted to a function, which is re-evaluated each time it's needed. E.g.:
value := sin(pi*t) // value is a float64, RHS evaluated only once
Msat = value // time-independent Msat
@@ -128,8 +135,8 @@ Implicit functions
Methods
- Some of the API instances have methods defined on them. You can call methods on an instance by using '.' as in most object oriented programming languages.
- E.g.: a material parameter such as Msat
has the method SetRegion(int, float)
to set the value of the material parameter in a certain region:
+ Some of the API instances have methods defined on them. You can call methods on an instance by using '.
' as in most object oriented programming languages.
+ E.g.: a material parameter such as Msat
has the method SetRegion(int, float)
to set the value of the material parameter in a certain region:
Msat.SetRegion(1, 800e3) // Set Msat=520e3 in region 1
@@ -167,8 +174,8 @@ Resizing the mesh
Setting the geometry
- Optionally a magnet Shape other than the full simulation box can be specified. In order to set the geometry, you first need to define a shape.
- geometryShape := cylinder(400e-9, 20e-9).RotX(45*pi/180).Transl(1e-6,0,0)
+ Optionally a magnet Shape
other than the full simulation box can be specified. In order to set the geometry, you first need to define a shape.
+geometryShape := cylinder(400e-9, 20e-9).RotX(45*pi/180).Transl(1e-6,0,0)
SetGeom(geometryShape)
@@ -344,7 +351,7 @@ Shapes
A shape is an abstract object which outlines an area in a 3D universe. Shapes are useful for different tasks, e.g.: to define the geometry of a magnet, to define material regions, or to set locally a specific initial magnetization configuration.
One can specify primitive shapes, constructed at the origin (box center), and translate/rotate them if needed. All positions are specified in meters and the origin lies in the center of the simulation box. E.g.:
-myShape := cylinder(400e-9, 20e-9).RotX(45*pi/180).Transl(1e-6,0,0))
+myShape := cylinder(400e-9, 20e-9).RotX(45*pi/180).Transl(1e-6,0,0)
anotherShape := Circle(400e-9).sub(Circle(200e-9))
@@ -805,7 +812,7 @@ Material regions
Initial magnetization
- The initial magnetization is set by assigning a Config
to m, setting it in separate regions, or by loading a file directly.
+ The initial magnetization is set by assigning a Config
to m
, setting it in separate regions, or by loading a file directly.
m = uniform(1, 0, 0)
m.SetRegion(1, vortex(1, 1))
m.LoadFile("config.ovf")
@@ -1619,7 +1626,7 @@ Excitation
B_ext = vector(0.01, 1e-6*sin(2*pi*f*t), 0)
B_ext.SetRegion(1, vector(0, 0, 0.1))
- Additionally, an arbitrary number of time- and space-dependent vector fields of the form g(x,y,z) * f(t)
may be added. (E.g., to simulate the field of an antenna or an arbitrary current running through the magnet)
+ Additionally, an arbitrary number of time- and space-dependent vector fields of the form g(x,y,z) * f(t)
may be added. (E.g., to simulate the field of an antenna or an arbitrary current running through the magnet)
B_ext.Add(LoadFile("antenna.ovf"), sin(2*pi*f*t))
J.Add(LoadFile("current.ovf"), 1)
@@ -1961,9 +1968,11 @@ Slonczewski model
Magnetic Force Microscopy
- Mumax3 has built-in generation of MFM images from a 2D magnetization. The MFM tip lift can be freely chosen. By default the tip magnetization is modeled as a point monopole at the apex. This is sufficient for most situations. Nevertheless, it is also possible to model partially magnetized tips by setting MFMDipole to the magnetized portion of the tip, in meters. E.g., if only the first 20nm of the tip is (vertically) magnetized, set MFMDipole=20e-9.
+ mumax3 has built-in generation of MFM images from a 2D magnetization. The MFM tip lift can be freely chosen. By default, the tip magnetization is modeled as a point monopole at the apex. This is sufficient for most situations. Nevertheless, it is also possible to model partially magnetized tips by setting MFMDipole
to the magnetized portion of the tip, in meters. E.g., if only the first 20nm of the tip is (vertically) magnetized, set MFMDipole=20e-9
.
+
+
@@ -2023,13 +2032,23 @@ Magnetic Force Microscopy
Output quantities
- The quantities listed below can be output. Also, derived quantities can be produced: the quantity restricted to a certain region or a single component. E.g.:
+ The quantities listed below can be output.
+ Also, derived quantities can be produced: the quantity restricted to a certain region or a single component. E.g.:
m // magnetization quantity
m.Comp(0) // x-component
m.Region(1) // magnetization in region 1 (0 elsewhere)
-
+
+ Averaging behavior
+ .Average()
yields the average over the entire simulation grid, except for m
which is always averaged over the geometry.
+ For vector quantities, an average over the magnet geometry can still be obtained with the .Comp()
method. E.g.:
+
+B_demag.Average() // Average vector over entire simulation grid
+B_demag.Comp(1).Average() // Average y-component over geometry
+m.Average() // Average magnetization over geometry
+
+
@@ -2509,6 +2528,54 @@ Output quantities
+
+
+
+
+ m
+
Reduced magnetization (unit length)
+
+
+ methods:
+ Average( ) Buffer( ) Comp( int ) EvalTo( Slice ) GetCell( int int int ) LoadFile( string ) Quantity( ) Region( int ) Set( Config ) SetArray( Slice ) SetCell( int int int data.Vector ) SetInShape( Shape Config ) SetRegion( int Config )
+
+
+
+ examples:
+
+ [1]
+
+ [2]
+
+ [3]
+
+ [4]
+
+ [5]
+
+ [6]
+
+ [7]
+
+ [8]
+
+ [9]
+
+ [10]
+
+ [11]
+
+ [12]
+
+ [13]
+
+ [14]
+
+ [15]
+
+
+
+
@@ -2662,7 +2729,7 @@ Output quantities
Slicing and dicing output
- To save storage space, it's possible to save only the part of the output we're interested in. This works on all output quantities (not only m)
+ To save storage space, it's possible to save only the part of the output we're interested in. This works on all output quantities (not only m
).
save(m) // save full magnetization
@@ -2792,7 +2859,7 @@ Slicing and dicing output
Scheduling output
- All input and output quantities (as described above) can be saved in a space-dependent way (".ovf" file), or as spatial averages (table output). The data table ("table.txt") contains by default the time and average magnetization. More columns can be added with TableAdd()
.
+ All input and output quantities (as described above) can be saved in a space-dependent way (.ovf
file), or as spatial averages (table output). The data table (table.txt
) contains by default the time and average magnetization. More columns can be added with TableAdd()
.
save(B_ext)
tableadd(B_ext)
@@ -3173,7 +3240,7 @@ Scheduling output
Running
- Run(time)
runs the simulation for a given time in seconds, using sensible error settings.
+ Run(time)
runs the simulation for a given time in seconds, using sensible error settings.
Run(1e-9)
More fine-grained control is provided by RunWhile(condition)
, which runs as long as an arbitrary condition is met. E.g.:
@@ -3186,7 +3253,7 @@ Running
MaxErr = 1e-6
- Optionally, a different solver may be chosen (at any point) with SetSolver(int)
. Currently available solver types:
+ Optionally, a different solver may be chosen (at any point) with SetSolver(int)
. Currently available solver types:
-
6
: RK56 (Fehlberg) solver. This is the highest order solver available, but which is typically not faster than the RK45 solver.
-
5
: RK45 (Dormand-Prince) solver (the default). An accurate solver, very fast for magnetization dynamics at the cost of some memory usage.
@@ -3525,7 +3592,7 @@ Minimize
SetSolver(int)
-
Set solver type. 1:Euler, 2:Heun, 3:Bogaki-Shampine, 4: Runge-Kutta (RK45), 5: Dormand-Prince, 6: Fehlberg, -1: Backward Euler
+ Set solver type. 1:Euler, 2:Heun, 3:Bogaki-Shampine, 4: Runge-Kutta (RK4), 5: Dormand-Prince, 6: Fehlberg, -1: Backward Euler
@@ -3544,7 +3611,7 @@ Minimize
Moving simulation window
- Mumax3 can automatically shift the magnetization so that the simulation "window" stays centered on a region of interest. Shifting is done to keep a freely chosen magnetization component nearly zero. E.g.
+ mumax3 can automatically shift the magnetization so that the simulation "window" stays centered on a region of interest. Shifting is done to keep a freely chosen magnetization component nearly zero. E.g.
ext_centerwall(0)
ext_rmSurfaceCharge(0, -1, 1)
@@ -4304,7 +4371,7 @@ Custom quantities
Custom effective field terms
It is possible to define additional effective field terms by promoting a custom quantity to an effective field term.
The corresponding energy density term can also be added by promoting a custom quantity.
- E.g.: instead of using the existing anistropy field in mumax3, you could define the uniaxial anisotropy field
+ E.g.: instead of using the existing anistropy field in mumax3, you could define the uniaxial anisotropy field
(and the corresponding energy density) yourselves:
@@ -10330,7 +10397,23 @@ Misc
document.getElementById("searchInput").value = "";
document.getElementById("searchInput").click();
document.getElementById("searchInput").focus();
- }
+ }
+
+ document.addEventListener("DOMContentLoaded", () => {
+ const toTop = document.getElementById("api-to-top");
+
+ window.addEventListener('scroll', function(e){
+ var buttonTop = toTop.getBoundingClientRect().top;
+ var visible = toTop.classList.contains("visible")
+ console.log(buttonTop, visible)
+ if (buttonTop <= 0 && !visible) {
+ toTop.classList.add("visible");
+ }
+ else if (buttonTop > 0 && visible) {
+ toTop.classList.remove("visible")
+ }
+ });
+ });
diff --git a/download.html b/download.html
index e158fbd..8127936 100644
--- a/download.html
+++ b/download.html
@@ -4,39 +4,40 @@
mumax3
+
-
+
-
-
+
+
-mumax3
- GPU-accelerated micromagnetism
+ mumax3
+ GPU-accelerated micromagnetism
Home
Download
Examples
+ Tutorial
API
Forum
-
+
-
+
Prerequisites
diff --git a/examples.html b/examples.html
index abdfa00..fb8b82f 100644
--- a/examples.html
+++ b/examples.html
@@ -3,42 +3,46 @@
mumax3
+
-
+
+
-mumax3
- GPU-accelerated micromagnetism
+ mumax3
+ GPU-accelerated micromagnetism
Home
Download
Examples
+ Tutorial
API
Forum
-
+
-
+
mumax 3.10 examples
-These are example input scripts, the full API can be found here.
+
+ These are example input scripts, the full API can be found here.
+ A more in-depth tutorial with video recordings can be found here.
+
mumax3 input files are run with the command
@@ -47,7 +51,26 @@ mumax 3.10 examples
Output is automatically stored in the "myfile.out" directory. Additionally, a web interface provides live output. Default is http://localhost:35367
.
For more details, run mumax3 -help
which will show the available command-line flags (e.g. to select a certain GPU).
-
Getting started with Standard Problem #4
+
+
+
+
+
+
+
+Getting started with Standard Problem #4
Let's start with the classic mumag standard problem 4, as defined here.
@@ -107,7 +130,7 @@ output
-
Standard Problem #2
+
Standard Problem #2
Using the scripting language explained above, relatively complex input files can be easily defined. E.g. micromagnetic standard problem #2 specifies the simulation size in exchange lengths. The script below calculates the exchange length and chooses cells not larger than 0.75 exchange lengths so that the number of cells is a power of two (for best performance).
@@ -146,7 +169,7 @@ output
-
Hysteresis
+
Hysteresis
Below is an example of a hysteresis loop where we step the applied field in small increments and find the magnetization ground state after each step. Minimize() finds the ground state using the conjugate gradient method, which is very fast. However, this method might fail on very high energy initial states like a random magnetization. In that case, Relax() is more robust (albeit much slower).
@@ -192,7 +215,7 @@ output
-
Geometry
+
Geometry
mumax3 has powerful API to programatically define geometries. A number of primitive shapes are defined, like ellipses, rectangles, etc. They can be transformed (rotated, translated) and combined using boolean logic (add, sub, inverse). All positions are specified in meters and the origin lies in the center of the simulation box. See the full API.
@@ -323,7 +346,7 @@ output
Note: these are 3D geometries seen from above. The displayed cell filling is averaged along the thickness (notable in ellipse and layers example). Black means empty space, white is filled.
-
Initial Magnetization
+
Initial Magnetization
Some initial magnetization functions are provided, as well as transformations similar to those on Shapes. See the Config API.
setgridsize(256, 128, 1)
@@ -430,7 +453,7 @@ output
The magnetization can also be set in separate regions, see below.
-
Interlude: Rotating Cheese
+
Interlude: Rotating Cheese
In this example we define a geometry that looks like a slice of cheese and have it rotate in time.
@@ -479,7 +502,7 @@ output
-
Regions: Space-dependent Parameters
+
Regions: Space-dependent Parameters
Space-dependent parameters are defined using material regions. Regions are numbered 0-255 and represent different materials. Each cell can belong to only one region. At the start of a simulation all cells have region number 0.
@@ -551,7 +574,7 @@ output
-
Slicing and dicing output
+
Slicing and dicing output
The example below illustrates how to save only the part of the output you're interested in.
@@ -597,7 +620,7 @@ output
-
Magnetic Force Microscopy
+
Magnetic Force Microscopy
Mumax3 has built-in generation of MFM images from the magnetization. The MFM tip lift can be freely chosen. By default the tip magnetization is modeled as a point monopole at the apex. This is sufficient for most situations. Nevertheless, it is also possible to model partially magnetized tips by setting MFMDipole to the magnetized portion of the tip, in meters. E.g., if only the first 20nm of the tip is (vertically) magnetized, set MFMDipole=20e-9.
@@ -640,7 +663,7 @@ output
-
PMA Racetrack
+
PMA Racetrack
In this example we drive a domain wall in PMA material by spin-transfer torque. We set up a post-step function that makes the simulation box "follow" the domain wall. Like this, only a small number of cells is needed to simulate an infinitely long magnetic wire.
setGridSize(128, 128, 1)
@@ -696,7 +719,7 @@ output
Since we center on the domain wall we can not see that it is actually moving, but the domain wall breakdown is visible.
-
Py Racetrack
+
Py Racetrack
In this example we drive a vortex wall in Permalloy by spin-transfer torque. The simulation box "follows" the domain wall. By removing surface charges at the left and right ends, we mimic an infintely long wire.
@@ -789,7 +812,7 @@ output
Since we center on the domain wall we can not really see the motion, despite the vortex wall moving pretty fast. Note the absence of closure domains at the edges due to the surface charges being removed there.
-
Voronoi tessellation
+
Voronoi tessellation
In this example we use regions to specify grains in a material. The built-in extension ext_makegrains
is used to define grain-like regions using Voronoi tessellation. We vary the material parameters in each grain.
@@ -872,7 +895,7 @@ output
-
RKKY
+
RKKY
Scaling the exchange coupling between regions can be used to obtain antiferromagnetic coupling like the RKKY interaction. In that case we only model the magnetic layers and do not explicitly add a spacer layer (which is negligibly thin). We scale the exchange coupling to get the desired RKKY strength: scale = (RKKY * cellsize_z) / (2 * Aex)
.
@@ -913,7 +936,7 @@ output
-
Slonczewski STT
+
Slonczewski STT
Example of a spin-torque MRAM stack consisting of a fixed layer, spacer and free layer. Only the free layer magnetization is explicitly modeled, so we use a 2D grid. The fixed layer polarization is set with FixedLayer = ...
, which can be space-dependent. The spacer layer properties are modeled by setting the parameters Lambda
and EpsilonPrime
. Finally Pol
sets the current polarization and J
the current density, which should be along z in this case.
@@ -1010,7 +1033,7 @@ output
-
Spinning hard disk
+
Spinning hard disk
Using the Shift
function, we can shift the system (magnetization, regions and geometry) by a given number of cells. Here we use this feature to simulate a moving hard disk platter. A time-dependent gaussian field profile mimics the write field.
diff --git a/gpus.svg b/gpus.svg
index 54cb80d..97f289d 100644
--- a/gpus.svg
+++ b/gpus.svg
@@ -1,1138 +1,431 @@
-
-
\ No newline at end of file
+
+
+
+
diff --git a/header.html b/header.html
index 4fe4236..e1a4fda 100644
--- a/header.html
+++ b/header.html
@@ -3,36 +3,37 @@
mumax3
+
-
+
+
-mumax3
- GPU-accelerated micromagnetism
+ mumax3
+ GPU-accelerated micromagnetism
Home
Download
Examples
+ Tutorial
API
Forum
-
+
-
+
diff --git a/header.js b/header.js
new file mode 100644
index 0000000..6417ad0
--- /dev/null
+++ b/header.js
@@ -0,0 +1,17 @@
+function mod(n, m) {
+ return ((n % m) + m) % m
+}
+
+function xmas() { // Show xmas icon from Christmas eve until the first weekend starts after Jan 4th
+ var now = new Date();
+ var year = now.getFullYear();
+ var xmasBegin = new Date(year, 11, 24); // December 24th 0:00:00, so day of Christmas eve
+ var xmasEnd = new Date(year, 0, 5); // January 5th 0:00:00, earliest moment to end xmas
+ var xmasEnd = new Date(year, 0, xmasEnd.getDate() + mod(6 - xmasEnd.getDay(), 7)); // Weekend after xmasEnd (Fri/sat midnight)
+ var its_xmas = now >= xmasBegin || now <= xmasEnd;
+ var xmas_img_file = its_xmas ? "nimble-cubes128-xmas.png" : "nimble-cubes128.png";
+ document.getElementById("header_img").setAttribute("src", xmas_img_file);
+ document.querySelector("link[rel~='icon']").href = xmas_img_file;
+}
+xmas()
+setInterval(xmas, 5 * 60 * 1000) // Repeat every 5 minutes to update icon if page is left open
\ No newline at end of file
diff --git a/index.html b/index.html
index f45cebc..295f1d3 100644
--- a/index.html
+++ b/index.html
@@ -4,135 +4,136 @@
mumax3
+
-
+
-
-
+
+
-mumax3
- GPU-accelerated micromagnetism
+ mumax3
+ GPU-accelerated micromagnetism
Home
Download
Examples
+ Tutorial
API
Forum
-
-
-
-
-
-
- mumax3 is a GPU-accelerated micromagnetic simulation program developed and maintained at the DyNaMat group at Ghent University.
-
-
- A speed-up of the order of 100x compared to CPU-based simulations can easily be reached, even with relatively inexpensive gaming GPUs. Additionally, the software is optimized for low memory use and can handle about 16 million FD cells with 2GB of GPU RAM.
-
- Citations and licence
- If you use mumax in any work or publication, we kindly ask you to cite the references suggested for your specific simulation in the terminal window and in the "references.bib" file found in the outputfolder.
- mumax3 is open-source software. You are free to modify and distribute the source code under the GPLv3 licence.
-
-
-
-
-
-
-
- Features
-
- - Landau-Lifshitz micromagnetic formalism
- - Magnetostatic field
- - Heisenberg exchange
- - Arbitrary inter-region exchange like RKKY coupling
- - Dzyaloshinskii-Moriya interaction
- - Spin-transfer torque (Zhang-Li and Slonczewski)
- - Uniaxial and cubic magnetocrystalline anisotropy
- - Thermal fluctuations (Brown)
- - Voronoi tessellation
- - Time- and space dependent material parameters
- - Arbitrary complex excitation (field, current)
- - Simulation window can automatically follow a moving domain wall
- - Edge charges can be removed to simulate an infinitely long geometry
- - Optional 1D, 2D or 3D periodic boundary conditions
-
-
-
-
-
-
-
- web GUI
- mumax3 includes a browser-based user interface that lets you follow a running simulation or modify it on-the-fly, be it on your local machine or remotely.
-
- simple scripting
- mumax3 provides simple yet powerful input scripting. E.g., the example applies a time-dependent external field to a uniform magnet (FMR experiment).
-
-
-setgridsize(128, 32, 4)
-setcellsize(5e-9, 5e-9, 5e-9)
-Msat = 860e3
-Aex = 13e-12
-alpha= 0.2
-m=uniform(1, 1, 0)
+
+
+
+
+
+
+ mumax3 is a GPU-accelerated micromagnetic simulation program developed and maintained at the DyNaMat group at Ghent University.
+
+
+ A speed-up of the order of 100x compared to CPU-based simulations can easily be reached, even with relatively inexpensive gaming GPUs. Additionally, the software is optimized for low memory use and can handle about 16 million FD cells with 2GB of GPU RAM.
+
+ Citations and licence
+ If you use mumax3 in any work or publication, we kindly ask you to cite the references suggested for your specific simulation in the terminal window and in the "references.bib" file found in the outputfolder.
+ mumax3 is open-source software. You are free to modify and distribute the source code under the GPLv3 licence.
+
+
+
+
+
+
+
+ Features
+
+ - Landau-Lifshitz micromagnetic formalism
+ - Magnetostatic field
+ - Heisenberg exchange
+ - Arbitrary inter-region exchange like RKKY coupling
+ - Dzyaloshinskii-Moriya interaction
+ - Spin-transfer torque (Zhang-Li and Slonczewski)
+ - Uniaxial and cubic magnetocrystalline anisotropy
+ - Thermal fluctuations (Brown)
+ - Voronoi tessellation
+ - Time- and space-dependent material parameters
+ - Arbitrary complex excitation (field, current)
+ - Simulation window can automatically follow a moving domain wall
+ - Edge charges can be removed to simulate an infinitely long geometry
+ - Optional 1D, 2D or 3D periodic boundary conditions
+
+
+
+
+
+
+
+ Web GUI
+ mumax3 includes a browser-based user interface that lets you follow a running simulation or modify it on-the-fly, be it on your local machine or remotely.
+
+ Simple scripting
+ mumax3 provides simple yet powerful input scripting.
E.g., the following example applies a time-dependent external field to a uniform magnet (FMR experiment).
+
+ SetGridSize(128, 32, 4)
+SetCellSize(5e-9, 5e-9, 5e-9)
+Msat = 860e3
+Aex = 13e-12
+alpha = 0.2
+m = Uniform(1, 1, 0)
f := 1e9 // 1GHz
A := 0.01 // 10mT
-B_ext = vector(0.1, A*sin(2*pi*f*t), 0)
+B_ext = Vector(0.1, A*sin(2*pi*f*t), 0)
run(10e-9)
-
+
-
-
-
-
+
+
+
+
-
+
- GPU/driver requirements
- Mumax3 is cross-platform and runs on Linux, Windows and Mac platforms. You need an nVIDIA GPU with compute capability 2.0 or higher, as listed here.
- You also need to use nVIDIA's proprietary graphics driver, which may already be installed on your system. The benchmark below may guide your GPU choice.
-
-
-
+ GPU/driver requirements
+ mumax3 is cross-platform and runs on Linux, Windows and Mac platforms. You need an NVIDIA GPU with compute capability 5.0 or higher, as listed here.
+ You also need to use NVIDIA's proprietary graphics driver, which may already be installed on your system. The benchmark below may guide your GPU choice.
+
+
-
-
+
+
+
-
+
+
\ No newline at end of file
diff --git a/style.css b/style.css
index f9e7d06..1a6327f 100644
--- a/style.css
+++ b/style.css
@@ -67,6 +67,16 @@ figcaption {
color: #555555
}
+#header_img:hover {
+ transform:scale(1.05);
+}
+
+select {
+ font-family: monospace;
+ white-space: pre;
+ font-size: 1.2em;
+}
+
.api-section-link {
padding-top: 0.2ex;
padding-bottom: 0.2ex;
@@ -88,6 +98,30 @@ figcaption {
margin: 0px;
}
+#api-to-top {
+ margin-bottom: auto;
+ position: sticky;
+ top: 0; /* Sticks to the top of the viewport when scrolling */
+ background-color: #fff;
+ padding: 10px;
+ text-align: center;
+ cursor: pointer;
+ opacity: 0;
+ border-radius: 0 0 10px 10px;
+ transition: opacity 0.3s ease-in-out;
+}
+
+#api-to-top.visible {
+ opacity: 1;
+}
+
+.api-to-top-arrow {
+ font-size: 20px; /* Make the arrow slightly larger than text */
+ line-height: 1;
+ vertical-align: middle;
+ margin: 0 5px; /* Add spacing around the arrow */
+}
+
.api-content {
float: left;
flex: 1;