From ed989110adcff54f4d8ec3d7547168e2cb5fe427 Mon Sep 17 00:00:00 2001 From: Prozilla Date: Wed, 17 Jul 2024 17:34:43 +0200 Subject: [PATCH] Docs: Added content + updated formatting --- packages/docs/.vitepress/config.ts | 17 +- packages/docs/.vitepress/theme/style.css | 51 +++++- .../docs/src/public/assets/file-icons.png | Bin 0 -> 21813 bytes .../docs/src/public/assets/folder-icons.png | Bin 0 -> 22029 bytes .../docs/src/reference/classes/apps/app.md | 72 ++++----- .../docs/src/reference/classes/skins/skin.md | 53 ++++--- .../reference/classes/system/apps-config.md | 4 +- .../classes/system/desktop-config.md | 14 +- .../reference/classes/system/misc-config.md | 4 +- .../reference/classes/system/modals-config.md | 8 +- .../classes/system/taskbar-config.md | 4 +- .../classes/system/tracking-config.md | 8 +- .../classes/system/windows-config.md | 12 +- .../src/reference/classes/utils/vector2.md | 72 +++++++-- packages/docs/src/reference/configuration.md | 8 + .../docs/src/reference/constants/index.md | 54 +++++++ .../docs/src/reference/functions/array.md | 57 +++++++ .../docs/src/reference/functions/browser.md | 146 ++++++++++++++++++ packages/docs/src/reference/functions/date.md | 50 ++++++ packages/docs/src/reference/functions/math.md | 62 ++++++++ 20 files changed, 591 insertions(+), 105 deletions(-) create mode 100644 packages/docs/src/public/assets/file-icons.png create mode 100644 packages/docs/src/public/assets/folder-icons.png create mode 100644 packages/docs/src/reference/constants/index.md create mode 100644 packages/docs/src/reference/functions/array.md create mode 100644 packages/docs/src/reference/functions/browser.md create mode 100644 packages/docs/src/reference/functions/date.md create mode 100644 packages/docs/src/reference/functions/math.md diff --git a/packages/docs/.vitepress/config.ts b/packages/docs/.vitepress/config.ts index 94a6121..26da00c 100644 --- a/packages/docs/.vitepress/config.ts +++ b/packages/docs/.vitepress/config.ts @@ -115,7 +115,22 @@ export default defineConfig({ ] }, ] - } + }, + { + text: "Functions", + base: "/reference/functions/", + collapsed: false, + items: [ + { text: "Array", link: "/array" }, + { text: "Browser", link: "/browser" }, + { text: "Date", link: "/date" }, + { text: "Math", link: "/math" }, + ] + }, + { + text: "Constants", + link: "constants" + }, ] }, }, diff --git a/packages/docs/.vitepress/theme/style.css b/packages/docs/.vitepress/theme/style.css index b47e040..20cb597 100644 --- a/packages/docs/.vitepress/theme/style.css +++ b/packages/docs/.vitepress/theme/style.css @@ -104,6 +104,7 @@ :root { --vp-font-family-base: "Outfit", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; --vp-font-family-mono: "Roboto Mono", source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; + --vp-custom-block-font-size: 16px; } /** @@ -256,8 +257,8 @@ --vp-custom-block-details-border: transparent; --vp-custom-block-details-text: var(--vp-c-text-1); - --vp-custom-block-details-bg: var(--vp-c-default-1); - --vp-custom-block-details-code-bg: var(--vp-c-default-1); + --vp-custom-block-details-bg: var(--vp-c-bg-alt); + --vp-custom-block-details-code-bg: var(--vp-c-bg); } /** @@ -273,6 +274,8 @@ * -------------------------------------------------------------------------- */ .custom-block { + --vp-code-block-bg: var(--vp-c-bg); + border: none; border-left: 5px solid; padding: 12px 12px 6px; @@ -314,12 +317,45 @@ --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480H40c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24V296c0 13.3 10.7 24 24 24s24-10.7 24-24V184c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z'/%3E%3C/svg%3E") } -.custom-block ul { - margin: 8px 0; +.custom-block.details { + padding: 0; +} + +.custom-block.details > summary { + padding: 12px; + margin: 0; + color: var(--vp-c-text-2); + font-weight: 400; +} + +.custom-block.details > summary ~ * { + margin-left: 12px !important; + margin-right: 12px !important; +} + +.custom-block.details > *:nth-child(2) { + margin-top: 0; +} + +.custom-block.details > *:last-child { + margin-bottom: 0; +} + +.custom-block.details[open] { + padding-bottom: 16px; +} + +.custom-block ul ul { + margin: 0 !important; } .custom-block li + li { - margin-top: 4px; + margin-top: 4px !important; +} + +li > p { + margin: 0 !important; + line-height: 24px !important; } .VPContent.is-home .vp-doc { @@ -347,4 +383,9 @@ .vp-doc .VPTeamMembers.medium.count-1.center .container { max-width: 368px !important; +} + +.vp-doc img { + border-radius: 8px; + margin: 16px 0; } \ No newline at end of file diff --git a/packages/docs/src/public/assets/file-icons.png b/packages/docs/src/public/assets/file-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..9578317f9a1ab9736c707f71d42beb4af9d88fac GIT binary patch literal 21813 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 [!WARNING] > Every app must have a unique ID that only contains lower case letters (a-z), numbers (0-9) and dashes (-). ### windowContent -- **Type:** `React.FC` - React component that renders this app inside a window when the app is running +- **Type:** `React.FC` + ### windowOptions -- **Type:** `WindowOptions` - Default options that get passed to the `windowContent` component +- **Type:** `WindowOptions` + ```ts interface WindowOptions { size?: Vector2; @@ -92,120 +92,120 @@ interface WindowOptions { ### description -- **Type:** `string | null` - Description of this application +- **Type:** `string | null` + ### iconUrl -- **Type:** `string | null` - URL of the icon of this application +- **Type:** `string | null` + ### role -- **Type:** `string | null` - Defines what parts of the OS this app is responsible for and how it can be used by other apps +- **Type:** `string | null` + ### associatedExtensions -- **Type:** `string | null` - An array of file extensions that this application is used to open and read +- **Type:** `string | null` + ### pinnedByDefault +Determines whether the app is pinned by default + - **Type:** `boolean` - **Default:** `true` -Determines whether the app is pinned by default - ### launchAtStartup +Determines whether the app is launched at startup + - **Type:** `boolean` - **Default:** `false` -Determines whether the app is launched at startup - ## Methods ### setName(name) +Set the display name of this application + - **Parameters** - **name** - **Type:** `string` - **Returns** - **Type:** `this` -Set the display name of this application - ### setDescription(description) +Set the description of this application + - **Parameters** - **description** - **Type:** `string` - **Returns** - **Type:** `this` -Set the description of this application - ### setIconUrl(iconUrl) +Set the URL of the icon of this application + - **Parameters** - **iconUrl** - **Type:** `string | null` - **Returns** - **Type:** `this` -Set the URL of the icon of this application - ### setRole(role) +Set the role of this application + - **Parameters** - **role** - **Type:** `string | null` - **Returns** - **Type:** `this` -Set the role of this application - ### setAssociatedExtensions(extensions) +Set the associated extensions of this application + - **Parameters** - **extensions** - **Type:** `string[] | null` - **Returns** - **Type:** `this` -Set the associated extensions of this application - ### setPinnedByDefault(pinnedByDefault) +Changes whether this application is pinned by default or not + - **Parameters** - **pinnedByDefault** - **Type:** `boolean` - **Returns** - **Type:** `this` -Changes whether this application is pinned by default or not - ### setLaunchAtStartup(launchAtStartup) +Changes whether this application is launched at startup or not + - **Parameters** - **launchAtStartup** - **Type:** `boolean` - **Returns** - **Type:** `this` -Changes whether this application is launched at startup or not - ### WindowContent(props) +Renders the app as a React component + - **Parameters** - **props** - **Type:** `AppProps` - **Returns** - **Type:** `React.ReactElement` - -Renders the app as a React component \ No newline at end of file diff --git a/packages/docs/src/reference/classes/skins/skin.md b/packages/docs/src/reference/classes/skins/skin.md index ad3599a..0eb25e4 100644 --- a/packages/docs/src/reference/classes/skins/skin.md +++ b/packages/docs/src/reference/classes/skins/skin.md @@ -23,8 +23,8 @@ package: "@prozilla-os/skins" ```ts interface SkinOptions { - appIcons?: { [key: string]: string }; - appNames?: { [key: string]: string }; + appIcons?: Record; + appNames?: Record; wallpapers: string[]; defaultWallpaper: string; fileIcons: { @@ -47,38 +47,36 @@ interface SkinOptions { ### appIcons -- **Type:** `{ [key: string]: string }` - Replacements for app icons based on app id +- **Type:** `{ [key: string]: string }` + ### appNames -- **Type:** `{ [key: string]: string }` - Replacements for app names based on app id +- **Type:** `{ [key: string]: string }` + ### wallpapers -- **Type:** `string[]` - Array of URLs of wallpaper images +- **Type:** `string[]` + ### defaultWallpaper +URL of default wallpaper image + - **Type:** `string` - **Default:** `"https://os.prozilla.dev/assets/wallpapers/vibrant-wallpaper-blue-purple-red.png"` - - Preview: - - ![Default wallpaper](https://os.prozilla.dev/assets/wallpapers/vibrant-wallpaper-blue-purple-red.png) - -URL of default wallpaper image + ![Default wallpaper](https://os.prozilla.dev/assets/wallpapers/vibrant-wallpaper-blue-purple-red.png) ### fileIcons -- **Type:** `FileIcons` - URLs of icons for types of files +- **Type:** `FileIcons` + ```ts interface FileIcons { generic: string; @@ -88,12 +86,16 @@ interface FileIcons { } ``` +#### Default + +![Default file icons](/assets/file-icons.png) + ### folderIcons -- **Type:** `FolderIcons` - URLs of icons for types of folders +- **Type:** `FolderIcons` + ```ts interface FolderIcons { generic: string; @@ -103,12 +105,15 @@ interface FolderIcons { } ``` -### loadStyleSheet +#### Default -- **Type:** `() => void` +![Default folder icons](/assets/folder-icons.png) + +### loadStyleSheet Function that dynamically imports style sheet +- **Type:** `() => void` - **Example** ```ts @@ -116,3 +121,13 @@ Function that dynamically imports style sheet import("../styles/skins/macOs.css"); } ``` + +## Instances + +### macOsSkin + +A skin inspired by the macOS interface + +### minimalSkin + +A minimalistic skin with monochrome icons diff --git a/packages/docs/src/reference/classes/system/apps-config.md b/packages/docs/src/reference/classes/system/apps-config.md index d6efc48..9255823 100644 --- a/packages/docs/src/reference/classes/system/apps-config.md +++ b/packages/docs/src/reference/classes/system/apps-config.md @@ -31,6 +31,6 @@ interface AppsConfigOptions { ### apps -- **Type:** [`App[]`](../apps/app) - An array of applications + +- **Type:** [`App[]`](../apps/app) diff --git a/packages/docs/src/reference/classes/system/desktop-config.md b/packages/docs/src/reference/classes/system/desktop-config.md index 2e70642..0606054 100644 --- a/packages/docs/src/reference/classes/system/desktop-config.md +++ b/packages/docs/src/reference/classes/system/desktop-config.md @@ -29,9 +29,6 @@ interface DesktopConfigOptions { ### defaultIconSize -- **Type:** `0 | 1 | 2` -- **Default:** `1` (Medium) - The default size of the desktop icons | Value | Description | @@ -40,14 +37,17 @@ The default size of the desktop icons | 1 | Medium | | 2 | Large | -### defaultIconDirection +- **Type:** `0 | 1 | 2` +- **Default:** `1` (Medium) -- **Type:** `0 | 1` -- **Default:** `0` (Vertical) +### defaultIconDirection The default direction of the desktop icons | Value | Description | | --- | --- | | 0 | Vertical | -| 1 | Horizontal | \ No newline at end of file +| 1 | Horizontal | + +- **Type:** `0 | 1` +- **Default:** `0` (Vertical) \ No newline at end of file diff --git a/packages/docs/src/reference/classes/system/misc-config.md b/packages/docs/src/reference/classes/system/misc-config.md index 88f0616..4a0585a 100644 --- a/packages/docs/src/reference/classes/system/misc-config.md +++ b/packages/docs/src/reference/classes/system/misc-config.md @@ -28,10 +28,10 @@ interface MiscConfigOptions { ### doubleClickDelay +The maximum time between two clicks for those clicks to register as a double click in milliseconds + - **Type:** `number` - **Default:** `250` -The maximum time between two clicks for those clicks to register as a double click in milliseconds - > [!NOTE] > Also applies to touch devices. diff --git a/packages/docs/src/reference/classes/system/modals-config.md b/packages/docs/src/reference/classes/system/modals-config.md index 63f1422..78777e6 100644 --- a/packages/docs/src/reference/classes/system/modals-config.md +++ b/packages/docs/src/reference/classes/system/modals-config.md @@ -32,14 +32,14 @@ interface ModalsConfigOptions { ### defaultDialogSize +Default size of a dialog box + - **Type:** [`Vector2`](/reference/classes/utils/vector2) - **Default:** `new Vector2(400, 200)` -Default size of a dialog box - ### defaultFileSelectorSize +Default size of a file selector + - **Type:** [`Vector2`](/reference/classes/utils/vector2) - **Default:** `new Vector2(700, 400)` - -Default size of a file selector diff --git a/packages/docs/src/reference/classes/system/taskbar-config.md b/packages/docs/src/reference/classes/system/taskbar-config.md index 649e854..5c147a6 100644 --- a/packages/docs/src/reference/classes/system/taskbar-config.md +++ b/packages/docs/src/reference/classes/system/taskbar-config.md @@ -28,8 +28,8 @@ interface TaskbarConfigOptions { ### height +Height of the taskbar in CSS pixels + - **Type:** `number` - **Default:** `48` -Height of the taskbar in CSS pixels - diff --git a/packages/docs/src/reference/classes/system/tracking-config.md b/packages/docs/src/reference/classes/system/tracking-config.md index 02da731..769c2b8 100644 --- a/packages/docs/src/reference/classes/system/tracking-config.md +++ b/packages/docs/src/reference/classes/system/tracking-config.md @@ -29,16 +29,16 @@ interface TrackingConfigOptions { ### enabled +Determines whether tracking is enabled + - **Type:** `boolean` - **Default:** `true` -Determines whether tracking is enabled - ### GAMeasurementId -- **Type:** `string` - Google Analytics measurement ID +- **Type:** `string` + > [!WARNING] > This option is required if you want to enable tracking. The tracking feature currently only supports tracking via Google Analytics. \ No newline at end of file diff --git a/packages/docs/src/reference/classes/system/windows-config.md b/packages/docs/src/reference/classes/system/windows-config.md index cbde055..709263c 100644 --- a/packages/docs/src/reference/classes/system/windows-config.md +++ b/packages/docs/src/reference/classes/system/windows-config.md @@ -33,24 +33,24 @@ interface WindowsConfigOptions { ### screenMargin +The margin in CSS pixels that windows will keep between them and the edges of the screen on smaller devices + - **Type:** `number` - **Default:** `32` -The margin in CSS pixels that windows will keep between them and the edges of the screen on smaller devices - ### titleSeparator +A string that is placed between different parts of a window title + - **Type:** `string` - **Default:** `"-"` -A string that is placed between different parts of a window title - ### minScreenSize +If the user's screen is smaller than these values, windows will always be maximized + - **Type:** [`Vector2`](/reference/classes/utils/vector2) - **Default:** `new Vector2(350, 350)` -If the user's screen is smaller than these values, windows will always be maximized - > [!WARNING] > Keep these values as low as possible, as this limits some functionality of the OS on devices with certain screen sizes. diff --git a/packages/docs/src/reference/classes/utils/vector2.md b/packages/docs/src/reference/classes/utils/vector2.md index 4fcb1fb..817d66e 100644 --- a/packages/docs/src/reference/classes/utils/vector2.md +++ b/packages/docs/src/reference/classes/utils/vector2.md @@ -47,11 +47,10 @@ new Vector2(3) ### ZERO -- **Static** -- **Type:** `Vector2` - Returns a vector with each value set to zero +- **Static** +- **Type:** `Vector2` - **Example** ```ts @@ -61,19 +60,20 @@ Returns a vector with each value set to zero ### clone -- **Type:** `Vector2` - Returns a clone of this vector +- **Type:** `Vector2` + ## Methods ### round() -- **Returns** - - **Type:** `this` - Round the values of this vector to whole numbers +::: details + +- **Returns** + - **Type:** `this` - **Example** ```ts @@ -81,8 +81,14 @@ Round the values of this vector to whole numbers // Result: Vector2(4, 1) ``` +::: + ### getDistance(x, y) +Get the distance between this vector and another + +::: details + - **Parameters** - **x** - **Type:** `number` @@ -91,20 +97,28 @@ Round the values of this vector to whole numbers - **Returns** - **Type:** `number` -Get the distance between this vector and another +::: ### getDistance(vector2) +Get the distance between this vector and another + +::: details + - **Parameters** - **vector2** - **Type:** `Vector2` - **Returns** - **Type:** `number` -Get the distance between this vector and another +::: ### add(vector2A, vector2B) +Add two vectors together + +::: details + - **Static** - **Parameters** - **vector2A** @@ -114,10 +128,14 @@ Get the distance between this vector and another - **Returns** - **Type:** `Vector2` -Add two vectors together +::: ### subtract(vector2A, vector2B) +Subtract two vectors + +::: details + - **Static** - **Parameters** - **vector2A** @@ -127,10 +145,14 @@ Add two vectors together - **Returns** - **Type:** `Vector2` -Subtract two vectors +::: ### scale(vector2, scalar) +Scale a vector + +::: details + - **Static** - **Parameters** - **vector2** @@ -140,10 +162,14 @@ Subtract two vectors - **Returns** - **Type:** `Vector2` -Scale a vector +::: ### magnitude(vector2) +Get the magnitude of a vector + +::: details + - **Static** - **Parameters** - **vector2** @@ -151,10 +177,14 @@ Scale a vector - **Returns** - **Type:** `number` -Get the magnitude of a vector +::: ### normalize(vector2) +Normalize a vector + +::: details + - **Static** - **Parameters** - **vector2** @@ -162,10 +192,14 @@ Get the magnitude of a vector - **Returns** - **Type:** `Vector2` -Normalize a vector +::: ### sqrDistance (vector2A, vector2B) +Get the square distance between two vectors + +::: details + - **Static** - **Parameters** - **vector2A** @@ -175,10 +209,14 @@ Normalize a vector - **Returns** - **Type:** `number` -Get the square distance between two vectors +::: ### lerp(vector2A, vector2B, t) +Lerp between two vectors + +::: details + - **Static** - **Parameters** - **vector2A** @@ -190,4 +228,4 @@ Get the square distance between two vectors - **Returns** - **Type:** `Vector2` -Lerp between two vectors +::: diff --git a/packages/docs/src/reference/configuration.md b/packages/docs/src/reference/configuration.md index cba0c6c..6f42fdd 100644 --- a/packages/docs/src/reference/configuration.md +++ b/packages/docs/src/reference/configuration.md @@ -10,24 +10,32 @@ To configure ProzillaOS, pass the following properties inside to the `config` pr ### systemName +Name of the system + - **Optional** - **Type:** `string` - **Default:** `"ProzillaOS"` ### tagLine +Tag line or short description of the system + - **Optional** - **Type:** `string` - **Default:** `"Web-based Operating System"` ### skin +Configurations for assets, stylesheets and other visual elements + - **Optional** - **Type:** [`Skin`](/reference/classes/skins/skin) - **Default:** `new Skin()` ### config +Configurations for functional elements and features + - **Optional** - **Type:** `ConfigOptions` diff --git a/packages/docs/src/reference/constants/index.md b/packages/docs/src/reference/constants/index.md new file mode 100644 index 0000000..c10c2e5 --- /dev/null +++ b/packages/docs/src/reference/constants/index.md @@ -0,0 +1,54 @@ +--- +outline: deep +description: "Constants for ProzillaOS" +package: "@prozilla-os/core" +--- + +# Constants + +{{ $frontmatter.description }} + +## Utility + +- **Source:** [`utils.const.ts`](https://github.com/prozilla-os/ProzillaOS/blob/main/packages/core/src/constants/utils.const.ts) + +### ANSI + +Ansi codes for coloring and decorating ansi text + +- **Type:** `Ansi` + +```ts +interface Ansi { + fg: Record; // Foreground colors + bg: Record; // Background colors + decoration: Record; + reset: string; +}; +``` + +## Virtual drive + +- **Source:** [`virtualDrive.const.ts`](https://github.com/prozilla-os/ProzillaOS/blob/main/packages/core/src/constants/virtualDrive.const.ts) + +### CODE_EXTENSIONS + +An array of file extensions for code-related files + +- **Type:** `string[]` + +### IMAGE_EXTENSIONS + +An array of file extensions for image files + +- **Type:** `string[]` + +## Themes + +- **Source:** [`themes.const.ts`](https://github.com/prozilla-os/ProzillaOS/blob/main/packages/core/src/constants/themes.const.ts) + +### THEMES + +A map that transforms theme ids into theme names + +- **Type:** `Record` diff --git a/packages/docs/src/reference/functions/array.md b/packages/docs/src/reference/functions/array.md new file mode 100644 index 0000000..92a1070 --- /dev/null +++ b/packages/docs/src/reference/functions/array.md @@ -0,0 +1,57 @@ +--- +outline: deep +description: "Functions related to arrays" +package: "@prozilla-os/core" +--- + +# Array functions + +{{ $frontmatter.description }} + +- **Source:** [`array.utils.ts`](https://github.com/prozilla-os/ProzillaOS/blob/main/packages/core/src/features/_utils/array.utils.ts) + + +## removeFromArray(item, array) + +Remove an item from an array + +::: details + +- **Type parameters:** `` +- **Parameters** + - **item** - Item to remove from the array + - **Type:** `ItemType` + - **array** + - **Type:** `ItemType[]` + +::: + +## randomFromArray(array) + +Get a random item from an array + +::: details + +- **Type parameters:** `` +- **Parameters** + - **array** + - **Type:** `ItemType[]` +- **Returns** + - **Type:** `ItemType` + +::: + +## removeDuplicatesFromArray(array) + +Removes all duplicate items from an array and returns the array + +::: details + +- **Type parameters:** `` +- **Parameters** + - **array** + - **Type:** `ItemType[]` +- **Returns** + - **Type:** `ItemType[]` + +::: diff --git a/packages/docs/src/reference/functions/browser.md b/packages/docs/src/reference/functions/browser.md new file mode 100644 index 0000000..da953e7 --- /dev/null +++ b/packages/docs/src/reference/functions/browser.md @@ -0,0 +1,146 @@ +--- +outline: deep +description: "Functions related to the browser" +package: "@prozilla-os/core" +--- + +# Browser functions + +{{ $frontmatter.description }} + +- **Source:** [`browser.utils.ts`](https://github.com/prozilla-os/ProzillaOS/blob/main/packages/core/src/features/_utils/browser.utils.ts) + +## closeViewport(requireConfirmation, name) + +Simulate closing the viewport by opening a blank page + +::: details + +- **Parameters** + - **requireConfirmation** - Whether to ask the user for confirmation before closing + - **Type:** `boolean | undefined` + - **Default:** `false` + - **name** - Name of the system + - **Type:** `string` + +::: + +## reloadViewport() + +Reload the viewport + +## isValidUrl(string) + +Validate a URL string + +::: details + +- **Parameters** + - **string** - Input string + - **Type:** `string` +- **Returns** + - **Type:** `boolean` + +::: + +## setViewportTitle(title) + +Change the viewport title by changing meta tags and document title + +::: details + +- **Parameters** + - **title** - Viewport title + - **Type:** `string` + +::: + +## setViewportIcon(url) + +Change the viewport icon by changing meta tags + +::: details + +- **Parameters** + - **url** - URL of the viewport icon + - **Type:** `string` + +::: + +## getViewportParams() + +Get the current viewport parameters/search queries + +::: details + +- **Returns** + - **Type:** `Record` + +::: + +## generateUrl(options) + +Generate a system URL based on some options + +::: details + +- **Parameters** + - **options** + - **Type:** `GenerateUrlOptions` +- **Returns** - The generated URL + - **Type:** `string` + +```ts +interface GenerateUrlOptions { + appId?: string; + fullscreen?: boolean; + standalone?: boolean; +} +``` + +::: + +## openUrl(url, target) + +Open a URL in an optional target or the current window + +::: details + +- **Parameters** + - **url** + - **Type:** `string` + - **target** + - **Optional** + - **Type:** `React.HTMLAttributeAnchorTarget` + +::: + +## removeUrlProtocol(url) + +Remove the protocol from a URL string + +::: details + +- **Parameters** + - **url** + - **Type:** `string` +- **Returns** - URL without protocol + - **Type:** `string` + +::: + +## copyToClipboard(string, onSuccess, onFail) + +Copy text to the user's clipboard + +::: details + +- **Parameters** + - **string** + - **Type:** `string` + - **onSuccess** + - **Type:** `Function` + - **onFail** + - **Type:** `Function` + +::: diff --git a/packages/docs/src/reference/functions/date.md b/packages/docs/src/reference/functions/date.md new file mode 100644 index 0000000..e068726 --- /dev/null +++ b/packages/docs/src/reference/functions/date.md @@ -0,0 +1,50 @@ +--- +outline: deep +description: "Functions related to dates and time" +package: "@prozilla-os/core" +--- + +# Date functions + +{{ $frontmatter.description }} + +- **Source:** [`date.utils.ts`](https://github.com/prozilla-os/ProzillaOS/blob/main/packages/core/src/features/_utils/date.utils.ts) + + +## formatTime(time, maxLength, allowAffixes) + +Format a time + +::: details + +- **Parameters** + - **time** - Time in milliseconds (negative number represents time in the past) + - **Type:** `number` + - **maxLength** - The maximum amount of units, e.g.: 3 => years, months, days + - **Type:** `number | undefined` + - **Default:** `3` + - **allowAffixes** - Allow "... ago" or "in ..." + - **Type:** `boolean` +- **Returns** + - **Type:** `string` + +::: + +## formatRelativeTime(date, maxLength, allowAffixes) + +Format a time relative to now + +::: details + +- **Parameters** + - **date** + - **Type:** `Date` + - **maxLength** - The maximum amount of units, e.g.: 3 => years, months, days + - **Type:** `number | undefined` + - **Default:** `3` + - **allowAffixes** - Allow "... ago" or "in ..." + - **Type:** `boolean` +- **Returns** + - **Type:** `string` + +::: diff --git a/packages/docs/src/reference/functions/math.md b/packages/docs/src/reference/functions/math.md new file mode 100644 index 0000000..c437042 --- /dev/null +++ b/packages/docs/src/reference/functions/math.md @@ -0,0 +1,62 @@ +--- +outline: deep +description: "Functions related to math" +package: "@prozilla-os/core" +--- + +# Math functions + +{{ $frontmatter.description }} + +- **Source:** [`math.utils.ts`](https://github.com/prozilla-os/ProzillaOS/blob/main/packages/core/src/features/_utils/math.utils.ts) + + +## clamp(value, min, max) + +Clamp a value between a min and a max value + +::: details + +- **Parameters** + - **value** + - **Type:** `number` + - **min** + - **Type:** `number` + - **max** + - **Type:** `number` +- **Returns** + - **Type:** `number` + +::: + +## randomRange(min, max) + +Get a random number in a range between a min and a max value + +::: details + +- **Parameters** + - **min** + - **Type:** `number` + - **max** + - **Type:** `number` +- **Returns** + - **Type:** `number` + +::: + +## round(value, precision) + +Round a number off to a certain amount of digits after the comma + +::: details + +- **Parameters** + - **value** - Initial value + - **Type:** `number` + - **precision** - Maximum amount of digits allowed after the comma + - **Type:** `number` +- **Returns** - Rounded value + - **Type:** `number` + +:::