@uni-design-system/uni-angular 2.0.1 → 2.0.3
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/package.json +18 -31
- package/.storybook/main.ts +0 -41
- package/.storybook/manager.ts +0 -24
- package/.storybook/preview.ts +0 -21
- package/.storybook/tsconfig.json +0 -24
- package/.storybook/typings.d.ts +0 -4
- package/.storybook/vite.config.ts +0 -7
- package/.turbo/turbo-build.log +0 -25
- package/CHANGELOG.md +0 -28
- package/angular.json +0 -47
- package/ng-package.json +0 -7
- package/src/lib/button.component.ts +0 -28
- package/src/lib/button.stories.ts +0 -20
- package/src/lib/cdk/datasource/base-datasource.ts +0 -113
- package/src/lib/cdk/datasource/datasource.types.ts +0 -10
- package/src/lib/cdk/datasource/record-datasource.ts +0 -115
- package/src/lib/cdk/datasource/server-side-datasource.ts +0 -172
- package/src/lib/cdk/helpers/memoize.helper.ts +0 -15
- package/src/lib/cdk/helpers/number.helper.ts +0 -2
- package/src/lib/cdk/index.ts +0 -3
- package/src/lib/cdk/local-storage/local-storage.service.ts +0 -124
- package/src/lib/cdk/option/option.model.ts +0 -6
- package/src/lib/cdk/timer/timer.ts +0 -66
- package/src/lib/components/text/text.component.ts +0 -57
- package/src/lib/components/text/text.mdx +0 -15
- package/src/lib/components/text/text.stories.ts +0 -39
- package/src/lib/theming/theme.service.ts +0 -270
- package/src/lib/theming/theme.token.ts +0 -7
- package/src/public-api.ts +0 -1
- package/src/stories/blocks/StoryUsage.tsx +0 -21
- package/tsconfig.json +0 -19
- /package/{dist/fesm2022 → fesm2022}/uni-design-system-uni-angular.mjs +0 -0
- /package/{dist/fesm2022 → fesm2022}/uni-design-system-uni-angular.mjs.map +0 -0
- /package/{dist/types → types}/uni-design-system-uni-angular.d.ts +0 -0
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
computed,
|
|
3
|
-
linkedSignal,
|
|
4
|
-
resource,
|
|
5
|
-
ResourceLoaderParams,
|
|
6
|
-
ResourceRef,
|
|
7
|
-
type ResourceStatus,
|
|
8
|
-
signal,
|
|
9
|
-
} from '@angular/core';
|
|
10
|
-
import { UniBaseDatasource, Sort, SortDirection } from './base-datasource';
|
|
11
|
-
|
|
12
|
-
export interface PageRequest {
|
|
13
|
-
pageNumber: number;
|
|
14
|
-
pageSize: number;
|
|
15
|
-
sortColumn?: string;
|
|
16
|
-
sortDirection?: SortDirection;
|
|
17
|
-
filter?: Record<string, any>;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface PageResponse<T> {
|
|
21
|
-
data: T[];
|
|
22
|
-
totalRecords: number;
|
|
23
|
-
pageNumber: number;
|
|
24
|
-
pageSize: number;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export type DataLoader<T> = (request: PageRequest) => Promise<PageResponse<T>>;
|
|
28
|
-
|
|
29
|
-
export class UniServerSideDatasource<T> extends UniBaseDatasource<T> {
|
|
30
|
-
private _pageNumber = signal(1);
|
|
31
|
-
private _pageSize = signal(10);
|
|
32
|
-
private _sortColumn = signal<keyof T | undefined>(undefined);
|
|
33
|
-
private _sortDirection = signal<SortDirection>('indet');
|
|
34
|
-
private filter = signal<Record<string, any>>({});
|
|
35
|
-
|
|
36
|
-
override sortColumn = computed(() => this._sortColumn());
|
|
37
|
-
override sortDirection = computed(() => this._sortDirection());
|
|
38
|
-
|
|
39
|
-
private totalRecords = signal(0);
|
|
40
|
-
|
|
41
|
-
private dataResource: ResourceRef<PageResponse<T> | undefined>;
|
|
42
|
-
|
|
43
|
-
override pageIndex = computed(() => this._pageNumber() - 1);
|
|
44
|
-
override pageSize = computed(() => this._pageSize());
|
|
45
|
-
|
|
46
|
-
override pageCount = computed(() => {
|
|
47
|
-
const total = this.totalRecords();
|
|
48
|
-
const size = this.pageSize();
|
|
49
|
-
return total > 0 ? Math.ceil(total / size) : 0;
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
private readonly _records = linkedSignal<
|
|
53
|
-
{
|
|
54
|
-
val: PageResponse<T> | undefined;
|
|
55
|
-
status: ResourceStatus;
|
|
56
|
-
},
|
|
57
|
-
T[]
|
|
58
|
-
>({
|
|
59
|
-
source: () => ({
|
|
60
|
-
val: this.dataResource.value(),
|
|
61
|
-
status: this.dataResource.status(),
|
|
62
|
-
}),
|
|
63
|
-
computation: (source, previous) => {
|
|
64
|
-
if (source.status === 'loading' && previous) {
|
|
65
|
-
return previous.value;
|
|
66
|
-
}
|
|
67
|
-
return source.val?.data ?? [];
|
|
68
|
-
},
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
override records = this._records.asReadonly();
|
|
72
|
-
|
|
73
|
-
override recordCount = computed(() => this.totalRecords());
|
|
74
|
-
|
|
75
|
-
isLoading = computed(() => this.dataResource.isLoading());
|
|
76
|
-
|
|
77
|
-
error = computed(() => this.dataResource.error());
|
|
78
|
-
|
|
79
|
-
hasError = computed(() => this.dataResource.hasValue() === false && this.error() !== undefined);
|
|
80
|
-
|
|
81
|
-
constructor(
|
|
82
|
-
private dataLoader: DataLoader<T>,
|
|
83
|
-
initialPageSize = 10
|
|
84
|
-
) {
|
|
85
|
-
super();
|
|
86
|
-
this._pageSize.set(initialPageSize);
|
|
87
|
-
|
|
88
|
-
this.dataResource = resource({
|
|
89
|
-
params: () => ({
|
|
90
|
-
pageNumber: this._pageNumber(),
|
|
91
|
-
pageSize: this._pageSize(),
|
|
92
|
-
sortColumn: this._sortColumn() as string | undefined,
|
|
93
|
-
sortDirection: this._sortDirection(),
|
|
94
|
-
filter: this.filter(),
|
|
95
|
-
}),
|
|
96
|
-
loader: async (params: ResourceLoaderParams<PageRequest>) => {
|
|
97
|
-
const request = params.params;
|
|
98
|
-
const response = await this.dataLoader(request);
|
|
99
|
-
|
|
100
|
-
if (request.pageNumber === 1 || this.totalRecords() === 0) {
|
|
101
|
-
this.totalRecords.set(response.totalRecords);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return response;
|
|
105
|
-
},
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
override sortRecords(sort: Sort<T>) {
|
|
110
|
-
this.sort.set(sort);
|
|
111
|
-
this._sortColumn.set(sort.column);
|
|
112
|
-
this._sortDirection.set(sort.direction);
|
|
113
|
-
this._pageNumber.set(1);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
override firstPage() {
|
|
117
|
-
this._pageNumber.set(1);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
override nextPage() {
|
|
121
|
-
if (this._pageNumber() < this.pageCount()) {
|
|
122
|
-
this._pageNumber.update((n) => n + 1);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
override previousPage() {
|
|
127
|
-
if (this._pageNumber() > 1) {
|
|
128
|
-
this._pageNumber.update((n) => n - 1);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
override lastPage() {
|
|
133
|
-
this._pageNumber.set(this.pageCount());
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
override jumpToPage(page: number) {
|
|
137
|
-
if (page >= 1 && page <= this.pageCount()) {
|
|
138
|
-
this._pageNumber.set(page);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
override setPageSize(size: number) {
|
|
143
|
-
if (size > 0) {
|
|
144
|
-
this._pageSize.set(size);
|
|
145
|
-
this._pageNumber.set(1);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
setFilter(filterValues: Record<string, any>) {
|
|
150
|
-
this.filter.set(filterValues);
|
|
151
|
-
this._pageNumber.set(1);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
clearFilter() {
|
|
155
|
-
this.filter.set({});
|
|
156
|
-
this._pageNumber.set(1);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
refresh() {
|
|
160
|
-
this.dataResource.reload();
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
getPageRequest(): PageRequest {
|
|
164
|
-
return {
|
|
165
|
-
pageNumber: this._pageNumber(),
|
|
166
|
-
pageSize: this._pageSize(),
|
|
167
|
-
sortColumn: this._sortColumn() as string | undefined,
|
|
168
|
-
sortDirection: this._sortDirection(),
|
|
169
|
-
filter: this.filter(),
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export function memoize<T extends (...args: any[]) => any>(fn: T): T {
|
|
2
|
-
const cache = new Map<string, ReturnType<T>>();
|
|
3
|
-
|
|
4
|
-
return ((...args: Parameters<T>): ReturnType<T> => {
|
|
5
|
-
const key = JSON.stringify(args);
|
|
6
|
-
|
|
7
|
-
if (cache.has(key)) {
|
|
8
|
-
return cache.get(key)!;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const result = fn(...args);
|
|
12
|
-
cache.set(key, result);
|
|
13
|
-
return result;
|
|
14
|
-
}) as T;
|
|
15
|
-
}
|
package/src/lib/cdk/index.ts
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { memoize } from '../helpers/memoize.helper';
|
|
3
|
-
|
|
4
|
-
@Injectable({
|
|
5
|
-
providedIn: 'root',
|
|
6
|
-
})
|
|
7
|
-
export class LocalStorageService {
|
|
8
|
-
private isLocalStorageAvailable = memoize((): boolean => {
|
|
9
|
-
try {
|
|
10
|
-
const test = '__localStorage_test__';
|
|
11
|
-
localStorage.setItem(test, test);
|
|
12
|
-
localStorage.removeItem(test);
|
|
13
|
-
return true;
|
|
14
|
-
} catch {
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
setItem<T>(key: string, value: T): boolean {
|
|
20
|
-
if (!this.isLocalStorageAvailable()) {
|
|
21
|
-
console.warn('LocalStorage is not available');
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
try {
|
|
26
|
-
const stringValue = typeof value === 'string' ? value : JSON.stringify(value);
|
|
27
|
-
localStorage.setItem(key, stringValue);
|
|
28
|
-
return true;
|
|
29
|
-
} catch (error) {
|
|
30
|
-
console.error('Error saving to localStorage:', error);
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
getItem<T>(key: string): T | null {
|
|
36
|
-
if (!this.isLocalStorageAvailable()) {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
try {
|
|
41
|
-
const item = localStorage.getItem(key);
|
|
42
|
-
if (item === null) {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
try {
|
|
47
|
-
return JSON.parse(item) as T;
|
|
48
|
-
} catch {
|
|
49
|
-
return item as T;
|
|
50
|
-
}
|
|
51
|
-
} catch (error) {
|
|
52
|
-
console.error('Error reading from localStorage:', error);
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
removeItem(key: string): boolean {
|
|
58
|
-
if (!this.isLocalStorageAvailable()) {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
try {
|
|
63
|
-
localStorage.removeItem(key);
|
|
64
|
-
return true;
|
|
65
|
-
} catch (error) {
|
|
66
|
-
console.error('Error removing from localStorage:', error);
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
clear(): boolean {
|
|
72
|
-
if (!this.isLocalStorageAvailable()) {
|
|
73
|
-
return false;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
try {
|
|
77
|
-
localStorage.clear();
|
|
78
|
-
return true;
|
|
79
|
-
} catch (error) {
|
|
80
|
-
console.error('Error clearing localStorage:', error);
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
hasKey(key: string): boolean {
|
|
86
|
-
if (!this.isLocalStorageAvailable()) {
|
|
87
|
-
return false;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return localStorage.getItem(key) !== null;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
getAllKeys(): string[] {
|
|
94
|
-
if (!this.isLocalStorageAvailable()) {
|
|
95
|
-
return [];
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
try {
|
|
99
|
-
return Object.keys(localStorage);
|
|
100
|
-
} catch (error) {
|
|
101
|
-
console.error('Error getting localStorage keys:', error);
|
|
102
|
-
return [];
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
getSize(): number {
|
|
107
|
-
if (!this.isLocalStorageAvailable()) {
|
|
108
|
-
return 0;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
try {
|
|
112
|
-
let total = 0;
|
|
113
|
-
for (const key in localStorage) {
|
|
114
|
-
if (Object.prototype.hasOwnProperty.call(localStorage, key)) {
|
|
115
|
-
total += localStorage[key].length + key.length;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return total;
|
|
119
|
-
} catch (error) {
|
|
120
|
-
console.error('Error calculating localStorage size:', error);
|
|
121
|
-
return 0;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { computed, DestroyRef, inject, signal } from '@angular/core';
|
|
2
|
-
|
|
3
|
-
export function useTimer() {
|
|
4
|
-
const destroyRef = inject(DestroyRef);
|
|
5
|
-
|
|
6
|
-
const msRemaining = signal<number>(0);
|
|
7
|
-
const isPaused = signal<boolean>(false);
|
|
8
|
-
const isActive = computed(() => msRemaining() > 0);
|
|
9
|
-
|
|
10
|
-
let intervalId: any = null;
|
|
11
|
-
let endTime = 0;
|
|
12
|
-
let onCompleteCallback: (() => void) | undefined;
|
|
13
|
-
|
|
14
|
-
const stop = () => {
|
|
15
|
-
if (intervalId) clearInterval(intervalId);
|
|
16
|
-
intervalId = null;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const tick = () => {
|
|
20
|
-
const remaining = Math.max(0, endTime - Date.now());
|
|
21
|
-
msRemaining.set(remaining);
|
|
22
|
-
|
|
23
|
-
if (remaining <= 0) {
|
|
24
|
-
stop();
|
|
25
|
-
if (onCompleteCallback) onCompleteCallback();
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const start = (durationMs: number, onComplete?: () => void) => {
|
|
30
|
-
stop();
|
|
31
|
-
onCompleteCallback = onComplete;
|
|
32
|
-
isPaused.set(false);
|
|
33
|
-
msRemaining.set(durationMs);
|
|
34
|
-
endTime = Date.now() + durationMs;
|
|
35
|
-
intervalId = setInterval(tick, 100);
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const pause = () => {
|
|
39
|
-
if (!isActive() || isPaused()) return;
|
|
40
|
-
stop();
|
|
41
|
-
isPaused.set(true);
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
const resume = () => {
|
|
45
|
-
if (!isActive() || !isPaused()) return;
|
|
46
|
-
isPaused.set(false);
|
|
47
|
-
endTime = Date.now() + msRemaining();
|
|
48
|
-
intervalId = setInterval(tick, 100);
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
destroyRef.onDestroy(() => stop());
|
|
52
|
-
|
|
53
|
-
return {
|
|
54
|
-
start,
|
|
55
|
-
pause,
|
|
56
|
-
resume,
|
|
57
|
-
stop: () => {
|
|
58
|
-
stop();
|
|
59
|
-
msRemaining.set(0);
|
|
60
|
-
},
|
|
61
|
-
msRemaining,
|
|
62
|
-
isPaused,
|
|
63
|
-
isActive,
|
|
64
|
-
secondsRemaining: computed(() => Math.ceil(msRemaining() / 1000)),
|
|
65
|
-
};
|
|
66
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { Component, HostBinding, inject, input } from '@angular/core';
|
|
2
|
-
import { css } from '@emotion/css';
|
|
3
|
-
|
|
4
|
-
import type {
|
|
5
|
-
ColorKey,
|
|
6
|
-
OptionalDisplay,
|
|
7
|
-
OptionalTextAlign,
|
|
8
|
-
Typeface,
|
|
9
|
-
} from '@uni-design-system/uni-core';
|
|
10
|
-
import { ThemeService } from '../../theming/theme.service';
|
|
11
|
-
|
|
12
|
-
@Component({
|
|
13
|
-
selector: 'uni-text, Text',
|
|
14
|
-
standalone: true,
|
|
15
|
-
imports: [],
|
|
16
|
-
template: '<ng-content></ng-content>',
|
|
17
|
-
})
|
|
18
|
-
export class UniTextComponent {
|
|
19
|
-
theme = inject(ThemeService);
|
|
20
|
-
|
|
21
|
-
typeface = input<Typeface>('title-small');
|
|
22
|
-
color = input<ColorKey>();
|
|
23
|
-
display = input<OptionalDisplay>();
|
|
24
|
-
align = input<OptionalTextAlign>();
|
|
25
|
-
nowrap = input<boolean>();
|
|
26
|
-
maxWidth = input<number>();
|
|
27
|
-
ellipsis = input<boolean>(false);
|
|
28
|
-
|
|
29
|
-
@HostBinding('class') get className() {
|
|
30
|
-
return css([
|
|
31
|
-
{
|
|
32
|
-
...this.theme.typeface(this.typeface()),
|
|
33
|
-
...this.theme.color(this.color()),
|
|
34
|
-
display: this.display(),
|
|
35
|
-
},
|
|
36
|
-
this.align() && {
|
|
37
|
-
textAlign: this.align(),
|
|
38
|
-
},
|
|
39
|
-
this.nowrap() && {
|
|
40
|
-
whiteSpace: 'nowrap',
|
|
41
|
-
},
|
|
42
|
-
this.maxWidth() && {
|
|
43
|
-
maxWidth: this.maxWidth(),
|
|
44
|
-
overflow: 'hidden',
|
|
45
|
-
whiteSpace: 'nowrap',
|
|
46
|
-
textOverflow: 'ellipsis',
|
|
47
|
-
display: 'inline-block',
|
|
48
|
-
},
|
|
49
|
-
this.ellipsis() && {
|
|
50
|
-
whiteSpace: 'nowrap',
|
|
51
|
-
overflow: 'hidden',
|
|
52
|
-
textOverflow: 'ellipsis',
|
|
53
|
-
minWidth: 0,
|
|
54
|
-
},
|
|
55
|
-
]);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Meta, Title } from '@storybook/addon-docs/blocks';
|
|
2
|
-
import * as Stories from './text.stories';
|
|
3
|
-
import { StoryUsage } from '../../../stories/blocks/StoryUsage';
|
|
4
|
-
|
|
5
|
-
<Meta of={Stories} name="Overview" />
|
|
6
|
-
<Title />
|
|
7
|
-
`import { UniTextComponent } from '@uni-design-system/uni-angular';`
|
|
8
|
-
|
|
9
|
-
## Overview
|
|
10
|
-
|
|
11
|
-
The Text Component is used to format text using typefaces and colors defined in the loaded theme.
|
|
12
|
-
|
|
13
|
-
## Usage
|
|
14
|
-
|
|
15
|
-
<StoryUsage of={Stories.DisplayLarge} />
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { argsToTemplate, Meta, StoryObj } from '@storybook/angular';
|
|
2
|
-
import { UniTextComponent } from './text.component';
|
|
3
|
-
import type { Typeface, ColorKey } from '@uni-design-system/uni-core';
|
|
4
|
-
|
|
5
|
-
// 1. Create a unified argument type for the story file
|
|
6
|
-
type StoryArgs = UniTextComponent & { ngContent?: string };
|
|
7
|
-
|
|
8
|
-
// 2. Pass the combined type directly to Meta so it recognizes 'ngContent' in argTypes
|
|
9
|
-
const meta: Meta<StoryArgs> = {
|
|
10
|
-
title: 'Components/Text',
|
|
11
|
-
component: UniTextComponent as any, // Cast to any prevents the mapper from breaking on the intersection
|
|
12
|
-
render: (args) => {
|
|
13
|
-
const { ngContent, ...componentProps } = args;
|
|
14
|
-
return {
|
|
15
|
-
props: componentProps,
|
|
16
|
-
template: `<uni-text ${argsToTemplate(componentProps)}>${ngContent || ''}</uni-text>`,
|
|
17
|
-
};
|
|
18
|
-
},
|
|
19
|
-
argTypes: {
|
|
20
|
-
ngContent: {
|
|
21
|
-
control: 'text',
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export default meta;
|
|
27
|
-
|
|
28
|
-
// 3. Keep the matching type structure on your StoryObj
|
|
29
|
-
type Story = StoryObj<StoryArgs>;
|
|
30
|
-
|
|
31
|
-
export const DisplayLarge: Story = {
|
|
32
|
-
args: {
|
|
33
|
-
ngContent: 'The quick brown fox jumps over the lazy dog.',
|
|
34
|
-
color: 'primary' as ColorKey,
|
|
35
|
-
typeface: 'title-large' as Typeface,
|
|
36
|
-
display: 'block',
|
|
37
|
-
align: 'center',
|
|
38
|
-
},
|
|
39
|
-
};
|