@nonsuch/component-library 0.7.1 → 0.8.0
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.
- package/README.md +2 -0
- package/dist/components/NsAppShell/NsAppShell.vue.d.ts +65 -0
- package/dist/components/NsAppShell/index.d.ts +2 -0
- package/dist/components/NsAppShell/types.d.ts +26 -0
- package/dist/components/NsAuthLayout/NsAuthLayout.vue.d.ts +29 -0
- package/dist/components/NsAuthLayout/index.d.ts +1 -0
- package/dist/components/NsDashboardGrid/NsDashboardGrid.vue.d.ts +29 -0
- package/dist/components/NsDashboardGrid/index.d.ts +1 -0
- package/dist/components/NsDrawer/NsDrawer.vue.d.ts +15 -0
- package/dist/components/NsDrawer/index.d.ts +1 -0
- package/dist/components/NsExpansionItem/NsExpansionItem.vue.d.ts +15 -0
- package/dist/components/NsExpansionItem/index.d.ts +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/nonsuch-components.css +1 -1
- package/dist/nonsuch-components.js +816 -474
- package/dist/tokens/index.d.ts +1 -1
- package/package.json +1 -1
- package/src/tokens/tokens.css +3 -0
package/README.md
CHANGED
|
@@ -305,6 +305,8 @@ src/
|
|
|
305
305
|
NsCheckbox/ # Styled QCheckbox wrapper
|
|
306
306
|
NsChip/ # Tag/filter chip
|
|
307
307
|
NsDialog/ # Modal dialog with header/body/actions
|
|
308
|
+
NsDrawer/ # Side drawer (within NsLayout)
|
|
309
|
+
NsExpansionItem/ # Collapsible list item
|
|
308
310
|
NsFooter/ # App footer (within NsLayout)
|
|
309
311
|
NsForm/ # Form wrapper with validation
|
|
310
312
|
NsHeader/ # App header (within NsLayout)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { NsAppShellTab, NsAppShellNavItem } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* NsAppShell — Primary responsive app layout template.
|
|
4
|
+
*
|
|
5
|
+
* Handles the mobile → tablet → desktop layout transition:
|
|
6
|
+
* - Mobile (xs/sm): Bottom tab bar for primary nav, hamburger opens drawer
|
|
7
|
+
* - Tablet+ (md+): Persistent or mini side drawer, no bottom tab bar
|
|
8
|
+
*
|
|
9
|
+
* Composes NsLayout, NsHeader, NsToolbar, NsDrawer, NsPageContainer,
|
|
10
|
+
* NsTabs, NsTab, NsIcon, NsButton, NsFooter, and more.
|
|
11
|
+
*/
|
|
12
|
+
export interface NsAppShellProps {
|
|
13
|
+
/** Tab items for mobile bottom navigation bar */
|
|
14
|
+
tabs?: NsAppShellTab[];
|
|
15
|
+
/** Navigation items for the side drawer */
|
|
16
|
+
drawerItems?: NsAppShellNavItem[];
|
|
17
|
+
/** Whether to show the search action */
|
|
18
|
+
showSearch?: boolean;
|
|
19
|
+
/** Use mini (rail) mode for the side drawer on desktop */
|
|
20
|
+
miniDrawer?: boolean;
|
|
21
|
+
/** Pixel breakpoint for persistent drawer (default: md = 1024) */
|
|
22
|
+
drawerBreakpoint?: number;
|
|
23
|
+
/** Currently active tab name */
|
|
24
|
+
modelValue?: string;
|
|
25
|
+
}
|
|
26
|
+
declare var __VLS_33: {}, __VLS_67: {}, __VLS_111: {}, __VLS_153: {}, __VLS_167: {}, __VLS_175: {};
|
|
27
|
+
type __VLS_Slots = {} & {
|
|
28
|
+
'header-left'?: (props: typeof __VLS_33) => any;
|
|
29
|
+
} & {
|
|
30
|
+
'header-actions'?: (props: typeof __VLS_67) => any;
|
|
31
|
+
} & {
|
|
32
|
+
'drawer-header'?: (props: typeof __VLS_111) => any;
|
|
33
|
+
} & {
|
|
34
|
+
'drawer-footer'?: (props: typeof __VLS_153) => any;
|
|
35
|
+
} & {
|
|
36
|
+
default?: (props: typeof __VLS_167) => any;
|
|
37
|
+
} & {
|
|
38
|
+
'bottom-bar-above'?: (props: typeof __VLS_175) => any;
|
|
39
|
+
};
|
|
40
|
+
declare const __VLS_base: import("vue").DefineComponent<NsAppShellProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
41
|
+
search: (query: string) => any;
|
|
42
|
+
"update:modelValue": (name: string) => any;
|
|
43
|
+
"tab-change": (name: string | number) => any;
|
|
44
|
+
"drawer-toggle": (open: boolean) => any;
|
|
45
|
+
}, string, import("vue").PublicProps, Readonly<NsAppShellProps> & Readonly<{
|
|
46
|
+
onSearch?: ((query: string) => any) | undefined;
|
|
47
|
+
"onUpdate:modelValue"?: ((name: string) => any) | undefined;
|
|
48
|
+
"onTab-change"?: ((name: string | number) => any) | undefined;
|
|
49
|
+
"onDrawer-toggle"?: ((open: boolean) => any) | undefined;
|
|
50
|
+
}>, {
|
|
51
|
+
modelValue: string;
|
|
52
|
+
tabs: NsAppShellTab[];
|
|
53
|
+
drawerItems: NsAppShellNavItem[];
|
|
54
|
+
showSearch: boolean;
|
|
55
|
+
miniDrawer: boolean;
|
|
56
|
+
drawerBreakpoint: number;
|
|
57
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
58
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
59
|
+
declare const _default: typeof __VLS_export;
|
|
60
|
+
export default _default;
|
|
61
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
62
|
+
new (): {
|
|
63
|
+
$slots: S;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Represents a tab item for the mobile bottom navigation bar. */
|
|
2
|
+
export interface NsAppShellTab {
|
|
3
|
+
/** Unique identifier for the tab */
|
|
4
|
+
name: string;
|
|
5
|
+
/** Display label for the tab */
|
|
6
|
+
label: string;
|
|
7
|
+
/** Material icon name */
|
|
8
|
+
icon: string;
|
|
9
|
+
}
|
|
10
|
+
/** Represents a navigation item in the side drawer. */
|
|
11
|
+
export interface NsAppShellNavItem {
|
|
12
|
+
/** Unique identifier for the nav item */
|
|
13
|
+
name: string;
|
|
14
|
+
/** Display label */
|
|
15
|
+
label: string;
|
|
16
|
+
/** Material icon name */
|
|
17
|
+
icon?: string;
|
|
18
|
+
/** Route path or URL */
|
|
19
|
+
to?: string;
|
|
20
|
+
/** Whether this item is currently active */
|
|
21
|
+
active?: boolean;
|
|
22
|
+
/** Nested children (for expandable sections) */
|
|
23
|
+
children?: NsAppShellNavItem[];
|
|
24
|
+
/** Separator before this item */
|
|
25
|
+
separator?: boolean;
|
|
26
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NsAuthLayout — A centered layout for authentication flows.
|
|
3
|
+
*
|
|
4
|
+
* Provides a vertically and horizontally centered card container
|
|
5
|
+
* ideal for login, register, 2FA, and similar auth pages.
|
|
6
|
+
* Mobile-first: full-width with padding on small screens,
|
|
7
|
+
* constrained max-width on larger screens.
|
|
8
|
+
*/
|
|
9
|
+
export interface NsAuthLayoutProps {
|
|
10
|
+
/** Maximum width of the auth card container (CSS value) */
|
|
11
|
+
maxWidth?: string;
|
|
12
|
+
}
|
|
13
|
+
declare var __VLS_20: {}, __VLS_28: {};
|
|
14
|
+
type __VLS_Slots = {} & {
|
|
15
|
+
branding?: (props: typeof __VLS_20) => any;
|
|
16
|
+
} & {
|
|
17
|
+
default?: (props: typeof __VLS_28) => any;
|
|
18
|
+
};
|
|
19
|
+
declare const __VLS_base: import("vue").DefineComponent<NsAuthLayoutProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<NsAuthLayoutProps> & Readonly<{}>, {
|
|
20
|
+
maxWidth: string;
|
|
21
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
22
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
23
|
+
declare const _default: typeof __VLS_export;
|
|
24
|
+
export default _default;
|
|
25
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
26
|
+
new (): {
|
|
27
|
+
$slots: S;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as NsAuthLayout } from './NsAuthLayout.vue';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NsDashboardGrid — A responsive grid layout for dashboard widgets.
|
|
3
|
+
*
|
|
4
|
+
* Mobile-first responsive columns using Quasar's ascending breakpoint system.
|
|
5
|
+
* Default: 1 column (xs) → 2 columns (sm) → 3 columns (md) → 4 columns (lg).
|
|
6
|
+
*
|
|
7
|
+
* Each direct child in the default slot is automatically wrapped in a
|
|
8
|
+
* responsive column div. Works with any content but optimized for
|
|
9
|
+
* equal-height cards in each row.
|
|
10
|
+
*/
|
|
11
|
+
export interface NsDashboardGridColumns {
|
|
12
|
+
xs?: number;
|
|
13
|
+
sm?: number;
|
|
14
|
+
md?: number;
|
|
15
|
+
lg?: number;
|
|
16
|
+
xl?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface NsDashboardGridProps {
|
|
19
|
+
/** Override breakpoint column configuration */
|
|
20
|
+
columns?: NsDashboardGridColumns;
|
|
21
|
+
/** Spacing between widgets (Quasar gutter size: xs, sm, md, lg, xl) */
|
|
22
|
+
gap?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
23
|
+
}
|
|
24
|
+
declare const __VLS_export: import("vue").DefineComponent<NsDashboardGridProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<NsDashboardGridProps> & Readonly<{}>, {
|
|
25
|
+
columns: NsDashboardGridColumns;
|
|
26
|
+
gap: "xs" | "sm" | "md" | "lg" | "xl";
|
|
27
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
28
|
+
declare const _default: typeof __VLS_export;
|
|
29
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as NsDashboardGrid } from './NsDashboardGrid.vue';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface NsDrawerProps {
|
|
2
|
+
}
|
|
3
|
+
declare var __VLS_8: {};
|
|
4
|
+
type __VLS_Slots = {} & {
|
|
5
|
+
default?: (props: typeof __VLS_8) => any;
|
|
6
|
+
};
|
|
7
|
+
declare const __VLS_base: import("vue").DefineComponent<NsDrawerProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<NsDrawerProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
8
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
9
|
+
declare const _default: typeof __VLS_export;
|
|
10
|
+
export default _default;
|
|
11
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
12
|
+
new (): {
|
|
13
|
+
$slots: S;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as NsDrawer } from './NsDrawer.vue';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface NsExpansionItemProps {
|
|
2
|
+
}
|
|
3
|
+
declare var __VLS_8: {};
|
|
4
|
+
type __VLS_Slots = {} & {
|
|
5
|
+
default?: (props: typeof __VLS_8) => any;
|
|
6
|
+
};
|
|
7
|
+
declare const __VLS_base: import("vue").DefineComponent<NsExpansionItemProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<NsExpansionItemProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
8
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
9
|
+
declare const _default: typeof __VLS_export;
|
|
10
|
+
export default _default;
|
|
11
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
12
|
+
new (): {
|
|
13
|
+
$slots: S;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as NsExpansionItem } from './NsExpansionItem.vue';
|
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,10 @@ export { default as NsForm } from './components/NsForm/NsForm.vue';
|
|
|
18
18
|
export type { NsFormProps } from './components/NsForm/NsForm.vue';
|
|
19
19
|
export { default as NsDialog } from './components/NsDialog/NsDialog.vue';
|
|
20
20
|
export type { NsDialogProps } from './components/NsDialog/NsDialog.vue';
|
|
21
|
+
export { default as NsDrawer } from './components/NsDrawer/NsDrawer.vue';
|
|
22
|
+
export type { NsDrawerProps } from './components/NsDrawer/NsDrawer.vue';
|
|
23
|
+
export { default as NsExpansionItem } from './components/NsExpansionItem/NsExpansionItem.vue';
|
|
24
|
+
export type { NsExpansionItemProps } from './components/NsExpansionItem/NsExpansionItem.vue';
|
|
21
25
|
export { default as NsBanner } from './components/NsBanner/NsBanner.vue';
|
|
22
26
|
export type { NsBannerProps, NsBannerType } from './components/NsBanner/NsBanner.vue';
|
|
23
27
|
export { default as NsAvatar } from './components/NsAvatar/NsAvatar.vue';
|
|
@@ -96,6 +100,13 @@ export { default as NsToolbar } from './components/NsToolbar/NsToolbar.vue';
|
|
|
96
100
|
export type { NsToolbarProps } from './components/NsToolbar/NsToolbar.vue';
|
|
97
101
|
export { default as NsToolbarTitle } from './components/NsToolbarTitle/NsToolbarTitle.vue';
|
|
98
102
|
export type { NsToolbarTitleProps } from './components/NsToolbarTitle/NsToolbarTitle.vue';
|
|
103
|
+
export { default as NsAppShell } from './components/NsAppShell/NsAppShell.vue';
|
|
104
|
+
export type { NsAppShellProps } from './components/NsAppShell/NsAppShell.vue';
|
|
105
|
+
export type { NsAppShellTab, NsAppShellNavItem } from './components/NsAppShell/types';
|
|
106
|
+
export { default as NsAuthLayout } from './components/NsAuthLayout/NsAuthLayout.vue';
|
|
107
|
+
export type { NsAuthLayoutProps } from './components/NsAuthLayout/NsAuthLayout.vue';
|
|
108
|
+
export { default as NsDashboardGrid } from './components/NsDashboardGrid/NsDashboardGrid.vue';
|
|
109
|
+
export type { NsDashboardGridProps, NsDashboardGridColumns, } from './components/NsDashboardGrid/NsDashboardGrid.vue';
|
|
99
110
|
export { createNonsuch } from './plugin';
|
|
100
111
|
export type { NsPluginOptions } from './plugin';
|
|
101
112
|
export { createQuasarConfig } from './quasarConfig';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.ns-button[data-v-59b40e5f]{font-family:var(--ns-font-family-text);font-weight:var(--ns-font-weight-medium);letter-spacing:var(--ns-letter-spacing-wide)}.ns-skeleton[data-v-dfd40b8a]{border-radius:var(--ns-radius-md)}.ns-input[data-v-7ebf3284],.ns-input[data-v-7ebf3284] .q-field__label{font-family:var(--ns-font-family-text)}.ns-input[data-v-7ebf3284] .q-field__control{border-radius:var(--ns-radius-md)}.ns-card[data-v-7769879a]{border-radius:var(--ns-radius-lg);box-shadow:var(--ns-shadow-sm);font-family:var(--ns-font-family-text);transition:box-shadow var(--ns-duration-normal) var(--ns-easing-default)}.ns-card[data-v-7769879a]:hover{box-shadow:var(--ns-shadow-md)}.ns-card--flat[data-v-7769879a],.ns-card--flat[data-v-7769879a]:hover{box-shadow:none}.ns-card__header[data-v-7769879a]{font-family:var(--ns-font-family-display)}.ns-select[data-v-081cebe3],.ns-select[data-v-081cebe3] .q-field__label{font-family:var(--ns-font-family-text)}.ns-select[data-v-081cebe3] .q-field__control{border-radius:var(--ns-radius-md)}.ns-checkbox[data-v-2e481f8b],.ns-toggle[data-v-f8c90530],.ns-form[data-v-e20d14ce]{font-family:var(--ns-font-family-text)}.ns-dialog__card[data-v-4fca48ca]{border-radius:var(--ns-radius-lg);font-family:var(--ns-font-family-text);min-width:320px}.ns-dialog__header[data-v-4fca48ca]{font-family:var(--ns-font-family-display)}.ns-banner[data-v-18ebd6f5]{font-family:var(--ns-font-family-text);border-radius:var(--ns-radius-md)}.ns-banner--info[data-v-18ebd6f5]{background-color:var(--ns-color-info-bg, #e3f2fd);color:var(--ns-color-info-text, #0d47a1)}.ns-banner--success[data-v-18ebd6f5]{background-color:var(--ns-color-success-bg, #e8f5e9);color:var(--ns-color-success-text, #1b5e20)}.ns-banner--warning[data-v-18ebd6f5]{background-color:var(--ns-color-warning-bg, #fff3e0);color:var(--ns-color-warning-text, #e65100)}.ns-banner--error[data-v-18ebd6f5]{background-color:var(--ns-color-error-bg, #ffebee);color:var(--ns-color-error-text, #b71c1c)}.ns-avatar[data-v-6a1b44b8]{font-family:var(--ns-font-family-text);font-weight:var(--ns-font-weight-medium)}.ns-chip[data-v-1a2191f1]{font-family:var(--ns-font-family-text);border-radius:var(--ns-radius-full, 9999px)}.ns-list[data-v-65aec20e]{font-family:var(--ns-font-family-text);border-radius:var(--ns-radius-md)}.ns-tooltip[data-v-9cb6af8f]{font-family:var(--ns-font-family-text);font-size:var(--ns-font-size-sm, .875rem);border-radius:var(--ns-radius-sm);padding:var(--ns-space-1, 4px) var(--ns-space-2, 8px)}.ns-badge[data-v-4ca05f24],.ns-breadcrumbs[data-v-dee98f71],.ns-breadcrumb-element[data-v-37bfe51b],.ns-button-toggle[data-v-93652c3e],.ns-card-actions[data-v-0d6f776d],.ns-card-section[data-v-781d42ef],.ns-footer[data-v-1fb919cd],.ns-header[data-v-80d27841],.ns-icon[data-v-d068ec18],.ns-image[data-v-c9c9f6c1],.ns-inner-loading[data-v-080672c1],.ns-item[data-v-47978f87],.ns-item-label[data-v-df6024af],.ns-item-section[data-v-340a753a],.ns-layout[data-v-cf90e270],.ns-linear-progress[data-v-79c6443f],.ns-menu[data-v-47a4b7d0],.ns-page[data-v-25e2841e],.ns-page-container[data-v-ac167da5],.ns-pagination[data-v-12fa9287],.ns-separator[data-v-0c2b2ac1],.ns-space[data-v-273ca5fc],.ns-spinner[data-v-5b99a17b],.ns-spinner-dots[data-v-20a70106],.ns-tab[data-v-b97f2cd1],.ns-table[data-v-a45d30cf],.ns-table-cell[data-v-ca0da61b],.ns-tab-panel[data-v-d8f64358],.ns-tab-panels[data-v-dec8ab0f],.ns-tabs[data-v-81224e01],.ns-timeline[data-v-1bf558aa],.ns-timeline-entry[data-v-fa149ea0],.ns-toolbar[data-v-e26a45db],.ns-toolbar-title[data-v-42928844]{font-family:var(--ns-font-family-text)}
|
|
1
|
+
.ns-button[data-v-59b40e5f]{font-family:var(--ns-font-family-text);font-weight:var(--ns-font-weight-medium);letter-spacing:var(--ns-letter-spacing-wide)}.ns-skeleton[data-v-dfd40b8a]{border-radius:var(--ns-radius-md)}.ns-input[data-v-7ebf3284],.ns-input[data-v-7ebf3284] .q-field__label{font-family:var(--ns-font-family-text)}.ns-input[data-v-7ebf3284] .q-field__control{border-radius:var(--ns-radius-md)}.ns-card[data-v-7769879a]{border-radius:var(--ns-radius-lg);box-shadow:var(--ns-shadow-sm);font-family:var(--ns-font-family-text);transition:box-shadow var(--ns-duration-normal) var(--ns-easing-default)}.ns-card[data-v-7769879a]:hover{box-shadow:var(--ns-shadow-md)}.ns-card--flat[data-v-7769879a],.ns-card--flat[data-v-7769879a]:hover{box-shadow:none}.ns-card__header[data-v-7769879a]{font-family:var(--ns-font-family-display)}.ns-select[data-v-081cebe3],.ns-select[data-v-081cebe3] .q-field__label{font-family:var(--ns-font-family-text)}.ns-select[data-v-081cebe3] .q-field__control{border-radius:var(--ns-radius-md)}.ns-checkbox[data-v-2e481f8b],.ns-toggle[data-v-f8c90530],.ns-form[data-v-e20d14ce]{font-family:var(--ns-font-family-text)}.ns-dialog__card[data-v-4fca48ca]{border-radius:var(--ns-radius-lg);font-family:var(--ns-font-family-text);min-width:320px}.ns-dialog__header[data-v-4fca48ca]{font-family:var(--ns-font-family-display)}.ns-drawer[data-v-66ca96b0],.ns-expansion-item[data-v-c07366a7]{font-family:var(--ns-font-family-text)}.ns-banner[data-v-18ebd6f5]{font-family:var(--ns-font-family-text);border-radius:var(--ns-radius-md)}.ns-banner--info[data-v-18ebd6f5]{background-color:var(--ns-color-info-bg, #e3f2fd);color:var(--ns-color-info-text, #0d47a1)}.ns-banner--success[data-v-18ebd6f5]{background-color:var(--ns-color-success-bg, #e8f5e9);color:var(--ns-color-success-text, #1b5e20)}.ns-banner--warning[data-v-18ebd6f5]{background-color:var(--ns-color-warning-bg, #fff3e0);color:var(--ns-color-warning-text, #e65100)}.ns-banner--error[data-v-18ebd6f5]{background-color:var(--ns-color-error-bg, #ffebee);color:var(--ns-color-error-text, #b71c1c)}.ns-avatar[data-v-6a1b44b8]{font-family:var(--ns-font-family-text);font-weight:var(--ns-font-weight-medium)}.ns-chip[data-v-1a2191f1]{font-family:var(--ns-font-family-text);border-radius:var(--ns-radius-full, 9999px)}.ns-list[data-v-65aec20e]{font-family:var(--ns-font-family-text);border-radius:var(--ns-radius-md)}.ns-tooltip[data-v-9cb6af8f]{font-family:var(--ns-font-family-text);font-size:var(--ns-font-size-sm, .875rem);border-radius:var(--ns-radius-sm);padding:var(--ns-space-1, 4px) var(--ns-space-2, 8px)}.ns-badge[data-v-4ca05f24],.ns-breadcrumbs[data-v-dee98f71],.ns-breadcrumb-element[data-v-37bfe51b],.ns-button-toggle[data-v-93652c3e],.ns-card-actions[data-v-0d6f776d],.ns-card-section[data-v-781d42ef],.ns-footer[data-v-1fb919cd],.ns-header[data-v-80d27841],.ns-icon[data-v-d068ec18],.ns-image[data-v-c9c9f6c1],.ns-inner-loading[data-v-080672c1],.ns-item[data-v-47978f87],.ns-item-label[data-v-df6024af],.ns-item-section[data-v-340a753a],.ns-layout[data-v-cf90e270],.ns-linear-progress[data-v-79c6443f],.ns-menu[data-v-47a4b7d0],.ns-page[data-v-25e2841e],.ns-page-container[data-v-ac167da5],.ns-pagination[data-v-12fa9287],.ns-separator[data-v-0c2b2ac1],.ns-space[data-v-273ca5fc],.ns-spinner[data-v-5b99a17b],.ns-spinner-dots[data-v-20a70106],.ns-tab[data-v-b97f2cd1],.ns-table[data-v-a45d30cf],.ns-table-cell[data-v-ca0da61b],.ns-tab-panel[data-v-d8f64358],.ns-tab-panels[data-v-dec8ab0f],.ns-tabs[data-v-81224e01],.ns-timeline[data-v-1bf558aa],.ns-timeline-entry[data-v-fa149ea0],.ns-toolbar[data-v-e26a45db],.ns-toolbar-title[data-v-42928844]{font-family:var(--ns-font-family-text)}.ns-app-shell__menu-btn[data-v-d88db6ec],.ns-app-shell__search-btn[data-v-d88db6ec]{min-width:var(--ns-touch-target);min-height:var(--ns-touch-target)}.ns-app-shell__search-inline[data-v-d88db6ec]{min-width:200px;max-width:320px}.ns-app-shell__search-input[data-v-d88db6ec]{width:100%}.ns-app-shell__nav-item[data-v-d88db6ec]{min-height:var(--ns-touch-target)}.ns-app-shell__bottom-bar[data-v-d88db6ec]{padding-bottom:env(safe-area-inset-bottom,0px)}.ns-app-shell__bottom-tab[data-v-d88db6ec]{min-height:56px;min-width:var(--ns-touch-target)}.ns-app-shell__page--has-bottom-bar[data-v-d88db6ec]{padding-bottom:calc(56px + env(safe-area-inset-bottom,0px))}.ns-auth-layout__page[data-v-d70a792e]{display:flex;align-items:center;justify-content:center;min-height:inherit;padding:var(--ns-space-4)}.ns-auth-layout__container[data-v-d70a792e]{width:100%}.ns-auth-layout__branding[data-v-d70a792e]{text-align:center;margin-bottom:var(--ns-space-6)}.ns-auth-layout__card[data-v-d70a792e]{width:100%}
|