@maropost-ui/liquidsky-ui 0.1.77 → 1.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +106 -39
  2. package/dist/assets/raw-svg.d.ts +4 -0
  3. package/dist/components/AppStepper/useStepper.d.ts +4 -4
  4. package/dist/components/MpSectionRail/types.d.ts +45 -0
  5. package/dist/components/TheAppShell/index.d.ts +1 -0
  6. package/dist/components/TheHeader/index.d.ts +3 -0
  7. package/dist/components/TheHeader/types.d.ts +38 -0
  8. package/dist/components/TheSearchBar/index.d.ts +3 -0
  9. package/dist/components/TheSearchBar/types.d.ts +8 -0
  10. package/dist/components/TheSearchBar/useTheSearchBar.d.ts +12 -0
  11. package/dist/components/TheUnifiedNavigation/index.d.ts +8 -4
  12. package/dist/components/TheUnifiedNavigation/marobase/navigation.d.ts +7 -0
  13. package/dist/components/TheUnifiedNavigation/marobase/types.d.ts +14 -0
  14. package/dist/components/TheUserDropdown/index.d.ts +3 -0
  15. package/dist/components/TheUserDropdown/useUserDropdownMenu.d.ts +12 -0
  16. package/dist/components/index.d.ts +10 -4
  17. package/dist/composables/index.d.ts +1 -0
  18. package/dist/composables/useLiquidSkyTheme.d.ts +13 -0
  19. package/dist/design-tokens/generated/tokens.d.ts +587 -0
  20. package/dist/directives/mpTestConfig.d.ts +1 -0
  21. package/dist/icons/index.d.ts +71 -0
  22. package/dist/icons/liquidSkyIconSet.d.ts +2 -0
  23. package/dist/icons/liquidSkyIcons.d.ts +55 -0
  24. package/dist/index.css +1 -1
  25. package/dist/index.d.ts +8 -1
  26. package/dist/index.js +19588 -16660
  27. package/dist/themes/classic.d.ts +38 -0
  28. package/dist/themes/index.d.ts +157 -0
  29. package/dist/themes/marobase.d.ts +103 -0
  30. package/dist/themes/theme-sync.d.ts +38 -0
  31. package/dist/types/TheUserDropdownProps.d.ts +8 -0
  32. package/dist/types/UnifiedNavigationProps.d.ts +9 -2
  33. package/dist/types/index.d.ts +1 -0
  34. package/dist/vuetify.d.ts +4 -40
  35. package/package.json +18 -7
  36. package/scripts/webpack-resolve.cjs +61 -0
package/README.md CHANGED
@@ -35,9 +35,11 @@ The following packages are required as peer dependencies:
35
35
  npm install @maropost-ui/liquidsky-ui
36
36
  ```
37
37
  ```typescript
38
- import { AppBreadcrumb } from '@maropost-ui/liquidsky-ui'
38
+ import { AppBreadcrumb, TheThemeSwitcher } from '@maropost-ui/liquidsky-ui'
39
39
  ```
40
40
 
41
+ Theme lives in `TheUserDropdown`: click **Theme** for Classic / Marobase. Light / Dark sun–moon controls appear on the right only for Marobase. Persist key is `liquidsky-theme`.
42
+
41
43
  ------------------------------------------------------------------------
42
44
 
43
45
  ------------------------------------------------------------------------
@@ -137,67 +139,132 @@ You may also keep using **`v-btn`**, **`v-tooltip`**, etc., after Liquidsky is i
137
139
  -------------------------------------------------------------------------
138
140
 
139
141
 
140
- ## @maropost-ui/liquidsky-ui Local Development Guide
141
- Use these methods to test @maropost-ui/liquidsky-ui changes in your consuming project (e.g., commerce-frontend or commerce-backoffice) without publishing to npm. Both leverage npm's linking and packaging features for rapid iteration in your app workflow.
142
+ ## Local development in a consuming app
143
+
144
+ Use **`npm install`** for CI, teammates, and anything that should match production. Use **`npm link`** only when you are changing Liquidsky locally and want the app to pick up rebuilt `dist/` without publishing.
145
+
146
+ Liquidsky ships **Vuetify** as a dependency. Commerce apps typically do not declare `vuetify` themselves.
142
147
 
148
+ ### Webpack `vue.config.js` (required for Vue CLI apps)
143
149
 
150
+ Add this whether the app uses `npm install` or `npm link`. It keeps a single Vue copy and tells webpack where Vuetify is.
144
151
 
145
- ### 🚀 Method 1: npm link (Recommended for Active Development)
146
- Creates a symlink for instant hot-reloading of changes.
152
+ ```js
153
+ const path = require('path')
154
+ const { createLiquidskyWebpackResolve } = require('@maropost-ui/liquidsky-ui/webpack')
147
155
 
