@nuralyui/layout 0.0.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.
@@ -0,0 +1,61 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html } from 'lit';
8
+ import { customElement, property } from 'lit/decorators.js';
9
+ import { NuralyUIBaseMixin } from '../../shared/base-mixin.js';
10
+ import { headerStyles } from './header.style.js';
11
+ /**
12
+ * # Header Component
13
+ *
14
+ * The top layout component with default styling.
15
+ * Must be placed inside a Layout component.
16
+ *
17
+ * @element nr-header
18
+ *
19
+ * @slot - Default slot for header content
20
+ *
21
+ * @csspart header - The header container element
22
+ *
23
+ * @example
24
+ * ```html
25
+ * <nr-layout>
26
+ * <nr-header>
27
+ * <div class="logo">My App</div>
28
+ * <nav>Navigation</nav>
29
+ * </nr-header>
30
+ * </nr-layout>
31
+ * ```
32
+ */
33
+ let NrHeaderElement = class NrHeaderElement extends NuralyUIBaseMixin(LitElement) {
34
+ constructor() {
35
+ super(...arguments);
36
+ /**
37
+ * Height of the header. Default is 64px.
38
+ */
39
+ this.height = '64px';
40
+ }
41
+ render() {
42
+ return html `
43
+ <header
44
+ class="nr-header"
45
+ part="header"
46
+ style="height: ${this.height}"
47
+ >
48
+ <slot></slot>
49
+ </header>
50
+ `;
51
+ }
52
+ };
53
+ NrHeaderElement.styles = headerStyles;
54
+ __decorate([
55
+ property({ type: String })
56
+ ], NrHeaderElement.prototype, "height", void 0);
57
+ NrHeaderElement = __decorate([
58
+ customElement('nr-header')
59
+ ], NrHeaderElement);
60
+ export { NrHeaderElement };
61
+ //# sourceMappingURL=header.component.js.map
@@ -0,0 +1,2 @@
1
+ export declare const headerStyles: import("lit").CSSResult;
2
+ //# sourceMappingURL=header.style.d.ts.map
@@ -0,0 +1,19 @@
1
+ import { css } from 'lit';
2
+ export const headerStyles = css `
3
+ :host {
4
+ display: block;
5
+ }
6
+
7
+ .nr-header {
8
+ display: flex;
9
+ align-items: center;
10
+ padding: var(--nuraly-layout-header-padding);
11
+ height: var(--nuraly-layout-header-height);
12
+ line-height: var(--nuraly-layout-header-height);
13
+ background: var(--nuraly-layout-header-background);
14
+ color: var(--nuraly-layout-header-text);
15
+ border-bottom: 1px solid var(--nuraly-layout-header-border);
16
+ transition: var(--nuraly-layout-transition);
17
+ }
18
+ `;
19
+ //# sourceMappingURL=header.style.js.map
package/index.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ export { NrLayoutElement } from './layout.component.js';
2
+ export { NrHeaderElement } from './header.component.js';
3
+ export { NrFooterElement } from './footer.component.js';
4
+ export { NrSiderElement } from './sider.component.js';
5
+ export { NrContentElement } from './content.component.js';
6
+ export type { LayoutBreakpoint, SiderTheme, SiderTrigger, OnBreakpoint, OnCollapse, LayoutProps, SiderProps, HeaderProps, FooterProps, ContentProps, } from './layout.types.js';
7
+ export { BREAKPOINT_VALUES } from './layout.types.js';
8
+ //# sourceMappingURL=index.d.ts.map
package/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { NrLayoutElement } from './layout.component.js';
2
+ export { NrHeaderElement } from './header.component.js';
3
+ export { NrFooterElement } from './footer.component.js';
4
+ export { NrSiderElement } from './sider.component.js';
5
+ export { NrContentElement } from './content.component.js';
6
+ export { BREAKPOINT_VALUES } from './layout.types.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,50 @@
1
+ import { LitElement } from 'lit';
2
+ declare const NrLayoutElement_base: (new (...args: any[]) => import("../../shared/dependency-mixin.js").DependencyAware) & (new (...args: any[]) => import("../../shared/theme-mixin.js").ThemeAware) & (new (...args: any[]) => import("../../shared/event-handler-mixin.js").EventHandlerCapable) & typeof LitElement;
3
+ /**
4
+ * # Layout Component
5
+ *
6
+ * The layout wrapper component that provides the base structure for a page layout.
7
+ * Can contain Header, Sider, Content, Footer, or nested Layout components.
8
+ *
9
+ * @element nr-layout
10
+ *
11
+ * @slot - Default slot for layout children (Header, Sider, Content, Footer, or nested Layout)
12
+ *
13
+ * @csspart layout - The layout container element
14
+ *
15
+ * @example
16
+ * ```html
17
+ * <nr-layout>
18
+ * <nr-header>Header</nr-header>
19
+ * <nr-content>Content</nr-content>
20
+ * <nr-footer>Footer</nr-footer>
21
+ * </nr-layout>
22
+ * ```
23
+ */
24
+ export declare class NrLayoutElement extends NrLayoutElement_base {
25
+ static styles: import("lit").CSSResult;
26
+ /**
27
+ * Whether the layout contains a Sider component.
28
+ * When true, the layout uses horizontal flex direction.
29
+ * Automatically detected from slotted content.
30
+ */
31
+ hasSider: boolean;
32
+ connectedCallback(): void;
33
+ updated(changedProperties: Map<string, unknown>): void;
34
+ /**
35
+ * Detects if the layout has a Sider component as a direct child
36
+ */
37
+ private detectSider;
38
+ /**
39
+ * Handles slot changes to re-detect sider elements
40
+ */
41
+ private handleSlotChange;
42
+ render(): import("lit").TemplateResult<1>;
43
+ }
44
+ declare global {
45
+ interface HTMLElementTagNameMap {
46
+ 'nr-layout': NrLayoutElement;
47
+ }
48
+ }
49
+ export {};
50
+ //# sourceMappingURL=layout.component.d.ts.map
@@ -0,0 +1,89 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html } from 'lit';
8
+ import { customElement, property, queryAssignedElements } from 'lit/decorators.js';
9
+ import { NuralyUIBaseMixin } from '../../shared/base-mixin.js';
10
+ import { layoutStyles } from './layout.style.js';
11
+ /**
12
+ * # Layout Component
13
+ *
14
+ * The layout wrapper component that provides the base structure for a page layout.
15
+ * Can contain Header, Sider, Content, Footer, or nested Layout components.
16
+ *
17
+ * @element nr-layout
18
+ *
19
+ * @slot - Default slot for layout children (Header, Sider, Content, Footer, or nested Layout)
20
+ *
21
+ * @csspart layout - The layout container element
22
+ *
23
+ * @example
24
+ * ```html
25
+ * <nr-layout>
26
+ * <nr-header>Header</nr-header>
27
+ * <nr-content>Content</nr-content>
28
+ * <nr-footer>Footer</nr-footer>
29
+ * </nr-layout>
30
+ * ```
31
+ */
32
+ let NrLayoutElement = class NrLayoutElement extends NuralyUIBaseMixin(LitElement) {
33
+ constructor() {
34
+ super(...arguments);
35
+ /**
36
+ * Whether the layout contains a Sider component.
37
+ * When true, the layout uses horizontal flex direction.
38
+ * Automatically detected from slotted content.
39
+ */
40
+ this.hasSider = false;
41
+ }
42
+ connectedCallback() {
43
+ super.connectedCallback();
44
+ this.detectSider();
45
+ }
46
+ updated(changedProperties) {
47
+ super.updated(changedProperties);
48
+ this.detectSider();
49
+ }
50
+ /**
51
+ * Detects if the layout has a Sider component as a direct child
52
+ */
53
+ detectSider() {
54
+ var _a;
55
+ const slot = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('slot');
56
+ if (slot) {
57
+ const assignedElements = slot.assignedElements();
58
+ const hasSiderElement = assignedElements.some((el) => el.tagName.toLowerCase() === 'nr-sider');
59
+ if (this.hasSider !== hasSiderElement) {
60
+ this.hasSider = hasSiderElement;
61
+ }
62
+ }
63
+ }
64
+ /**
65
+ * Handles slot changes to re-detect sider elements
66
+ */
67
+ handleSlotChange() {
68
+ this.detectSider();
69
+ }
70
+ render() {
71
+ return html `
72
+ <div class="nr-layout" part="layout">
73
+ <slot @slotchange=${this.handleSlotChange}></slot>
74
+ </div>
75
+ `;
76
+ }
77
+ };
78
+ NrLayoutElement.styles = layoutStyles;
79
+ __decorate([
80
+ property({ type: Boolean, reflect: true, attribute: 'has-sider' })
81
+ ], NrLayoutElement.prototype, "hasSider", void 0);
82
+ __decorate([
83
+ queryAssignedElements({ selector: 'nr-sider' })
84
+ ], NrLayoutElement.prototype, "connectedCallback", null);
85
+ NrLayoutElement = __decorate([
86
+ customElement('nr-layout')
87
+ ], NrLayoutElement);
88
+ export { NrLayoutElement };
89
+ //# sourceMappingURL=layout.component.js.map
@@ -0,0 +1,2 @@
1
+ export declare const layoutStyles: import("lit").CSSResult;
2
+ //# sourceMappingURL=layout.style.d.ts.map
@@ -0,0 +1,23 @@
1
+ import { css } from 'lit';
2
+ export const layoutStyles = css `
3
+ :host {
4
+ display: flex;
5
+ flex: auto;
6
+ flex-direction: column;
7
+ min-height: 0;
8
+ background: var(--nuraly-layout-background);
9
+ }
10
+
11
+ :host([has-sider]) {
12
+ flex-direction: row;
13
+ }
14
+
15
+ .nr-layout {
16
+ display: flex;
17
+ flex: auto;
18
+ flex-direction: inherit;
19
+ min-height: 0;
20
+ width: 100%;
21
+ }
22
+ `;
23
+ //# sourceMappingURL=layout.style.js.map
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Breakpoints for responsive layout
3
+ */
4
+ export declare const enum LayoutBreakpoint {
5
+ XS = "xs",
6
+ SM = "sm",
7
+ MD = "md",
8
+ LG = "lg",
9
+ XL = "xl",
10
+ XXL = "xxl"
11
+ }
12
+ /**
13
+ * Breakpoint width values in pixels
14
+ */
15
+ export declare const BREAKPOINT_VALUES: Record<LayoutBreakpoint, number>;
16
+ /**
17
+ * Sider theme options
18
+ */
19
+ export declare const enum SiderTheme {
20
+ Light = "light",
21
+ Dark = "dark"
22
+ }
23
+ /**
24
+ * Sider collapse trigger type
25
+ */
26
+ export declare type SiderTrigger = 'default' | null;
27
+ /**
28
+ * Callback for breakpoint changes
29
+ */
30
+ export declare type OnBreakpoint = (broken: boolean) => void;
31
+ /**
32
+ * Callback for collapse state changes
33
+ */
34
+ export declare type OnCollapse = (collapsed: boolean, type: 'clickTrigger' | 'responsive') => void;
35
+ /**
36
+ * Layout component properties
37
+ */
38
+ export interface LayoutProps {
39
+ hasSider?: boolean;
40
+ }
41
+ /**
42
+ * Sider component properties
43
+ */
44
+ export interface SiderProps {
45
+ breakpoint?: LayoutBreakpoint;
46
+ collapsed?: boolean;
47
+ collapsedWidth?: number;
48
+ collapsible?: boolean;
49
+ defaultCollapsed?: boolean;
50
+ reverseArrow?: boolean;
51
+ theme?: SiderTheme;
52
+ trigger?: SiderTrigger;
53
+ width?: number | string;
54
+ zeroWidthTriggerStyle?: string;
55
+ onBreakpoint?: OnBreakpoint;
56
+ onCollapse?: OnCollapse;
57
+ }
58
+ /**
59
+ * Header component properties
60
+ */
61
+ export interface HeaderProps {
62
+ height?: number | string;
63
+ }
64
+ /**
65
+ * Footer component properties
66
+ */
67
+ export interface FooterProps {
68
+ padding?: string;
69
+ }
70
+ /**
71
+ * Content component properties
72
+ */
73
+ export interface ContentProps {
74
+ }
75
+ //# sourceMappingURL=layout.types.d.ts.map
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Breakpoint width values in pixels
3
+ */
4
+ export const BREAKPOINT_VALUES = {
5
+ ["xs" /* LayoutBreakpoint.XS */]: 480,
6
+ ["sm" /* LayoutBreakpoint.SM */]: 576,
7
+ ["md" /* LayoutBreakpoint.MD */]: 768,
8
+ ["lg" /* LayoutBreakpoint.LG */]: 992,
9
+ ["xl" /* LayoutBreakpoint.XL */]: 1200,
10
+ ["xxl" /* LayoutBreakpoint.XXL */]: 1600,
11
+ };
12
+ //# sourceMappingURL=layout.types.js.map
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@nuralyui/layout",
3
+ "version": "0.0.1",
4
+ "description": "Layout components for NuralyUI - includes Layout, Header, Footer, Sider, and Content",
5
+ "type": "module",
6
+ "main": "index.js",
7
+ "module": "index.js",
8
+ "types": "index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./index.js",
12
+ "types": "./index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "*.js",
17
+ "*.d.ts",
18
+ "*.ts",
19
+ "!*.stories.ts",
20
+ "!*.test.ts"
21
+ ],
22
+ "keywords": [
23
+ "layout",
24
+ "header",
25
+ "footer",
26
+ "sider",
27
+ "sidebar",
28
+ "content",
29
+ "web-components",
30
+ "lit",
31
+ "nuralyui"
32
+ ],
33
+ "author": "NuralyUI Team",
34
+ "license": "MIT",
35
+ "peerDependencies": {
36
+ "lit": "^3.0.0"
37
+ }
38
+ }
package/react.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { NrLayoutElement } from './layout.component.js';
2
+ import { NrHeaderElement } from './header.component.js';
3
+ import { NrFooterElement } from './footer.component.js';
4
+ import { NrSiderElement } from './sider.component.js';
5
+ import { NrContentElement } from './content.component.js';
6
+ export declare const NrLayout: import("@lit-labs/react").ReactWebComponent<NrLayoutElement, {}>;
7
+ export declare const NrHeader: import("@lit-labs/react").ReactWebComponent<NrHeaderElement, {}>;
8
+ export declare const NrFooter: import("@lit-labs/react").ReactWebComponent<NrFooterElement, {}>;
9
+ export declare const NrSider: import("@lit-labs/react").ReactWebComponent<NrSiderElement, {
10
+ onCollapse: string;
11
+ onBreakpoint: string;
12
+ }>;
13
+ export declare const NrContent: import("@lit-labs/react").ReactWebComponent<NrContentElement, {}>;
14
+ //# sourceMappingURL=react.d.ts.map
package/react.js ADDED
@@ -0,0 +1,37 @@
1
+ import * as React from 'react';
2
+ import { createComponent } from '@lit-labs/react';
3
+ import { NrLayoutElement } from './layout.component.js';
4
+ import { NrHeaderElement } from './header.component.js';
5
+ import { NrFooterElement } from './footer.component.js';
6
+ import { NrSiderElement } from './sider.component.js';
7
+ import { NrContentElement } from './content.component.js';
8
+ export const NrLayout = createComponent({
9
+ tagName: 'nr-layout',
10
+ elementClass: NrLayoutElement,
11
+ react: React,
12
+ });
13
+ export const NrHeader = createComponent({
14
+ tagName: 'nr-header',
15
+ elementClass: NrHeaderElement,
16
+ react: React,
17
+ });
18
+ export const NrFooter = createComponent({
19
+ tagName: 'nr-footer',
20
+ elementClass: NrFooterElement,
21
+ react: React,
22
+ });
23
+ export const NrSider = createComponent({
24
+ tagName: 'nr-sider',
25
+ elementClass: NrSiderElement,
26
+ react: React,
27
+ events: {
28
+ onCollapse: 'collapse',
29
+ onBreakpoint: 'breakpoint',
30
+ },
31
+ });
32
+ export const NrContent = createComponent({
33
+ tagName: 'nr-content',
34
+ elementClass: NrContentElement,
35
+ react: React,
36
+ });
37
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1,116 @@
1
+ import { LitElement, PropertyValues } from 'lit';
2
+ import { LayoutBreakpoint, SiderTheme } from './layout.types.js';
3
+ declare const NrSiderElement_base: (new (...args: any[]) => import("../../shared/dependency-mixin.js").DependencyAware) & (new (...args: any[]) => import("../../shared/theme-mixin.js").ThemeAware) & (new (...args: any[]) => import("../../shared/event-handler-mixin.js").EventHandlerCapable) & typeof LitElement;
4
+ /**
5
+ * # Sider Component
6
+ *
7
+ * The sidebar component with collapsible functionality, theme support, and responsive behavior.
8
+ * Must be placed inside a Layout component.
9
+ *
10
+ * @element nr-sider
11
+ *
12
+ * @slot - Default slot for sider content (usually navigation menu)
13
+ * @slot trigger - Custom trigger slot (overrides default trigger)
14
+ *
15
+ * @fires collapse - Fired when the sider is collapsed or expanded
16
+ * @fires breakpoint - Fired when the breakpoint is triggered
17
+ *
18
+ * @csspart sider - The sider container element
19
+ * @csspart trigger - The collapse trigger element
20
+ *
21
+ * @example
22
+ * ```html
23
+ * <nr-layout has-sider>
24
+ * <nr-sider collapsible breakpoint="lg">
25
+ * <nav>Navigation Menu</nav>
26
+ * </nr-sider>
27
+ * <nr-content>Content</nr-content>
28
+ * </nr-layout>
29
+ * ```
30
+ */
31
+ export declare class NrSiderElement extends NrSiderElement_base {
32
+ static styles: import("lit").CSSResult;
33
+ /**
34
+ * Breakpoint for responsive collapsing
35
+ */
36
+ breakpoint?: LayoutBreakpoint;
37
+ /**
38
+ * Current collapsed state (controlled)
39
+ */
40
+ collapsed: boolean;
41
+ /**
42
+ * Width when collapsed. Set to 0 for a special trigger.
43
+ */
44
+ collapsedWidth: number;
45
+ /**
46
+ * Whether the sider can be collapsed
47
+ */
48
+ collapsible: boolean;
49
+ /**
50
+ * Initial collapsed state (uncontrolled)
51
+ */
52
+ defaultCollapsed: boolean;
53
+ /**
54
+ * Reverse the arrow direction (for right-side sider)
55
+ */
56
+ reverseArrow: boolean;
57
+ /**
58
+ * Sider theme (light or dark)
59
+ */
60
+ theme: SiderTheme;
61
+ /**
62
+ * Custom trigger element. Set to null to hide trigger.
63
+ */
64
+ trigger: 'default' | null;
65
+ /**
66
+ * Sider width when expanded
67
+ */
68
+ width: number | string;
69
+ /**
70
+ * Custom styles for zero-width trigger
71
+ */
72
+ zeroWidthTriggerStyle: string;
73
+ /**
74
+ * Internal state for tracking if breakpoint is active
75
+ */
76
+ private belowBreakpoint;
77
+ /**
78
+ * ResizeObserver for responsive behavior
79
+ */
80
+ private resizeObserver?;
81
+ connectedCallback(): void;
82
+ disconnectedCallback(): void;
83
+ updated(changedProperties: PropertyValues): void;
84
+ /**
85
+ * Setup ResizeObserver for responsive breakpoint behavior
86
+ */
87
+ private setupResizeObserver;
88
+ /**
89
+ * Toggle collapsed state
90
+ */
91
+ private toggleCollapse;
92
+ /**
93
+ * Dispatch collapse event
94
+ */
95
+ private dispatchCollapseEvent;
96
+ /**
97
+ * Dispatch breakpoint event
98
+ */
99
+ private dispatchBreakpointEvent;
100
+ /**
101
+ * Get the current width based on collapsed state
102
+ */
103
+ private getCurrentWidth;
104
+ /**
105
+ * Render the collapse trigger
106
+ */
107
+ private renderTrigger;
108
+ render(): import("lit").TemplateResult<1>;
109
+ }
110
+ declare global {
111
+ interface HTMLElementTagNameMap {
112
+ 'nr-sider': NrSiderElement;
113
+ }
114
+ }
115
+ export {};
116
+ //# sourceMappingURL=sider.component.d.ts.map