uisuite 1.0.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 ADDED
@@ -0,0 +1,225 @@
1
+ # UIsuite
2
+
3
+ Enterprise-grade Angular UI component library designed for ERP SAAS applications and enterprise software. Built with a focus on consistency, accessibility, and designer-friendly customization.
4
+
5
+ ## 🚀 Features
6
+
7
+ - ✨ **Modern & Clean Design** - Professional UI components that look great out of the box
8
+ - 🎨 **Fully Customizable** - CSS custom properties for easy theming
9
+ - ♿ **Accessible** - WCAG compliant with proper ARIA attributes and keyboard navigation
10
+ - 📦 **Tree-shakeable** - Only import what you need
11
+ - 🔧 **Reactive Forms Support** - Full integration with Angular reactive forms
12
+ - 📱 **Responsive** - Mobile-first design approach
13
+ - 🎯 **TypeScript** - Full type safety and IntelliSense support
14
+
15
+ ## 📦 Installation
16
+
17
+ ```bash
18
+ npm install uisuite
19
+ ```
20
+
21
+ ## 🎯 Quick Start
22
+
23
+ ### 1. Import Components
24
+
25
+ UIsuite uses standalone components, so you can import them directly:
26
+
27
+ ```typescript
28
+ import { Component } from '@angular/core';
29
+ import { UiButtonComponent, UiInputComponent, UiModalComponent } from 'uisuite';
30
+
31
+ @Component({
32
+ selector: 'app-root',
33
+ standalone: true,
34
+ imports: [UiButtonComponent, UiInputComponent, UiModalComponent],
35
+ template: `
36
+ <ui-button variant="primary">Click Me</ui-button>
37
+ <ui-input placeholder="Enter text"></ui-input>
38
+ `
39
+ })
40
+ export class AppComponent {}
41
+ ```
42
+
43
+ ### 2. Import Styles
44
+
45
+ Add the UIsuite stylesheet to your global styles (e.g., `styles.scss`):
46
+
47
+ ```scss
48
+ @import 'uisuite/styles/uisuite';
49
+ ```
50
+
51
+ Or import in your `angular.json`:
52
+
53
+ ```json
54
+ {
55
+ "styles": [
56
+ "node_modules/uisuite/styles/uisuite.scss",
57
+ "src/styles.scss"
58
+ ]
59
+ }
60
+ ```
61
+
62
+ ## 📚 Components
63
+
64
+ ### Button
65
+
66
+ Versatile button component with multiple variants and sizes.
67
+
68
+ ```html
69
+ <ui-button variant="primary" size="medium">Primary Button</ui-button>
70
+ <ui-button variant="secondary">Secondary Button</ui-button>
71
+ <ui-button variant="outline">Outline Button</ui-button>
72
+ <ui-button variant="ghost">Ghost Button</ui-button>
73
+ <ui-button variant="danger">Danger Button</ui-button>
74
+ <ui-button [loading]="true">Loading...</ui-button>
75
+ <ui-button [disabled]="true">Disabled</ui-button>
76
+ ```
77
+
78
+ **Props:**
79
+ - `variant`: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger'
80
+ - `size`: 'small' | 'medium' | 'large'
81
+ - `disabled`: boolean
82
+ - `loading`: boolean
83
+ - `fullWidth`: boolean
84
+
85
+ ### Input
86
+
87
+ Form input with validation states and character counting.
88
+
89
+ ```html
90
+ <ui-input
91
+ type="email"
92
+ placeholder="Enter email"
93
+ [formControl]="emailControl"
94
+ ></ui-input>
95
+
96
+ <ui-input
97
+ placeholder="With character limit"
98
+ [maxLength]="100"
99
+ [showCharCount]="true"
100
+ ></ui-input>
101
+ ```
102
+
103
+ **Props:**
104
+ - `type`: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search'
105
+ - `size`: 'small' | 'medium' | 'large'
106
+ - `placeholder`: string
107
+ - `disabled`: boolean
108
+ - `readonly`: boolean
109
+ - `required`: boolean
110
+ - `invalid`: boolean
111
+ - `maxLength`: number
112
+ - `showCharCount`: boolean
113
+
114
+ ### Checkbox
115
+
116
+ Checkbox with indeterminate state support.
117
+
118
+ ```html
119
+ <ui-checkbox label="Accept terms"></ui-checkbox>
120
+ <ui-checkbox [formControl]="agreeControl">I agree</ui-checkbox>
121
+ <ui-checkbox [indeterminate]="true"></ui-checkbox>
122
+ ```
123
+
124
+ **Props:**
125
+ - `label`: string
126
+ - `disabled`: boolean
127
+ - `indeterminate`: boolean
128
+
129
+ ### Modal
130
+
131
+ Flexible modal/dialog component.
132
+
133
+ ```html
134
+ <ui-modal
135
+ [(isOpen)]="showModal"
136
+ title="Confirm Action"
137
+ size="medium"
138
+ [showFooter]="true"
139
+ >
140
+ <p>Are you sure you want to proceed?</p>
141
+
142
+ <div modal-footer>
143
+ <ui-button variant="ghost" (click)="showModal = false">Cancel</ui-button>
144
+ <ui-button variant="primary" (click)="confirm()">Confirm</ui-button>
145
+ </div>
146
+ </ui-modal>
147
+ ```
148
+
149
+ **Props:**
150
+ - `isOpen`: boolean
151
+ - `title`: string
152
+ - `size`: 'small' | 'medium' | 'large' | 'fullscreen'
153
+ - `showHeader`: boolean
154
+ - `showFooter`: boolean
155
+ - `showCloseButton`: boolean
156
+ - `closeOnBackdropClick`: boolean
157
+ - `closeOnEscape`: boolean
158
+
159
+ **Events:**
160
+ - `(closed)`: Emitted when modal closes
161
+ - `(opened)`: Emitted when modal opens
162
+
163
+ ## 🎨 Theming
164
+
165
+ UIsuite uses CSS custom properties for easy customization. Override these variables in your global stylesheet:
166
+
167
+ ```css
168
+ :root {
169
+ /* Primary colors */
170
+ --ui-color-primary-600: #your-brand-color;
171
+ --ui-color-primary-700: #your-brand-color-dark;
172
+
173
+ /* Spacing */
174
+ --ui-spacing-4: 1rem;
175
+
176
+ /* Border radius */
177
+ --ui-radius-md: 0.5rem;
178
+
179
+ /* Typography */
180
+ --ui-font-family-base: 'Your Font', sans-serif;
181
+ }
182
+ ```
183
+
184
+ ## 🔧 Reactive Forms Integration
185
+
186
+ All form components implement `ControlValueAccessor` for seamless integration with Angular reactive forms:
187
+
188
+ ```typescript
189
+ import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
190
+ import { UiInputComponent, UiCheckboxComponent } from 'uisuite';
191
+
192
+ @Component({
193
+ selector: 'app-form',
194
+ standalone: true,
195
+ imports: [ReactiveFormsModule, UiInputComponent, UiCheckboxComponent],
196
+ template: `
197
+ <form [formGroup]="form">
198
+ <ui-input formControlName="email" type="email"></ui-input>
199
+ <ui-checkbox formControlName="agree"></ui-checkbox>
200
+ </form>
201
+ `
202
+ })
203
+ export class FormComponent {
204
+ form = new FormGroup({
205
+ email: new FormControl(''),
206
+ agree: new FormControl(false)
207
+ });
208
+ }
209
+ ```
210
+
211
+ ## 📖 Documentation
212
+
213
+ For detailed documentation and examples, visit [your-docs-url]
214
+
215
+ ## 🤝 Contributing
216
+
217
+ Contributions are welcome! Please feel free to submit a Pull Request.
218
+
219
+ ## 📄 License
220
+
221
+ MIT © [Your Name]
222
+
223
+ ## 🙏 Support
224
+
225
+ If you like this project, please give it a ⭐ on [GitHub](https://github.com/yourusername/uisuite)!
@@ -0,0 +1,91 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Button Component - Based on shadcn/ui
6
+ *
7
+ * A versatile button component with multiple variants and sizes.
8
+ *
9
+ * @example
10
+ * ```html
11
+ * <uButton>Click me</uButton>
12
+ * <uButton variant="outline" size="sm">Small Outline</uButton>
13
+ * <uButton variant="destructive">Delete</uButton>
14
+ * ```
15
+ */
16
+ export class ButtonComponent {
17
+ /**
18
+ * Button variant
19
+ * - default: Primary button style
20
+ * - outline: Outlined button
21
+ * - ghost: Minimal button with no border
22
+ * - destructive: For destructive actions (delete, remove, etc.)
23
+ * - secondary: Secondary action button
24
+ * - link: Renders as a link-styled button
25
+ */
26
+ variant = 'default';
27
+ /**
28
+ * Button size
29
+ * - default: Standard button size
30
+ * - sm: Small button
31
+ * - lg: Large button
32
+ * - icon: Square icon button (default size)
33
+ * - icon-sm: Small square icon button
34
+ * - icon-lg: Large square icon button
35
+ */
36
+ size = 'default';
37
+ /**
38
+ * HTML button type
39
+ */
40
+ type = 'button';
41
+ /**
42
+ * Whether the button is disabled
43
+ */
44
+ disabled = false;
45
+ /**
46
+ * ARIA label for accessibility
47
+ */
48
+ ariaLabel;
49
+ get buttonClasses() {
50
+ return [
51
+ 'u-button',
52
+ `u-button--${this.variant}`,
53
+ `u-button--${this.size}`
54
+ ].filter(Boolean).join(' ');
55
+ }
56
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
57
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ButtonComponent, isStandalone: true, selector: "uButton", inputs: { variant: "variant", size: "size", type: "type", disabled: "disabled", ariaLabel: "ariaLabel" }, ngImport: i0, template: `
58
+ <button
59
+ [type]="type"
60
+ [disabled]="disabled"
61
+ [class]="buttonClasses"
62
+ [attr.aria-label]="ariaLabel"
63
+ >
64
+ <ng-content></ng-content>
65
+ </button>
66
+ `, isInline: true, styles: [".u-button{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.375rem;font-size:.875rem;font-weight:500;transition:all .15s ease;cursor:pointer;border:1px solid transparent;outline:none}.u-button:focus-visible{outline:2px solid hsl(240,5%,64.9%);outline-offset:2px}.u-button:disabled{pointer-events:none;opacity:.5}.u-button--default{height:2.5rem;padding:.5rem 1rem}.u-button--sm{height:2.25rem;padding:.5rem .75rem;font-size:.813rem}.u-button--lg{height:2.75rem;padding:.5rem 2rem}.u-button--icon{height:2.5rem;width:2.5rem;padding:0}.u-button--icon-sm{height:2.25rem;width:2.25rem;padding:0}.u-button--icon-lg{height:2.75rem;width:2.75rem;padding:0}.u-button--default{background-color:#18181b;color:#fafafa}.u-button--default:hover:not(:disabled){background-color:#18181be6}.u-button--default:active:not(:disabled){background-color:#18181bcc}.u-button--outline{background-color:transparent;border-color:#e4e4e7;color:#09090b}.u-button--outline:hover:not(:disabled){background-color:#f4f4f5;border-color:#e4e4e7}.u-button--outline:active:not(:disabled){background-color:#e4e4e7}.u-button--ghost{background-color:transparent;border-color:transparent;color:#09090b}.u-button--ghost:hover:not(:disabled){background-color:#f4f4f5}.u-button--ghost:active:not(:disabled){background-color:#e4e4e7}.u-button--destructive{background-color:#ef4444;color:#fafafa}.u-button--destructive:hover:not(:disabled){background-color:#ef4444e6}.u-button--destructive:active:not(:disabled){background-color:#ef4444cc}.u-button--secondary{background-color:#f4f4f5;color:#18181b}.u-button--secondary:hover:not(:disabled){background-color:#e4e4e7}.u-button--secondary:active:not(:disabled){background-color:#d6d6db}.u-button--link{background-color:transparent;border-color:transparent;color:#18181b;text-decoration:underline;text-underline-offset:4px}.u-button--link:hover:not(:disabled){text-decoration:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
67
+ }
68
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ButtonComponent, decorators: [{
69
+ type: Component,
70
+ args: [{ selector: 'uButton', standalone: true, imports: [CommonModule], template: `
71
+ <button
72
+ [type]="type"
73
+ [disabled]="disabled"
74
+ [class]="buttonClasses"
75
+ [attr.aria-label]="ariaLabel"
76
+ >
77
+ <ng-content></ng-content>
78
+ </button>
79
+ `, styles: [".u-button{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.375rem;font-size:.875rem;font-weight:500;transition:all .15s ease;cursor:pointer;border:1px solid transparent;outline:none}.u-button:focus-visible{outline:2px solid hsl(240,5%,64.9%);outline-offset:2px}.u-button:disabled{pointer-events:none;opacity:.5}.u-button--default{height:2.5rem;padding:.5rem 1rem}.u-button--sm{height:2.25rem;padding:.5rem .75rem;font-size:.813rem}.u-button--lg{height:2.75rem;padding:.5rem 2rem}.u-button--icon{height:2.5rem;width:2.5rem;padding:0}.u-button--icon-sm{height:2.25rem;width:2.25rem;padding:0}.u-button--icon-lg{height:2.75rem;width:2.75rem;padding:0}.u-button--default{background-color:#18181b;color:#fafafa}.u-button--default:hover:not(:disabled){background-color:#18181be6}.u-button--default:active:not(:disabled){background-color:#18181bcc}.u-button--outline{background-color:transparent;border-color:#e4e4e7;color:#09090b}.u-button--outline:hover:not(:disabled){background-color:#f4f4f5;border-color:#e4e4e7}.u-button--outline:active:not(:disabled){background-color:#e4e4e7}.u-button--ghost{background-color:transparent;border-color:transparent;color:#09090b}.u-button--ghost:hover:not(:disabled){background-color:#f4f4f5}.u-button--ghost:active:not(:disabled){background-color:#e4e4e7}.u-button--destructive{background-color:#ef4444;color:#fafafa}.u-button--destructive:hover:not(:disabled){background-color:#ef4444e6}.u-button--destructive:active:not(:disabled){background-color:#ef4444cc}.u-button--secondary{background-color:#f4f4f5;color:#18181b}.u-button--secondary:hover:not(:disabled){background-color:#e4e4e7}.u-button--secondary:active:not(:disabled){background-color:#d6d6db}.u-button--link{background-color:transparent;border-color:transparent;color:#18181b;text-decoration:underline;text-underline-offset:4px}.u-button--link:hover:not(:disabled){text-decoration:none}\n"] }]
80
+ }], propDecorators: { variant: [{
81
+ type: Input
82
+ }], size: [{
83
+ type: Input
84
+ }], type: [{
85
+ type: Input
86
+ }], disabled: [{
87
+ type: Input
88
+ }], ariaLabel: [{
89
+ type: Input
90
+ }] } });
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Vpc3VpdGUvc3JjL2xpYi9idXR0b24vYnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBSy9DOzs7Ozs7Ozs7OztHQVdHO0FBaUJILE1BQU0sT0FBTyxlQUFlO0lBQ3hCOzs7Ozs7OztPQVFHO0lBQ00sT0FBTyxHQUFrQixTQUFTLENBQUM7SUFFNUM7Ozs7Ozs7O09BUUc7SUFDTSxJQUFJLEdBQWUsU0FBUyxDQUFDO0lBRXRDOztPQUVHO0lBQ00sSUFBSSxHQUFrQyxRQUFRLENBQUM7SUFFeEQ7O09BRUc7SUFDTSxRQUFRLEdBQVksS0FBSyxDQUFDO0lBRW5DOztPQUVHO0lBQ00sU0FBUyxDQUFVO0lBRTVCLElBQUksYUFBYTtRQUNiLE9BQU87WUFDSCxVQUFVO1lBQ1YsYUFBYSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzNCLGFBQWEsSUFBSSxDQUFDLElBQUksRUFBRTtTQUMzQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQzt3R0E1Q1EsZUFBZTs0RkFBZixlQUFlLDZLQVpkOzs7Ozs7Ozs7R0FTWCxvOURBVlcsWUFBWTs7NEZBYWIsZUFBZTtrQkFoQjNCLFNBQVM7K0JBQ0ksU0FBUyxjQUNQLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiOzs7Ozs7Ozs7R0FTWDs4QkFhVSxPQUFPO3NCQUFmLEtBQUs7Z0JBV0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuZXhwb3J0IHR5cGUgQnV0dG9uVmFyaWFudCA9ICdkZWZhdWx0JyB8ICdvdXRsaW5lJyB8ICdnaG9zdCcgfCAnZGVzdHJ1Y3RpdmUnIHwgJ3NlY29uZGFyeScgfCAnbGluayc7XG5leHBvcnQgdHlwZSBCdXR0b25TaXplID0gJ2RlZmF1bHQnIHwgJ3NtJyB8ICdsZycgfCAnaWNvbicgfCAnaWNvbi1zbScgfCAnaWNvbi1sZyc7XG5cbi8qKlxuICogQnV0dG9uIENvbXBvbmVudCAtIEJhc2VkIG9uIHNoYWRjbi91aVxuICogXG4gKiBBIHZlcnNhdGlsZSBidXR0b24gY29tcG9uZW50IHdpdGggbXVsdGlwbGUgdmFyaWFudHMgYW5kIHNpemVzLlxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHVCdXR0b24+Q2xpY2sgbWU8L3VCdXR0b24+XG4gKiA8dUJ1dHRvbiB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9XCJzbVwiPlNtYWxsIE91dGxpbmU8L3VCdXR0b24+XG4gKiA8dUJ1dHRvbiB2YXJpYW50PVwiZGVzdHJ1Y3RpdmVcIj5EZWxldGU8L3VCdXR0b24+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd1QnV0dG9uJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvblxuICAgICAgW3R5cGVdPVwidHlwZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzXT1cImJ1dHRvbkNsYXNzZXNcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2J1dHRvbj5cbiAgYCxcbiAgICBzdHlsZVVybHM6IFsnLi9idXR0b24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCdXR0b25Db21wb25lbnQge1xuICAgIC8qKlxuICAgICAqIEJ1dHRvbiB2YXJpYW50XG4gICAgICogLSBkZWZhdWx0OiBQcmltYXJ5IGJ1dHRvbiBzdHlsZVxuICAgICAqIC0gb3V0bGluZTogT3V0bGluZWQgYnV0dG9uXG4gICAgICogLSBnaG9zdDogTWluaW1hbCBidXR0b24gd2l0aCBubyBib3JkZXJcbiAgICAgKiAtIGRlc3RydWN0aXZlOiBGb3IgZGVzdHJ1Y3RpdmUgYWN0aW9ucyAoZGVsZXRlLCByZW1vdmUsIGV0Yy4pXG4gICAgICogLSBzZWNvbmRhcnk6IFNlY29uZGFyeSBhY3Rpb24gYnV0dG9uXG4gICAgICogLSBsaW5rOiBSZW5kZXJzIGFzIGEgbGluay1zdHlsZWQgYnV0dG9uXG4gICAgICovXG4gICAgQElucHV0KCkgdmFyaWFudDogQnV0dG9uVmFyaWFudCA9ICdkZWZhdWx0JztcblxuICAgIC8qKlxuICAgICAqIEJ1dHRvbiBzaXplXG4gICAgICogLSBkZWZhdWx0OiBTdGFuZGFyZCBidXR0b24gc2l6ZVxuICAgICAqIC0gc206IFNtYWxsIGJ1dHRvblxuICAgICAqIC0gbGc6IExhcmdlIGJ1dHRvblxuICAgICAqIC0gaWNvbjogU3F1YXJlIGljb24gYnV0dG9uIChkZWZhdWx0IHNpemUpXG4gICAgICogLSBpY29uLXNtOiBTbWFsbCBzcXVhcmUgaWNvbiBidXR0b25cbiAgICAgKiAtIGljb24tbGc6IExhcmdlIHNxdWFyZSBpY29uIGJ1dHRvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNpemU6IEJ1dHRvblNpemUgPSAnZGVmYXVsdCc7XG5cbiAgICAvKipcbiAgICAgKiBIVE1MIGJ1dHRvbiB0eXBlXG4gICAgICovXG4gICAgQElucHV0KCkgdHlwZTogJ2J1dHRvbicgfCAnc3VibWl0JyB8ICdyZXNldCcgPSAnYnV0dG9uJztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBUklBIGxhYmVsIGZvciBhY2Nlc3NpYmlsaXR5XG4gICAgICovXG4gICAgQElucHV0KCkgYXJpYUxhYmVsPzogc3RyaW5nO1xuXG4gICAgZ2V0IGJ1dHRvbkNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd1LWJ1dHRvbicsXG4gICAgICAgICAgICBgdS1idXR0b24tLSR7dGhpcy52YXJpYW50fWAsXG4gICAgICAgICAgICBgdS1idXR0b24tLSR7dGhpcy5zaXplfWBcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ /*
2
+ * Public API Surface of uisuite
3
+ *
4
+ * This file exports all components, directives, and services.
5
+ */
6
+ // Version
7
+ export const UISUITE_VERSION = '0.0.0';
8
+ // Components
9
+ export * from './lib/button/button.component';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3Vpc3VpdGUvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILFVBQVU7QUFDVixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBRXZDLGFBQWE7QUFDYixjQUFjLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiB1aXN1aXRlXG4gKiBcbiAqIFRoaXMgZmlsZSBleHBvcnRzIGFsbCBjb21wb25lbnRzLCBkaXJlY3RpdmVzLCBhbmQgc2VydmljZXMuXG4gKi9cblxuLy8gVmVyc2lvblxuZXhwb3J0IGNvbnN0IFVJU1VJVEVfVkVSU0lPTiA9ICcwLjAuMCc7XG5cbi8vIENvbXBvbmVudHNcbmV4cG9ydCAqIGZyb20gJy4vbGliL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWlzdWl0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3Vpc3VpdGUvc3JjL3Vpc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,106 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component, Input } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+
5
+ /**
6
+ * Button Component - Based on shadcn/ui
7
+ *
8
+ * A versatile button component with multiple variants and sizes.
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <uButton>Click me</uButton>
13
+ * <uButton variant="outline" size="sm">Small Outline</uButton>
14
+ * <uButton variant="destructive">Delete</uButton>
15
+ * ```
16
+ */
17
+ class ButtonComponent {
18
+ /**
19
+ * Button variant
20
+ * - default: Primary button style
21
+ * - outline: Outlined button
22
+ * - ghost: Minimal button with no border
23
+ * - destructive: For destructive actions (delete, remove, etc.)
24
+ * - secondary: Secondary action button
25
+ * - link: Renders as a link-styled button
26
+ */
27
+ variant = 'default';
28
+ /**
29
+ * Button size
30
+ * - default: Standard button size
31
+ * - sm: Small button
32
+ * - lg: Large button
33
+ * - icon: Square icon button (default size)
34
+ * - icon-sm: Small square icon button
35
+ * - icon-lg: Large square icon button
36
+ */
37
+ size = 'default';
38
+ /**
39
+ * HTML button type
40
+ */
41
+ type = 'button';
42
+ /**
43
+ * Whether the button is disabled
44
+ */
45
+ disabled = false;
46
+ /**
47
+ * ARIA label for accessibility
48
+ */
49
+ ariaLabel;
50
+ get buttonClasses() {
51
+ return [
52
+ 'u-button',
53
+ `u-button--${this.variant}`,
54
+ `u-button--${this.size}`
55
+ ].filter(Boolean).join(' ');
56
+ }
57
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
58
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ButtonComponent, isStandalone: true, selector: "uButton", inputs: { variant: "variant", size: "size", type: "type", disabled: "disabled", ariaLabel: "ariaLabel" }, ngImport: i0, template: `
59
+ <button
60
+ [type]="type"
61
+ [disabled]="disabled"
62
+ [class]="buttonClasses"
63
+ [attr.aria-label]="ariaLabel"
64
+ >
65
+ <ng-content></ng-content>
66
+ </button>
67
+ `, isInline: true, styles: [".u-button{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.375rem;font-size:.875rem;font-weight:500;transition:all .15s ease;cursor:pointer;border:1px solid transparent;outline:none}.u-button:focus-visible{outline:2px solid hsl(240,5%,64.9%);outline-offset:2px}.u-button:disabled{pointer-events:none;opacity:.5}.u-button--default{height:2.5rem;padding:.5rem 1rem}.u-button--sm{height:2.25rem;padding:.5rem .75rem;font-size:.813rem}.u-button--lg{height:2.75rem;padding:.5rem 2rem}.u-button--icon{height:2.5rem;width:2.5rem;padding:0}.u-button--icon-sm{height:2.25rem;width:2.25rem;padding:0}.u-button--icon-lg{height:2.75rem;width:2.75rem;padding:0}.u-button--default{background-color:#18181b;color:#fafafa}.u-button--default:hover:not(:disabled){background-color:#18181be6}.u-button--default:active:not(:disabled){background-color:#18181bcc}.u-button--outline{background-color:transparent;border-color:#e4e4e7;color:#09090b}.u-button--outline:hover:not(:disabled){background-color:#f4f4f5;border-color:#e4e4e7}.u-button--outline:active:not(:disabled){background-color:#e4e4e7}.u-button--ghost{background-color:transparent;border-color:transparent;color:#09090b}.u-button--ghost:hover:not(:disabled){background-color:#f4f4f5}.u-button--ghost:active:not(:disabled){background-color:#e4e4e7}.u-button--destructive{background-color:#ef4444;color:#fafafa}.u-button--destructive:hover:not(:disabled){background-color:#ef4444e6}.u-button--destructive:active:not(:disabled){background-color:#ef4444cc}.u-button--secondary{background-color:#f4f4f5;color:#18181b}.u-button--secondary:hover:not(:disabled){background-color:#e4e4e7}.u-button--secondary:active:not(:disabled){background-color:#d6d6db}.u-button--link{background-color:transparent;border-color:transparent;color:#18181b;text-decoration:underline;text-underline-offset:4px}.u-button--link:hover:not(:disabled){text-decoration:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
68
+ }
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ButtonComponent, decorators: [{
70
+ type: Component,
71
+ args: [{ selector: 'uButton', standalone: true, imports: [CommonModule], template: `
72
+ <button
73
+ [type]="type"
74
+ [disabled]="disabled"
75
+ [class]="buttonClasses"
76
+ [attr.aria-label]="ariaLabel"
77
+ >
78
+ <ng-content></ng-content>
79
+ </button>
80
+ `, styles: [".u-button{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.375rem;font-size:.875rem;font-weight:500;transition:all .15s ease;cursor:pointer;border:1px solid transparent;outline:none}.u-button:focus-visible{outline:2px solid hsl(240,5%,64.9%);outline-offset:2px}.u-button:disabled{pointer-events:none;opacity:.5}.u-button--default{height:2.5rem;padding:.5rem 1rem}.u-button--sm{height:2.25rem;padding:.5rem .75rem;font-size:.813rem}.u-button--lg{height:2.75rem;padding:.5rem 2rem}.u-button--icon{height:2.5rem;width:2.5rem;padding:0}.u-button--icon-sm{height:2.25rem;width:2.25rem;padding:0}.u-button--icon-lg{height:2.75rem;width:2.75rem;padding:0}.u-button--default{background-color:#18181b;color:#fafafa}.u-button--default:hover:not(:disabled){background-color:#18181be6}.u-button--default:active:not(:disabled){background-color:#18181bcc}.u-button--outline{background-color:transparent;border-color:#e4e4e7;color:#09090b}.u-button--outline:hover:not(:disabled){background-color:#f4f4f5;border-color:#e4e4e7}.u-button--outline:active:not(:disabled){background-color:#e4e4e7}.u-button--ghost{background-color:transparent;border-color:transparent;color:#09090b}.u-button--ghost:hover:not(:disabled){background-color:#f4f4f5}.u-button--ghost:active:not(:disabled){background-color:#e4e4e7}.u-button--destructive{background-color:#ef4444;color:#fafafa}.u-button--destructive:hover:not(:disabled){background-color:#ef4444e6}.u-button--destructive:active:not(:disabled){background-color:#ef4444cc}.u-button--secondary{background-color:#f4f4f5;color:#18181b}.u-button--secondary:hover:not(:disabled){background-color:#e4e4e7}.u-button--secondary:active:not(:disabled){background-color:#d6d6db}.u-button--link{background-color:transparent;border-color:transparent;color:#18181b;text-decoration:underline;text-underline-offset:4px}.u-button--link:hover:not(:disabled){text-decoration:none}\n"] }]
81
+ }], propDecorators: { variant: [{
82
+ type: Input
83
+ }], size: [{
84
+ type: Input
85
+ }], type: [{
86
+ type: Input
87
+ }], disabled: [{
88
+ type: Input
89
+ }], ariaLabel: [{
90
+ type: Input
91
+ }] } });
92
+
93
+ /*
94
+ * Public API Surface of uisuite
95
+ *
96
+ * This file exports all components, directives, and services.
97
+ */
98
+ // Version
99
+ const UISUITE_VERSION = '0.0.0';
100
+
101
+ /**
102
+ * Generated bundle index. Do not edit.
103
+ */
104
+
105
+ export { ButtonComponent, UISUITE_VERSION };
106
+ //# sourceMappingURL=uisuite.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uisuite.mjs","sources":["../../../projects/uisuite/src/lib/button/button.component.ts","../../../projects/uisuite/src/public-api.ts","../../../projects/uisuite/src/uisuite.ts"],"sourcesContent":["import { Component, Input, HostBinding } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport type ButtonVariant = 'default' | 'outline' | 'ghost' | 'destructive' | 'secondary' | 'link';\nexport type ButtonSize = 'default' | 'sm' | 'lg' | 'icon' | 'icon-sm' | 'icon-lg';\n\n/**\n * Button Component - Based on shadcn/ui\n * \n * A versatile button component with multiple variants and sizes.\n * \n * @example\n * ```html\n * <uButton>Click me</uButton>\n * <uButton variant=\"outline\" size=\"sm\">Small Outline</uButton>\n * <uButton variant=\"destructive\">Delete</uButton>\n * ```\n */\n@Component({\n selector: 'uButton',\n standalone: true,\n imports: [CommonModule],\n template: `\n <button\n [type]=\"type\"\n [disabled]=\"disabled\"\n [class]=\"buttonClasses\"\n [attr.aria-label]=\"ariaLabel\"\n >\n <ng-content></ng-content>\n </button>\n `,\n styleUrls: ['./button.component.scss']\n})\nexport class ButtonComponent {\n /**\n * Button variant\n * - default: Primary button style\n * - outline: Outlined button\n * - ghost: Minimal button with no border\n * - destructive: For destructive actions (delete, remove, etc.)\n * - secondary: Secondary action button\n * - link: Renders as a link-styled button\n */\n @Input() variant: ButtonVariant = 'default';\n\n /**\n * Button size\n * - default: Standard button size\n * - sm: Small button\n * - lg: Large button\n * - icon: Square icon button (default size)\n * - icon-sm: Small square icon button\n * - icon-lg: Large square icon button\n */\n @Input() size: ButtonSize = 'default';\n\n /**\n * HTML button type\n */\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\n\n /**\n * Whether the button is disabled\n */\n @Input() disabled: boolean = false;\n\n /**\n * ARIA label for accessibility\n */\n @Input() ariaLabel?: string;\n\n get buttonClasses(): string {\n return [\n 'u-button',\n `u-button--${this.variant}`,\n `u-button--${this.size}`\n ].filter(Boolean).join(' ');\n }\n}\n","/*\n * Public API Surface of uisuite\n * \n * This file exports all components, directives, and services.\n */\n\n// Version\nexport const UISUITE_VERSION = '0.0.0';\n\n// Components\nexport * from './lib/button/button.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAMA;;;;;;;;;;;AAWG;MAiBU,eAAe,CAAA;AACxB;;;;;;;;AAQG;IACM,OAAO,GAAkB,SAAS,CAAC;AAE5C;;;;;;;;AAQG;IACM,IAAI,GAAe,SAAS,CAAC;AAEtC;;AAEG;IACM,IAAI,GAAkC,QAAQ,CAAC;AAExD;;AAEG;IACM,QAAQ,GAAY,KAAK,CAAC;AAEnC;;AAEG;AACM,IAAA,SAAS,CAAU;AAE5B,IAAA,IAAI,aAAa,GAAA;QACb,OAAO;YACH,UAAU;YACV,CAAa,UAAA,EAAA,IAAI,CAAC,OAAO,CAAE,CAAA;YAC3B,CAAa,UAAA,EAAA,IAAI,CAAC,IAAI,CAAE,CAAA;SAC3B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC/B;wGA5CQ,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAZd,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;AASX,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,64DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAVW,YAAY,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAab,eAAe,EAAA,UAAA,EAAA,CAAA;kBAhB3B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,cACP,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EACb,QAAA,EAAA,CAAA;;;;;;;;;AASX,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,64DAAA,CAAA,EAAA,CAAA;8BAaU,OAAO,EAAA,CAAA;sBAAf,KAAK;gBAWG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBAKG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBAKG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBAKG,SAAS,EAAA,CAAA;sBAAjB,KAAK;;;ACtEV;;;;AAIG;AAEH;AACO,MAAM,eAAe,GAAG;;ACP/B;;AAEG;;;;"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="uisuite" />
5
+ export * from './public-api';
@@ -0,0 +1,52 @@
1
+ import * as i0 from "@angular/core";
2
+ export type ButtonVariant = 'default' | 'outline' | 'ghost' | 'destructive' | 'secondary' | 'link';
3
+ export type ButtonSize = 'default' | 'sm' | 'lg' | 'icon' | 'icon-sm' | 'icon-lg';
4
+ /**
5
+ * Button Component - Based on shadcn/ui
6
+ *
7
+ * A versatile button component with multiple variants and sizes.
8
+ *
9
+ * @example
10
+ * ```html
11
+ * <uButton>Click me</uButton>
12
+ * <uButton variant="outline" size="sm">Small Outline</uButton>
13
+ * <uButton variant="destructive">Delete</uButton>
14
+ * ```
15
+ */
16
+ export declare class ButtonComponent {
17
+ /**
18
+ * Button variant
19
+ * - default: Primary button style
20
+ * - outline: Outlined button
21
+ * - ghost: Minimal button with no border
22
+ * - destructive: For destructive actions (delete, remove, etc.)
23
+ * - secondary: Secondary action button
24
+ * - link: Renders as a link-styled button
25
+ */
26
+ variant: ButtonVariant;
27
+ /**
28
+ * Button size
29
+ * - default: Standard button size
30
+ * - sm: Small button
31
+ * - lg: Large button
32
+ * - icon: Square icon button (default size)
33
+ * - icon-sm: Small square icon button
34
+ * - icon-lg: Large square icon button
35
+ */
36
+ size: ButtonSize;
37
+ /**
38
+ * HTML button type
39
+ */
40
+ type: 'button' | 'submit' | 'reset';
41
+ /**
42
+ * Whether the button is disabled
43
+ */
44
+ disabled: boolean;
45
+ /**
46
+ * ARIA label for accessibility
47
+ */
48
+ ariaLabel?: string;
49
+ get buttonClasses(): string;
50
+ static ɵfac: i0.ɵɵFactoryDeclaration<ButtonComponent, never>;
51
+ static ɵcmp: i0.ɵɵComponentDeclaration<ButtonComponent, "uButton", never, { "variant": { "alias": "variant"; "required": false; }; "size": { "alias": "size"; "required": false; }; "type": { "alias": "type"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, {}, never, ["*"], true, never>;
52
+ }
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "uisuite",
3
+ "version": "1.0.0",
4
+ "description": "Enterprise Angular UI component library for ERP SAAS applications. Designer-friendly, consistent, and accessible components.",
5
+ "keywords": [
6
+ "angular",
7
+ "ui",
8
+ "components",
9
+ "library",
10
+ "erp",
11
+ "saas",
12
+ "design-system",
13
+ "ui-library",
14
+ "angular-components",
15
+ "enterprise"
16
+ ],
17
+ "author": "Your Name",
18
+ "license": "MIT",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/yourusername/uisuite"
22
+ },
23
+ "peerDependencies": {
24
+ "@angular/common": "^18.0.0",
25
+ "@angular/core": "^18.0.0"
26
+ },
27
+ "dependencies": {
28
+ "tslib": "^2.3.0"
29
+ },
30
+ "sideEffects": false,
31
+ "module": "fesm2022/uisuite.mjs",
32
+ "typings": "index.d.ts",
33
+ "exports": {
34
+ "./package.json": {
35
+ "default": "./package.json"
36
+ },
37
+ ".": {
38
+ "types": "./index.d.ts",
39
+ "esm2022": "./esm2022/uisuite.mjs",
40
+ "esm": "./esm2022/uisuite.mjs",
41
+ "default": "./fesm2022/uisuite.mjs"
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,2 @@
1
+ export declare const UISUITE_VERSION = "0.0.0";
2
+ export * from './lib/button/button.component';
Binary file