@nonsuch/component-library 0.7.2 → 0.9.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.
@@ -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,2 @@
1
+ export { default as NsAppShell } from './NsAppShell.vue';
2
+ export type { NsAppShellTab, NsAppShellNavItem } from './types';
@@ -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';
package/dist/index.d.ts CHANGED
@@ -100,6 +100,13 @@ export { default as NsToolbar } from './components/NsToolbar/NsToolbar.vue';
100
100
  export type { NsToolbarProps } from './components/NsToolbar/NsToolbar.vue';
101
101
  export { default as NsToolbarTitle } from './components/NsToolbarTitle/NsToolbarTitle.vue';
102
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';
103
110
  export { createNonsuch } from './plugin';
104
111
  export type { NsPluginOptions } from './plugin';
105
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-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)}
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%}