148
- > **Note:** This method does **not** work well with Webpack. If you are using Vite, this is the preferred approach. Otherwise, use Method 2.
156
+ const liquidskyResolve = createLiquidskyWebpackResolve(__dirname)
157
+
158
+ module.exports = {
159
+ transpileDependencies: ['@maropost-ui/liquidsky-ui'],
160
+ configureWebpack: {
161
+ resolve: {
162
+ ...liquidskyResolve,
163
+ alias: {
164
+ '@': path.resolve(__dirname, 'src'),
165
+ ...liquidskyResolve.alias,
166
+ },
167
+ },
168
+ },
169
+ }
170
+ ```
149
171
 
150
- #### Steps:
172
+ `@maropost-ui/liquidsky-ui/webpack` exists only in Liquidsky versions that include this helper. Install from this repo (pack / path) until that version is published.
151
173
 
152
- 1. **Clone the repository:**
153
- ```bash
154
- git clone <repo-url> liquidsky-frontend
155
- cd liquidsky-frontend
156
- git checkout main
157
- ```
174
+ ---
158
175
 
159
- 2. **Install dependencies and build the package:**
160
- ```bash
161
- npm install
162
- npm run dev
163
- ```
176
+ ### Method 1: `npm install` (normal / published / pack)
164
177
 
165
- 3. **Create a local npm link:**
166
- ```bash
167
- npm link
168
- ```
178
+ No `link:webpack`. No `--app`. npm hoists Vuetify into the app’s `node_modules`.
169
179
 
170
- 4. **In your consuming project (e.g., `commerce-frontend`):**
171
- ```bash
172
- cd /path/to/your/consuming-project
173
- npm link @maropost-ui/liquidsky-ui
174
- ```
180
+ **From the registry** (after the helper is published):
175
181
 
176
- Now, any changes you make in the `liquidsky-frontend` package will be reflected in your consuming project after rebuilding the library. This is useful for rapid development and testing across multiple projects locally.
182
+ ```bash
183
+ cd /path/to/maropost-frontend-app # or maropost-cloud-frontend / commerce-backoffice-frontend
184
+ npm install @maropost-ui/liquidsky-ui
185
+ ```
177
186
 
178
- ### 📦 Method 2: Local npm pack (For Stable Builds)
179
- Generates a distributable .tgz file for one-off installs.
187
+ **From this repo, without publishing:**
180
188
 
181
- #### Step 1: Clone and build the library
182
189
  ```bash
183
- git clone <repo-url> liquidsky-frontend
184
190
  cd liquidsky-frontend
185
- git checkout main
186
191
  npm install
187
192
  npm run build
193
+ npm pack
194
+ ```
195
+
196
+ ```bash
197
+ cd /path/to/maropost-frontend-app # or maropost-cloud-frontend / commerce-backoffice-frontend
198
+ npm unlink --no-save @maropost-ui/liquidsky-ui # only if you previously npm-linked
199
+ npm install /path/to/liquidsky-frontend/maropost-ui-liquidsky-ui-<version>.tgz
188
200
  ```
189
- #### Step 2: Create package
201
+
202
+ Prefer the `.tgz` over `npm install /path/to/liquidsky-frontend`. A folder install can still symlink and hit the same webpack issue as a repo-root `npm link`.
203
+
204
+ ---
205
+
206
+ ### Method 2: `npm link` (local Liquidsky changes)
207
+
208
+ **Do not `npm link` from this repo root in a Webpack app.** Webpack follows that symlink into Liquidsky’s `node_modules` and loads a second Vue.
209
+
210
+ #### Vite consumers
211
+
190
212
  ```bash
191
- npm pack
192
- Creates liquidsky-ui-<version>.tgz.
213
+ cd liquidsky-frontend
214
+ npm install
215
+ npm run dev
216
+ npm link
193
217
  ```
194
218
 
195
- #### Step 3: Install in consuming project
196
219
  ```bash
