@lukfel/ng-scaffold 21.1.53 → 21.1.55
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/fesm2022/{lukfel-ng-scaffold-confirm-dialog.component-DXfQ5moR.mjs → lukfel-ng-scaffold-confirm-dialog.component-DAl-XH0n.mjs} +2 -5
- package/fesm2022/lukfel-ng-scaffold-confirm-dialog.component-DAl-XH0n.mjs.map +1 -0
- package/fesm2022/lukfel-ng-scaffold.mjs +81 -130
- package/fesm2022/lukfel-ng-scaffold.mjs.map +1 -1
- package/package.json +1 -1
- package/schematics/ng-add/add-component.js +7 -13
- package/schematics/ng-add/add-component.js.map +1 -1
- package/schematics/ng-add/add-config.js +6 -9
- package/schematics/ng-add/add-config.js.map +1 -1
- package/schematics/ng-add/add-styles.js +2 -7
- package/schematics/ng-add/add-styles.js.map +1 -1
- package/schematics/ng-add/add-template.js +6 -6
- package/schematics/ng-add/add-template.js.map +1 -1
- package/schematics/ng-add/index.js +1 -6
- package/schematics/ng-add/index.js.map +1 -1
- package/styles/_theme.scss +139 -4
- package/styles/_variables.scss +2 -1
- package/fesm2022/lukfel-ng-scaffold-confirm-dialog.component-DXfQ5moR.mjs.map +0 -1
package/package.json
CHANGED
|
@@ -8,19 +8,13 @@ const ts = require("typescript");
|
|
|
8
8
|
function addComponent() {
|
|
9
9
|
return (tree, context) => {
|
|
10
10
|
context.logger.info('[Component] Searching for bootstrapper ...');
|
|
11
|
-
const possibleModulePaths = [
|
|
12
|
-
|
|
13
|
-
'src/app/app-module.ts'
|
|
14
|
-
];
|
|
15
|
-
const modulePath = possibleModulePaths.find(p => tree.exists(p));
|
|
11
|
+
const possibleModulePaths = ['src/app/app.module.ts', 'src/app/app-module.ts'];
|
|
12
|
+
const modulePath = possibleModulePaths.find((p) => tree.exists(p));
|
|
16
13
|
if (modulePath) {
|
|
17
14
|
return addToNgModule(tree, context, modulePath);
|
|
18
15
|
}
|
|
19
|
-
const possibleComponentPaths = [
|
|
20
|
-
|
|
21
|
-
'src/app/app.ts'
|
|
22
|
-
];
|
|
23
|
-
const componentPath = possibleComponentPaths.find(p => tree.exists(p));
|
|
16
|
+
const possibleComponentPaths = ['src/app/app.component.ts', 'src/app/app.ts'];
|
|
17
|
+
const componentPath = possibleComponentPaths.find((p) => tree.exists(p));
|
|
24
18
|
if (componentPath) {
|
|
25
19
|
return addToNgModule(tree, context, componentPath);
|
|
26
20
|
}
|
|
@@ -32,13 +26,13 @@ function addComponent() {
|
|
|
32
26
|
function addToNgModule(tree, context, filePath) {
|
|
33
27
|
var _a, _b;
|
|
34
28
|
const content = tree.read(filePath).toString('utf-8');
|
|
35
|
-
if (content.includes(
|
|
29
|
+
if (content.includes("from '@lukfel/ng-scaffold'") && content.includes('ScaffoldComponent')) {
|
|
36
30
|
context.logger.info('[Component] ScaffoldComponent already imported. Skip.');
|
|
37
31
|
return tree;
|
|
38
32
|
}
|
|
39
33
|
const isModule = filePath.includes('module');
|
|
40
34
|
const recorder = tree.beginUpdate(filePath);
|
|
41
|
-
recorder.insertLeft(0,
|
|
35
|
+
recorder.insertLeft(0, "import { ScaffoldComponent } from '@lukfel/ng-scaffold';\n");
|
|
42
36
|
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
43
37
|
const ngModuleDecoratorCall = findDecorator(sourceFile, isModule ? 'NgModule' : 'Component');
|
|
44
38
|
if (!ngModuleDecoratorCall) {
|
|
@@ -52,7 +46,7 @@ function addToNgModule(tree, context, filePath) {
|
|
|
52
46
|
tree.commitUpdate(recorder);
|
|
53
47
|
return tree;
|
|
54
48
|
}
|
|
55
|
-
const importsProp = arg.properties.find(p => ts.isPropertyAssignment(p) && ts.isIdentifier(p.name) && p.name.text === 'imports');
|
|
49
|
+
const importsProp = arg.properties.find((p) => ts.isPropertyAssignment(p) && ts.isIdentifier(p.name) && p.name.text === 'imports');
|
|
56
50
|
if (!importsProp || !ts.isArrayLiteralExpression(importsProp.initializer)) {
|
|
57
51
|
context.logger.warn(`[Component] No imports[] found in ${isModule ? '@NgModule' : '@Component'} Skip.`);
|
|
58
52
|
tree.commitUpdate(recorder);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-component.js","sourceRoot":"","sources":["../../../../projects/ng-scaffold/schematics/ng-add/add-component.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAKH,
|
|
1
|
+
{"version":3,"file":"add-component.js","sourceRoot":"","sources":["../../../../projects/ng-scaffold/schematics/ng-add/add-component.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,30 +8,27 @@ const ts = require("typescript");
|
|
|
8
8
|
function addConfig() {
|
|
9
9
|
return (tree, context) => {
|
|
10
10
|
context.logger.info('[Config] Searching for root component ...');
|
|
11
|
-
const possiblePaths = [
|
|
12
|
-
|
|
13
|
-
'src/app/app.ts'
|
|
14
|
-
];
|
|
15
|
-
const filePath = possiblePaths.find(p => tree.exists(p));
|
|
11
|
+
const possiblePaths = ['src/app/app.component.ts', 'src/app/app.ts'];
|
|
12
|
+
const filePath = possiblePaths.find((p) => tree.exists(p));
|
|
16
13
|
if (!filePath) {
|
|
17
14
|
context.logger.warn('[Config] No root component file found. Skipping.');
|
|
18
15
|
return tree;
|
|
19
16
|
}
|
|
20
17
|
const content = tree.read(filePath).toString('utf-8');
|
|
21
|
-
if (content.includes(
|
|
18
|
+
if (content.includes("from '@lukfel/ng-scaffold'") && content.includes('ScaffoldConfig')) {
|
|
22
19
|
context.logger.info('[Config] Config already added. Skip.');
|
|
23
20
|
return tree;
|
|
24
21
|
}
|
|
25
22
|
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
26
23
|
const recorder = tree.beginUpdate(filePath);
|
|
27
24
|
// Add imports if missing
|
|
28
|
-
if (!content.includes(
|
|
25
|
+
if (!content.includes("from '@lukfel/ng-scaffold'") || !content.includes('ScaffoldConfig')) {
|
|
29
26
|
context.logger.info('[Config] Adding config import ...');
|
|
30
|
-
recorder.insertLeft(0,
|
|
27
|
+
recorder.insertLeft(0, "import { ScaffoldConfig, ScaffoldService } from '@lukfel/ng-scaffold';\n");
|
|
31
28
|
}
|
|
32
29
|
if (!content.includes('inject')) {
|
|
33
30
|
context.logger.info('[Config] Adding inject import ...');
|
|
34
|
-
recorder.insertLeft(0,
|
|
31
|
+
recorder.insertLeft(0, "import { inject } from '@angular/core';\n");
|
|
35
32
|
}
|
|
36
33
|
const classNode = findFirstClass(sourceFile);
|
|
37
34
|
if (!classNode) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-config.js","sourceRoot":"","sources":["../../../../projects/ng-scaffold/schematics/ng-add/add-config.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAKH,
|
|
1
|
+
{"version":3,"file":"add-config.js","sourceRoot":"","sources":["../../../../projects/ng-scaffold/schematics/ng-add/add-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,17 +7,12 @@ exports.addStyles = addStyles;
|
|
|
7
7
|
function addStyles() {
|
|
8
8
|
return (tree, context) => {
|
|
9
9
|
context.logger.info('[Styles] Searching for root styles ...');
|
|
10
|
-
const possiblePaths = [
|
|
11
|
-
|
|
12
|
-
'src/styles.sass',
|
|
13
|
-
'src/styles.css'
|
|
14
|
-
];
|
|
15
|
-
const path = possiblePaths.find(p => tree.exists(p));
|
|
10
|
+
const possiblePaths = ['src/styles.scss', 'src/styles.sass', 'src/styles.css'];
|
|
11
|
+
const path = possiblePaths.find((p) => tree.exists(p));
|
|
16
12
|
if (!path) {
|
|
17
13
|
context.logger.warn('[Styles] No global styles file found. Skip.');
|
|
18
14
|
return tree;
|
|
19
15
|
}
|
|
20
|
-
;
|
|
21
16
|
const content = tree.read(path).toString('utf-8');
|
|
22
17
|
if (content.includes('@lukfel/ng-scaffold/styles') && content.includes('lf.scaffold-theme')) {
|
|
23
18
|
context.logger.info('[Styles] Styles already added. Skip.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-styles.js","sourceRoot":"","sources":["../../../../projects/ng-scaffold/schematics/ng-add/add-styles.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAIH,
|
|
1
|
+
{"version":3,"file":"add-styles.js","sourceRoot":"","sources":["../../../../projects/ng-scaffold/schematics/ng-add/add-styles.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAIH,8BAiDC;AAjDD,SAAgB,SAAS;IACvB,OAAO,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;QAC/C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAE9D,MAAM,aAAa,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;QAE/E,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC5F,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBnB,CAAC;QAEE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACxC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -8,11 +8,8 @@ function addTemplate() {
|
|
|
8
8
|
return (tree, context) => {
|
|
9
9
|
var _a;
|
|
10
10
|
context.logger.info('[Template] Searching for root template ...');
|
|
11
|
-
const possiblePaths = [
|
|
12
|
-
|
|
13
|
-
'src/app/app.html'
|
|
14
|
-
];
|
|
15
|
-
const path = (_a = possiblePaths.find(p => tree.exists(p))) !== null && _a !== void 0 ? _a : null;
|
|
11
|
+
const possiblePaths = ['src/app/app.component.html', 'src/app/app.html'];
|
|
12
|
+
const path = (_a = possiblePaths.find((p) => tree.exists(p))) !== null && _a !== void 0 ? _a : null;
|
|
16
13
|
if (!path) {
|
|
17
14
|
context.logger.warn('[Template] No global template file found. Skipped.');
|
|
18
15
|
return tree;
|
|
@@ -22,7 +19,10 @@ function addTemplate() {
|
|
|
22
19
|
context.logger.info('[Template] Template already added. Skipped.');
|
|
23
20
|
return tree;
|
|
24
21
|
}
|
|
25
|
-
const indented = content
|
|
22
|
+
const indented = content
|
|
23
|
+
.split('\n')
|
|
24
|
+
.map((line) => (line.trim() === '' ? line : ' ' + line))
|
|
25
|
+
.join('\n');
|
|
26
26
|
const newContent = '<lf-scaffold>\n' + `${indented}\n` + '</lf-scaffold>\n';
|
|
27
27
|
tree.overwrite(path, newContent);
|
|
28
28
|
context.logger.info('[Template] Successfully added.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-template.js","sourceRoot":"","sources":["../../../../projects/ng-scaffold/schematics/ng-add/add-template.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAIH,kCA6BC;AA7BD,SAAgB,WAAW;IACzB,OAAO,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;;QAC/C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAElE,MAAM,aAAa,GAAG
|
|
1
|
+
{"version":3,"file":"add-template.js","sourceRoot":"","sources":["../../../../projects/ng-scaffold/schematics/ng-add/add-template.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAIH,kCA6BC;AA7BD,SAAgB,WAAW;IACzB,OAAO,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;;QAC/C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAElE,MAAM,aAAa,GAAG,CAAC,4BAA4B,EAAE,kBAAkB,CAAC,CAAC;QAEzE,MAAM,IAAI,GAAG,MAAA,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAC;QAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAEzD,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO;aACrB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;aACxD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,UAAU,GAAG,iBAAiB,GAAG,GAAG,QAAQ,IAAI,GAAG,kBAAkB,CAAC;QAC5E,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAEtD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -7,11 +7,6 @@ const add_component_1 = require("./add-component");
|
|
|
7
7
|
const add_styles_1 = require("./add-styles");
|
|
8
8
|
const add_template_1 = require("./add-template");
|
|
9
9
|
function ngAdd() {
|
|
10
|
-
return (0, schematics_1.chain)([
|
|
11
|
-
(0, add_component_1.addComponent)(),
|
|
12
|
-
(0, add_config_1.addConfig)(),
|
|
13
|
-
(0, add_template_1.addTemplate)(),
|
|
14
|
-
(0, add_styles_1.addStyles)()
|
|
15
|
-
]);
|
|
10
|
+
return (0, schematics_1.chain)([(0, add_component_1.addComponent)(), (0, add_config_1.addConfig)(), (0, add_template_1.addTemplate)(), (0, add_styles_1.addStyles)()]);
|
|
16
11
|
}
|
|
17
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../projects/ng-scaffold/schematics/ng-add/index.ts"],"names":[],"mappings":";;AAMA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../projects/ng-scaffold/schematics/ng-add/index.ts"],"names":[],"mappings":";;AAMA,sBAEC;AARD,2DAAyD;AACzD,6CAAyC;AACzC,mDAA+C;AAC/C,6CAAyC;AACzC,iDAA6C;AAE7C,SAAgB,KAAK;IACnB,OAAO,IAAA,kBAAK,EAAC,CAAC,IAAA,4BAAY,GAAE,EAAE,IAAA,sBAAS,GAAE,EAAE,IAAA,0BAAW,GAAE,EAAE,IAAA,sBAAS,GAAE,CAAC,CAAC,CAAC;AAC1E,CAAC"}
|
package/styles/_theme.scss
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
@include mat.elevation-classes();
|
|
3
3
|
@include mat.app-background();
|
|
4
4
|
|
|
5
|
-
//
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// Material 2 (M2) Theming
|
|
7
|
+
// ============================================================================
|
|
8
|
+
|
|
9
|
+
// Default M2 theme
|
|
6
10
|
$lf-default-theme: (
|
|
7
11
|
primary: mat.m2-define-palette(mat.$m2-blue-palette),
|
|
8
12
|
accent: mat.m2-define-palette(mat.$m2-pink-palette, A200, A100, A400),
|
|
@@ -11,7 +15,7 @@ $lf-default-theme: (
|
|
|
11
15
|
font-family: 'Roboto'
|
|
12
16
|
);
|
|
13
17
|
|
|
14
|
-
// Set theme
|
|
18
|
+
// Set M2 theme
|
|
15
19
|
// Material requires to split up the mat.all-component-themes and mat.all-component-colors
|
|
16
20
|
// since mat.all-component-themes should also be imported once, but mat.all-component-colors
|
|
17
21
|
// can be imported multiple times
|
|
@@ -48,7 +52,7 @@ $lf-default-theme: (
|
|
|
48
52
|
@include color-variables($theme, 'body');
|
|
49
53
|
}
|
|
50
54
|
|
|
51
|
-
// Set colors
|
|
55
|
+
// Set M2 colors
|
|
52
56
|
@mixin scaffold-colors($theme: $lf-default-theme, $class) {
|
|
53
57
|
$theme: map-merge($lf-default-theme, $theme);
|
|
54
58
|
|
|
@@ -77,7 +81,7 @@ $lf-default-theme: (
|
|
|
77
81
|
@include color-variables($theme, #{'body.'+$class});
|
|
78
82
|
}
|
|
79
83
|
|
|
80
|
-
// Set variables
|
|
84
|
+
// Set M2 variables
|
|
81
85
|
@mixin color-variables($theme, $scope) {
|
|
82
86
|
#{$scope}{
|
|
83
87
|
--color-primary: #{mat.m2-get-color-from-palette(map-get($theme, 'primary'))};
|
|
@@ -110,3 +114,134 @@ $lf-default-theme: (
|
|
|
110
114
|
}
|
|
111
115
|
}
|
|
112
116
|
}
|
|
117
|
+
|
|
118
|
+
// ============================================================================
|
|
119
|
+
// Material 3 (M3) Theming
|
|
120
|
+
// ============================================================================
|
|
121
|
+
|
|
122
|
+
// Default M3 theme
|
|
123
|
+
// M3 uses: primary, tertiary (instead of accent), and error (instead of warn)
|
|
124
|
+
// theme-type: 'light', 'dark', or 'color-scheme' (auto light/dark based on user preference)
|
|
125
|
+
$lf-default-theme-m3: (
|
|
126
|
+
primary: mat.$blue-palette,
|
|
127
|
+
tertiary: mat.$rose-palette,
|
|
128
|
+
theme-type: color-scheme,
|
|
129
|
+
font-family: 'Roboto',
|
|
130
|
+
density: 0,
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
// Set M3 theme
|
|
134
|
+
// Uses mat.theme() which outputs CSS variables (design tokens) instead of static styles.
|
|
135
|
+
// Includes color-variants-backwards-compatibility so that component [color] inputs
|
|
136
|
+
// (color="primary", color="accent", color="warn") continue to work.
|
|
137
|
+
@mixin scaffold-theme-m3($theme: $lf-default-theme-m3) {
|
|
138
|
+
$theme: map-merge($lf-default-theme-m3, $theme);
|
|
139
|
+
|
|
140
|
+
$color-config: (
|
|
141
|
+
primary: map-get($theme, 'primary'),
|
|
142
|
+
tertiary: map-get($theme, 'tertiary'),
|
|
143
|
+
theme-type: map-get($theme, 'theme-type'),
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
html {
|
|
147
|
+
@include mat.theme((
|
|
148
|
+
color: $color-config,
|
|
149
|
+
typography: map-get($theme, 'font-family'),
|
|
150
|
+
density: map-get($theme, 'density'),
|
|
151
|
+
));
|
|
152
|
+
@include mat.color-variants-backwards-compatibility($theme: mat.define-theme((
|
|
153
|
+
color: $color-config,
|
|
154
|
+
)));
|
|
155
|
+
@include mat.system-classes();
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@include toolbar-color-compat();
|
|
159
|
+
@include color-variables-m3('body');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Set M3 colors (scoped to a class, for multi-theme support)
|
|
163
|
+
// Only overrides color tokens; typography and density are inherited from the base theme.
|
|
164
|
+
@mixin scaffold-colors-m3($theme: $lf-default-theme-m3, $class) {
|
|
165
|
+
$theme: map-merge($lf-default-theme-m3, $theme);
|
|
166
|
+
|
|
167
|
+
$color-config: (
|
|
168
|
+
primary: map-get($theme, 'primary'),
|
|
169
|
+
tertiary: map-get($theme, 'tertiary'),
|
|
170
|
+
theme-type: map-get($theme, 'theme-type'),
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
.#{$class} {
|
|
174
|
+
@include mat.theme((
|
|
175
|
+
color: $color-config,
|
|
176
|
+
));
|
|
177
|
+
@include mat.color-variants-backwards-compatibility($theme: mat.define-theme((
|
|
178
|
+
color: $color-config,
|
|
179
|
+
)));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
@include toolbar-color-compat(#{'.' + $class});
|
|
183
|
+
@include color-variables-m3(#{'body.'+$class});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Toolbar color backwards compatibility
|
|
187
|
+
// M3's color-variants-backwards-compatibility does not cover mat-toolbar.
|
|
188
|
+
// This mixin restores [color] input support for toolbar and ensures icons/buttons
|
|
189
|
+
// inside colored toolbars use the correct contrast color.
|
|
190
|
+
@mixin toolbar-color-compat($scope: null) {
|
|
191
|
+
$prefix: '';
|
|
192
|
+
@if ($scope) {
|
|
193
|
+
$prefix: '#{$scope} ';
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
#{$prefix}.mat-toolbar.mat-primary {
|
|
197
|
+
background-color: var(--mat-sys-primary);
|
|
198
|
+
color: var(--mat-sys-on-primary);
|
|
199
|
+
|
|
200
|
+
.mat-icon,
|
|
201
|
+
.mat-mdc-icon-button,
|
|
202
|
+
.mat-mdc-button {
|
|
203
|
+
color: var(--mat-sys-on-primary);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
#{$prefix}.mat-toolbar.mat-accent {
|
|
208
|
+
background-color: var(--mat-sys-tertiary);
|
|
209
|
+
color: var(--mat-sys-on-tertiary);
|
|
210
|
+
|
|
211
|
+
.mat-icon,
|
|
212
|
+
.mat-mdc-icon-button,
|
|
213
|
+
.mat-mdc-button {
|
|
214
|
+
color: var(--mat-sys-on-tertiary);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
#{$prefix}.mat-toolbar.mat-warn {
|
|
219
|
+
background-color: var(--mat-sys-error);
|
|
220
|
+
color: var(--mat-sys-on-error);
|
|
221
|
+
|
|
222
|
+
.mat-icon,
|
|
223
|
+
.mat-mdc-icon-button,
|
|
224
|
+
.mat-mdc-button {
|
|
225
|
+
color: var(--mat-sys-on-error);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Set M3 variables
|
|
231
|
+
// Bridges the M3 system tokens to the same --color-* CSS variables that existing
|
|
232
|
+
// components use, so all library components work without template changes.
|
|
233
|
+
// Note: M3 does not have numbered hue variants (50-900). Only the base semantic
|
|
234
|
+
// colors are bridged. Hue-specific variables are not available in M3.
|
|
235
|
+
@mixin color-variables-m3($scope) {
|
|
236
|
+
#{$scope} {
|
|
237
|
+
--color-primary: var(--mat-sys-primary);
|
|
238
|
+
--color-accent: var(--mat-sys-tertiary);
|
|
239
|
+
--color-warn: var(--mat-sys-error);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Utility classes (same API as M2, backed by M3 tokens)
|
|
243
|
+
@each $palette in ('primary', 'accent', 'warn') {
|
|
244
|
+
.color-#{$palette} { color: var(--color-#{$palette}) !important; }
|
|
245
|
+
.color-bg-#{$palette} { background-color: var(--color-#{$palette}) !important; }
|
|
246
|
+
}
|
|
247
|
+
}
|
package/styles/_variables.scss
CHANGED
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
|
|
49
49
|
--bottom-bar-z-index: 98;
|
|
50
50
|
--bottom-bar-height: 56px;
|
|
51
|
+
--bottom-bar-font-size: 16px;
|
|
51
52
|
|
|
52
53
|
--placeholder-icon-size: 96px;
|
|
53
54
|
--placeholder-title-font-size: 20px;
|
|
@@ -71,4 +72,4 @@
|
|
|
71
72
|
--notification-font-size: 14px;
|
|
72
73
|
|
|
73
74
|
--color-gray: rgba(128, 128, 128, 0.8);
|
|
74
|
-
}
|
|
75
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lukfel-ng-scaffold-confirm-dialog.component-DXfQ5moR.mjs","sources":["../../../projects/ng-scaffold/src/lib/shared/components/dialogs/confirm-dialog/confirm-dialog.component.ts","../../../projects/ng-scaffold/src/lib/shared/components/dialogs/confirm-dialog/confirm-dialog.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { ConfirmDialogConfig } from '../../../../models';\r\n\r\n@Component({\r\n selector: 'lf-confirm-dialog',\r\n templateUrl: './confirm-dialog.component.html',\r\n styleUrls: ['./confirm-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n MatDialogModule,\r\n MatButtonModule\r\n ]\r\n})\r\nexport class ConfirmDialogComponent {\r\n \r\n private data = inject<ConfirmDialogConfig>(MAT_DIALOG_DATA);\r\n public config = signal<ConfirmDialogConfig>(this.data);\r\n\r\n}\r\n","@if (config(); as config) {\r\n @if (config.title) {\r\n <h2 mat-dialog-title>{{ config.title }}</h2>\r\n }\r\n\r\n <mat-dialog-content>\r\n @if (config.message) {\r\n <p>{{ config.message }}</p>\r\n }\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n @if (config.closeLabel) {\r\n <button mat-button [mat-dialog-close]=\"false\">\r\n {{ config.closeLabel }}\r\n </button>\r\n }\r\n @if (config.confirmLabel) {\r\n <button mat-button color=\"primary\" [mat-dialog-close]=\"true\">\r\n {{ config.confirmLabel }}\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n}\r\n"],"names":["i2"],"mappings":";;;;;;;MAgBa,sBAAsB,CAAA;AAXnC,IAAA,WAAA,GAAA;AAaW,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAsB,eAAe,CAAC;AACpD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAsB,IAAI,CAAC,IAAI,6EAAC;AAExD,IAAA;8GALY,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChBnC,gpBAwBA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDZI,eAAe,+nBACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGN,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAXlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,mBAGZ,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EAAA,OAAA,EACP;wBACP,eAAe;wBACf;AACD,qBAAA,EAAA,QAAA,EAAA,gpBAAA,EAAA;;;;;"}
|