197
- cd /path/to/commerce-backoffice # or your project
198
- npm install ../../path/to/liquidsky-frontend/liquidsky-ui-<version>.tgz
220
+ cd /path/to/your-vite-app
221
+ npm link @maropost-ui/liquidsky-ui
199
222
  ```
200
223
 
224
+ #### Webpack consumers (maropost-frontend-app / maropost-cloud-frontend / commerce-backoffice-frontend)
225
+
226
+ `--app` is **one-time setup** for that app (creates `node_modules/vuetify` if it is missing). You do not pass the path on later rebuilds.
227
+
228
+ The `--` after `npm run link:webpack` forwards flags to the script.
229
+
230
+ **Once per webpack app:**
231
+
232
+ ```bash
233
+ cd liquidsky-frontend
234
+ npm install
235
+ npm run build
236
+ npm run link:webpack -- --app /path/to/maropost-frontend-app
237
+ # or
238
+ npm run link:webpack -- --app /path/to/maropost-cloud-frontend
239
+ # or
240
+ npm run link:webpack -- --app /path/to/commerce-backoffice-frontend
241
+ ```
242
+
243
+ ```bash
244
+ cd /path/to/maropost-frontend-app # or maropost-cloud-frontend / commerce-backoffice-frontend
245
+ npm unlink --no-save @maropost-ui/liquidsky-ui # if you previously linked the repo root
246
+ npm link @maropost-ui/liquidsky-ui
247
+ ```
248
+
249
+ If a **repo-root** link is still registered globally:
250
+
251
+ ```bash
252
+ npm unlink -g @maropost-ui/liquidsky-ui
253
+ ```
254
+
255
+ **Every later rebuild** (no `--app`):
256
+
257
+ ```bash
258
+ cd liquidsky-frontend
259
+ npm run link:webpack
260
+ # or, rebuild on save:
261
+ npm run link:webpack:watch
262
+ ```
263
+
264
+ Then restart or refresh the webpack app. `link:webpack` copies `dist/` to `../.liquidsky-ui-link` (a folder with no Liquidsky Vue) and runs `npm link` from there.
265
+
266
+ Use `--app` again only if you clone a new consumer, delete `node_modules`, or Vuetify disappears from the app.
267
+
201
268
  ------------------------------------------------------------------------
202
269
 
203
270
 
@@ -0,0 +1,4 @@
1
+ declare module '*.svg?raw' {
2
+ const source: string;
3
+ export default source;
4
+ }
@@ -5,12 +5,12 @@ export declare function useStepper(steps: TStepItem[]): {
5
5
  name: string;
6
6
  order: number;
7
7
  id: number;
8
- component?: {
8
+ component?: import("vue").FunctionalComponent<any, {}, any, {}> | {
9
9
  new (...args: any[]): any;
10
10
  __isFragment?: never;
11
11
  __isTeleport?: never;
12
12
  __isSuspense?: never;
13
- } | import("vue").FunctionalComponent<any, {}, any, {}> | {
13
+ } | {
14
14
  [x: string]: any;
15
15
  setup?: ((this: void, props: import("@vue/shared").LooseRequired<any>, ctx: {
16
16
  attrs: import("vue").Attrs;
@@ -135,12 +135,12 @@ export declare function useStepper(steps: TStepItem[]): {
135
135
  name: string;
136
136
  order: number;
137
137
  id: number;
138
- component?: {
138
+ component?: import("vue").FunctionalComponent<any, {}, any, {}> | {
139
139
  new (...args: any[]): any;
140
140
  __isFragment?: never;
141
141
  __isTeleport?: never;
142
142
  __isSuspense?: never;
143
- } | import("vue").FunctionalComponent<any, {}, any, {}> | {
143
+ } | {
144
144
  [x: string]: any;
145
145
  setup?: ((this: void, props: import("@vue/shared").LooseRequired<any>, ctx: {
146
146
  attrs: import("vue").Attrs;
@@ -0,0 +1,45 @@
1
+ import type { RouteLocationRaw } from 'vue-router';
2
+ export interface MpSectionRailItem {
3
+ slug: string;
4
+ label: string;
5
+ /** Lucide icon name (kebab-case). Omit for text-only rows (Settings flavor). */
6
+ icon?: string;
7
+ to: RouteLocationRaw;
8
+ /** Route names that keep this item highlighted (the section's children/editors). */
9
+ match?: string[];
10
+ /** Optional count chip shown at the end of the row. */
11
+ count?: number;
12
+ /** Renders an external-link glyph after the label. */
13
+ external?: boolean;
14
+ }
15
+ export interface MpSectionRailGroup {
16
+ /** Optional uppercase group heading. */
17
+ title?: string;
18
+ items: MpSectionRailItem[];
19
+ }
20
+ export interface MpSectionRailSwitchOption {
21
+ id: string;
22
+ label: string;
23
+ caption?: string;
24
+ icon?: string;
25
+ }
26
+ export interface MpSectionRailProps {
27
+ /** Accessible name for the rail's nav landmark. */
28
+ ariaLabel: string;
29
+ groups: MpSectionRailGroup[];
30
+ /** Plain heading (module flavor, e.g. "Settings"). */
31
+ title?: string;
32
+ backTo?: RouteLocationRaw;
33
+ backLabel?: string;
34
+ /** Entity identity card (entity flavor, e.g. a store). */
35
+ identity?: {
36
+ name: string;
37
+ caption?: string;
38
+ icon?: string;
39
+ };
40
+ /** Other entities the user can jump to; renders the switcher menu on the identity card. */
41
+ switcherOptions?: MpSectionRailSwitchOption[];
42
+ switcherLabel?: string;
43
+ searchable?: boolean;
44
+ searchPlaceholder?: string;
45
+ }
@@ -0,0 +1 @@
1
+ export { default } from './TheAppShell.vue';
@@ -0,0 +1,3 @@
1
+ export { default } from './TheHeader.vue';
2
+ export { default as ClassicHeader } from './Classic/TheHeader.vue';
3
+ export { default as MarobaseHeader } from './Marobase/TheHeader.vue';
@@ -0,0 +1,38 @@
1
+ import type { NotificationIconProps } from '../../types/NotificationIconProps';
2
+ import type { MpTestIdProps } from '../../types/MpTestIdProps';
3
+ /** Application-owned permissions and navigation for Liquidsky's header controls. */
4
+ export type HeaderActions = {
5
+ showSettings?: boolean;
6
+ settingsHref?: string;
7
+ onSettingsClick?: (event: MouseEvent) => void;
8
+ onDaVinciClick: () => void;
9
+ onWhatsNewClick: () => void;
10
+ helpCenterUrl?: string;
11
+ raiseTicketUrl?: string;
12
+ };
13
+ export type TheHeaderProps = {
14
+ /** Opt into the theme's utility controls in place of the default timezone. */
15
+ actions?: HeaderActions;
16
+ /** notification count e.g. 5 */
17
+ notificationCount?: number;
18
+ /** timezone e.g. UTC, EST, etc. */
19
+ timezone?: string;
20
+ /** route to preferences : on click to timezone it will open the preferences page*/
21
+ routeToPreferences?: string;
22
+ /** is page loading e.g. true or false */
23
+ isPageLoading: boolean;
24
+ /** toggle left menu e.g. true or false */
25
+ toggleLeftMenu: () => void;
26
+ /** user menu items e.g. [{ title: "Profile", icon: "mdi-account", action: () => {} }, { title: "Settings", icon: "mdi-cog", action: () => {} }] */
27
+ userMenuItems?: any[];
28
+ /** username e.g. John Doe */
29
+ username?: string;
30
+ /** logout e.g. () => {} */
31
+ logout?: () => void;
32
+ /** account id e.g. 20001 */
33
+ accountId?: string | number;
34
+ /** show app bar nav icon e.g. true or false */
35
+ hideAppBarNavIcon?: boolean;
36
+ /** notification icon props e.g. { icon: "mdi-bell", color: "primary" } */
37
+ notificationIconProps?: NotificationIconProps;
38
+ } & MpTestIdProps;
@@ -0,0 +1,3 @@
1
+ export { default } from './TheSearchBar.vue';
2
+ export { default as ClassicSearchBar } from './Classic/TheSearchBar.vue';
3
+ export { default as MarobaseSearchBar } from './Marobase/TheSearchBar.vue';
@@ -0,0 +1,8 @@
1
+ import type { MpTestIdProps } from '../../types/MpTestIdProps';
2
+ export type TheSearchBarProps = {
3
+ /** The name of the query parameter to use for search (defaults to 'q') */
4
+ queryParamName?: string;
5
+ show?: boolean;
6
+ placeholder?: string;
7
+ containerClass?: string;
8
+ } & MpTestIdProps;
@@ -0,0 +1,12 @@
1
+ import type { TheSearchBarProps } from './types';
2
+ export declare function useTheSearchBar(props: TheSearchBarProps): {
3
+ mpTestId: import("vue").ComputedRef<string>;
4
+ keyword: import("vue").Ref<string | undefined, string | undefined>;
5
+ clearSearch: () => void;
6
+ searchPlaceholder: import("vue").ComputedRef<string>;
7
+ showSearchBar: import("vue").ComputedRef<boolean>;
8
+ handleSearchKeyup: (event: KeyboardEvent) => void;
9
+ isFocused: import("vue").Ref<boolean, boolean>;
10
+ onSearchFocus: () => void;
11
+ onSearchBlur: () => void;
12
+ };
@@ -1,5 +1,9 @@
1
1
  export { default as TheUnifiedNavigation } from './TheUnifiedNavigation.vue';
2
- export { default as UnifiedNavigationBlock } from './UnifiedNavigationBlock.vue';
3
- export { default as NavigationToggleButton } from './NavigationToggleButton.vue';
4
- export { default as SubMenuDialog } from './SubMenuDialog.vue';
5
- export { default as UnifiedNavigationNode } from './UnifiedNavigationNode.vue';
2
+ export { default as ClassicUnifiedNavigation } from './classic/ClassicUnifiedNavigation.vue';
3
+ export { default as UnifiedNavigationBlock } from './classic/UnifiedNavigationBlock.vue';
4
+ export { default as NavigationToggleButton } from './classic/NavigationToggleButton.vue';
5
+ export { default as SubMenuDialog } from './classic/SubMenuDialog.vue';
6
+ export { default as UnifiedNavigationNode } from './classic/UnifiedNavigationNode.vue';
7
+ export { default as MarobaseSidebar } from './marobase/MarobaseSidebar.vue';
8
+ export type { MarobaseSidebarProps, AppSidebarProps } from './marobase/types';
9
+ export { default as TheAppSidebar } from './marobase/MarobaseSidebar.vue';
@@ -0,0 +1,7 @@
1
+ import type { UnifiedNavigationItem } from '../../../types/UnifiedNavigationProps';
2
+ export type SidebarSection = {
3
+ key: string;
4
+ items: UnifiedNavigationItem[];
5
+ };
6
+ export declare function sidebarSections(items: UnifiedNavigationItem[]): SidebarSection[];
7
+ export declare function scopedPath(item: UnifiedNavigationItem, accountId: string): string | undefined;
@@ -0,0 +1,14 @@
1
+ import type { SidebarGetStarted, UnifiedNavigationProps } from '../../../types/UnifiedNavigationProps';
2
+ export interface MarobaseSidebarProps extends UnifiedNavigationProps {
3
+ modelValue?: boolean;
4
+ temporary?: boolean;
5
+ width?: number;
6
+ railWidth?: number;
7
+ brandLabel?: string;
8
+ getStarted?: SidebarGetStarted;
9
+ /** Optional controlled section. When omitted, enableStoreMenu supplies route state. */
10
+ activeSection?: 'store' | null;
11
+ sectionWidth?: number;
12
+ }
13
+ /** Previous public name for MarobaseSidebarProps. */
14
+ export type AppSidebarProps = MarobaseSidebarProps;
@@ -0,0 +1,3 @@
1
+ export { default as TheUserDropdown } from './TheUserDropdown.vue';
2
+ export { default as ClassicUserDropdown } from './classic/ClassicUserDropdown.vue';
3
+ export { default as MarobaseUserDropdown } from './marobase/MarobaseUserDropdown.vue';
@@ -0,0 +1,12 @@
1
+ import type { TheUserDropdownProps } from '../../types/TheUserDropdownProps';
2
+ import type { ThemeAppearance } from '../../themes';
3
+ export declare function userInitialsFromName(username: string | undefined): string;
4
+ export declare function useUserDropdownMenu(props: TheUserDropdownProps, emit: (event: 'logout') => void): {
5
+ mpTestId: import("vue").ComputedRef<string>;
6
+ isMenuOpen: import("vue").Ref<boolean, boolean>;
7
+ family: import("vue").ComputedRef<import("../../themes").ThemeFamily>;
8
+ userInitials: import("vue").ComputedRef<string>;
9
+ appearanceToggle: import("vue").WritableComputedRef<ThemeAppearance, ThemeAppearance | ThemeAppearance[] | null>;
10
+ setFamily: (next: import("../../themes").ThemeFamily) => void;
11
+ onClickLogoutHandler: () => void;
12
+ };
@@ -22,15 +22,21 @@ export { default as AppTooltip } from "./AppTooltip.vue";
22
22
  export { default as AppGridTable } from "./AppGridTable.vue";
23
23
  export { default as TheAccountDropdown } from "./TheAccountDropdown.vue";
24
24
  export { default as TheAppsDropdown } from "./TheAppsDropdown.vue";
25
- export { default as TheHeader } from "./TheHeader.vue";
25
+ export { default as TheHeader } from "./TheHeader";
26
+ export { default as TheAppShell } from "./TheAppShell";
26
27
  export { default as TheNavigation } from "./TheNavigation.vue";
27
28
  export { default as TheNotificationDrawer } from "./TheNotificationDrawer.vue";
28
29
  export { default as TheNotificationIcon } from "./TheNotificationIcon.vue";
29
- export { default as TheSearchBar } from "./TheSearchBar.vue";
30
+ export { default as TheSearchBar } from "./TheSearchBar";
30
31
  export { default as TheSecondaryNavigation } from "./TheSecondaryNavigation.vue";
32
+ export { default as MpSectionRail } from './MpSectionRail/MpSectionRail.vue';
33
+ export { default as StoreSectionRail } from './MpSectionRail/StoreSectionRail.vue';
34
+ export type { MpSectionRailProps, MpSectionRailItem, MpSectionRailGroup, MpSectionRailSwitchOption } from './MpSectionRail/types';
35
+ export { default as TheThemeSwitcher } from "./TheThemeSwitcher.vue";
31
36
  export { default as TheTimezone } from "./TheTimezone/TheTimezone.vue";
32
- export { default as TheUserDropdown } from "./TheUserDropdown.vue";
33
- export { TheUnifiedNavigation } from "./TheUnifiedNavigation";
37
+ export { TheUserDropdown, MarobaseUserDropdown } from "./TheUserDropdown";
38
+ export { TheUnifiedNavigation, MarobaseSidebar, TheAppSidebar } from "./TheUnifiedNavigation";
39
+ export type { MarobaseSidebarProps, AppSidebarProps } from "./TheUnifiedNavigation";
34
40
  export { default as AlertModal } from "./AlertModal.vue";
35
41
  export { default as TheOnboardingBanner } from "./TheOnboardingBanner.vue";
36
42
  export { default as TheOnboardingScreenChecklists } from "./TheOnboardingScreenChecklists.vue";
@@ -10,3 +10,4 @@ export { default as toRefs } from "./toRefs";
10
10
  export { default as useUnitConversion } from "./useUnitConversion";
11
11
  export { default as useTimezoneTime } from "./useCalculateTime";
12
12
  export { default as useMpTestId, resolveMpTestId } from "./useMpTestId";
13
+ export { default as useLiquidSkyTheme, resetLiquidSkyThemeForTests } from "./useLiquidSkyTheme";
@@ -0,0 +1,13 @@
1
+ import { type LiquidSkyThemeName, type ThemeAppearance, type ThemeFamily } from '../themes';
2
+ export declare function resetLiquidSkyThemeForTests(): void;
3
+ export default function useLiquidSkyTheme(options?: {
4
+ persist?: boolean;
5
+ storageKey?: string;
6
+ }): {
7
+ themeName: import("vue").Ref<LiquidSkyThemeName, LiquidSkyThemeName>;
8
+ family: import("vue").ComputedRef<ThemeFamily>;
9
+ appearance: import("vue").ComputedRef<ThemeAppearance>;
10
+ setTheme: (name: LiquidSkyThemeName) => void;
11
+ setFamily: (next: ThemeFamily) => void;
12
+ setAppearance: (next: ThemeAppearance) => void;
13
+ };