scb-wc 0.1.25 → 0.1.27

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.
Files changed (71) hide show
  1. package/README.md +2 -1
  2. package/all.js +5 -0
  3. package/bin/scb-wc.mjs +51 -117
  4. package/index.js +5 -0
  5. package/mvc/components/all.js +5 -0
  6. package/mvc/components/scb-card/scb-action-card.js +1 -0
  7. package/mvc/components/scb-card/scb-card.js +70 -70
  8. package/mvc/components/scb-card/scb-container-card.js +1 -0
  9. package/mvc/components/scb-card/scb-link-card.js +1 -0
  10. package/mvc/components/scb-card/scb-list-card.js +1 -0
  11. package/mvc/components/scb-card/scb-social-card.js +1 -0
  12. package/mvc/components/scb-grid/scb-grid-item.js +1 -1
  13. package/mvc/components/scb-grid/scb-grid.js +2 -2
  14. package/mvc/components/scb-pagination/scb-pagination.js +55 -35
  15. package/mvc/components/scb-table/scb-table.js +3 -3
  16. package/mvc/components/scb-table-advanced/scb-table-advanced.js +7 -7
  17. package/package.json +22 -2
  18. package/scb-card/scb-action-card.js +1 -0
  19. package/scb-card/scb-card.js +54 -41
  20. package/scb-card/scb-container-card.js +1 -0
  21. package/scb-card/scb-link-card.js +1 -0
  22. package/scb-card/scb-list-card.js +1 -0
  23. package/scb-card/scb-social-card.js +1 -0
  24. package/scb-components/index.d.ts +5 -0
  25. package/scb-components/scb-card/scb-action-card.d.ts +1 -0
  26. package/scb-components/scb-card/scb-card.d.ts +2 -0
  27. package/scb-components/scb-card/scb-container-card.d.ts +1 -0
  28. package/scb-components/scb-card/scb-link-card.d.ts +1 -0
  29. package/scb-components/scb-card/scb-list-card.d.ts +1 -0
  30. package/scb-components/scb-card/scb-social-card.d.ts +1 -0
  31. package/scb-components/scb-pagination/scb-pagination.d.ts +1 -0
  32. package/scb-components/scb-table/scb-table.d.ts +2 -0
  33. package/scb-components/scb-table-advanced/scb-table-advanced.d.ts +3 -0
  34. package/scb-grid/scb-grid-item.js +2 -2
  35. package/scb-grid/scb-grid.js +1 -4
  36. package/scb-pagination/scb-pagination.js +54 -34
  37. package/scb-table/scb-table.js +14 -1
  38. package/scb-table-advanced/scb-table-advanced.js +19 -3
  39. package/scb-wc.bundle.js +87 -67
  40. package/scb-wc.d.ts +10 -0
  41. package/starters/blazor/Components/Layout/MainLayout.razor +1 -1
  42. package/starters/blazor/Components/Pages/Home.razor +17 -21
  43. package/starters/blazor/README.md +1 -1
  44. package/starters/blazor/ScbStarterApp.csproj +1 -1
  45. package/starters/blazor-service/Components/App.razor +23 -0
  46. package/starters/blazor-service/Components/Layout/MainLayout.razor +13 -0
  47. package/starters/blazor-service/Components/Pages/Home.razor +55 -0
  48. package/starters/blazor-service/Components/Routes.razor +14 -0
  49. package/starters/blazor-service/Components/_Imports.razor +11 -0
  50. package/starters/blazor-service/Program.cs +23 -0
  51. package/starters/blazor-service/README.md +29 -0
  52. package/starters/blazor-service/ScbStarterApp.csproj +8 -0
  53. package/starters/blazor-service/dot-gitignore +3 -0
  54. package/starters/blazor-service/package.json +14 -0
  55. package/starters/blazor-service/wwwroot/app.css +54 -0
  56. package/starters/html/main.js +19 -24
  57. package/starters/html-service/README.md +24 -0
  58. package/starters/html-service/dot-gitignore +2 -0
  59. package/starters/html-service/index.html +12 -0
  60. package/starters/html-service/main.js +78 -0
  61. package/starters/html-service/package.json +16 -0
  62. package/starters/react/README.md +1 -2
  63. package/starters/react/src/App.jsx +18 -22
  64. package/starters/react/src/main.jsx +1 -2
  65. package/starters/react-service/README.md +24 -0
  66. package/starters/react-service/dot-gitignore +2 -0
  67. package/starters/react-service/index.html +12 -0
  68. package/starters/react-service/package.json +19 -0
  69. package/starters/react-service/src/App.jsx +67 -0
  70. package/starters/react-service/src/main.jsx +22 -0
  71. package/starters/react-service/vite.config.js +6 -0
package/README.md CHANGED
@@ -133,11 +133,12 @@ Behöver du en annan webbrotsökväg (t.ex. om din `wwwroot` ligger någon annan
133
133
  ## Alternativ 3: Bundlad version (IIFE) för äldre miljöer
134
134
 
135
135
  Om ESM inte stöds kan du använda den bundlade test‑varianten från paketroten.
136
- Flytta följande två filer från `node_modules/scb-wc` och använd dem i applikationen:
136
+ Flytta följande tre filer från `node_modules/scb-wc` och använd dem i applikationen:
137
137
 
138
138
  ```text
139
139
  node_modules/scb-wc/scb-wc.bundle.js
140
140
  node_modules/scb-wc/scb-wc.css
141
+ node_modules/scb-wc/scb-typography.css
141
142
  ```
142
143
 
143
144
  ```html
package/all.js CHANGED
@@ -9,7 +9,12 @@ import './scb-button/scb-button.js';
9
9
  import './scb-calendar-card/scb-calendar-card.js';
10
10
  import './scb-calendar/scb-calendar-event.js';
11
11
  import './scb-calendar/scb-calendar.js';
12
+ import './scb-card/scb-action-card.js';
12
13
  import './scb-card/scb-card.js';
14
+ import './scb-card/scb-container-card.js';
15
+ import './scb-card/scb-link-card.js';
16
+ import './scb-card/scb-list-card.js';
17
+ import './scb-card/scb-social-card.js';
13
18
  import './scb-checkbox/scb-checkbox-group.js';
14
19
  import './scb-checkbox/scb-checkbox.js';
15
20
  import './scb-chevron/scb-chevron.js';
package/bin/scb-wc.mjs CHANGED
@@ -1,159 +1,93 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import fs from 'fs';
4
- import path from 'path';
5
- import { fileURLToPath } from 'url';
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
6
 
7
7
  const __filename = fileURLToPath(import.meta.url);
8
8
  const __dirname = path.dirname(__filename);
9
9
  const packageRoot = path.resolve(__dirname, '..');
10
- const packageJson = JSON.parse(
11
- fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'),
12
- );
13
- const startersRoot = path.join(packageRoot, 'starters');
14
-
15
- const usage = `
16
- SCB Web Components
17
-
18
- Användning:
19
- npx scb-wc init <html|react|blazor> [mapp]
20
-
21
- Exempel:
22
- npx scb-wc init html my-app
23
- npx scb-wc init react my-react-app
24
- npx scb-wc init blazor my-blazor-app
25
- `.trim();
26
-
27
- const textExtensions = new Set([
28
- '.css',
29
- '.cs',
30
- '.csproj',
31
- '.html',
32
- '.js',
33
- '.json',
34
- '.jsx',
35
- '.md',
36
- '.razor',
37
- '.txt',
38
- ]);
10
+ const packageJson = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
11
+ const starterRoot = path.join(packageRoot, 'starters');
12
+ const templates = new Set(['html', 'html-service', 'react', 'react-service', 'blazor', 'blazor-service']);
13
+ const usage = 'npx scb-wc init <html|html-service|react|react-service|blazor|blazor-service> [mapp]';
39
14
 
40
15
  function fail(message) {
41
- console.error(`\n${message}\n`);
16
+ console.error(message);
17
+ console.error(`Användning: ${usage}`);
42
18
  process.exit(1);
43
19
  }
44
20
 
45
- function renameTemplateEntry(name) {
46
- return name.startsWith('dot-') ? `.${name.slice(4)}` : name;
21
+ function toPackageName(value) {
22
+ return value
23
+ .trim()
24
+ .toLowerCase()
25
+ .replace(/[^a-z0-9._-]+/g, '-')
26
+ .replace(/^-+|-+$/g, '') || 'scb-starter-app';
47
27
  }
48
28
 
49
- function toPascalCaseSegment(segment) {
50
- if (!segment) return '';
51
- return segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase();
52
- }
29
+ function toNamespace(value) {
30
+ const parts = value
31
+ .replace(/[^a-zA-Z0-9]+/g, ' ')
32
+ .trim()
33
+ .split(/\s+/)
34
+ .filter(Boolean);
53
35
 
54
- function sanitizeStarterNamespace(name) {
55
- const pascalCaseName = name
56
- .split(/[^A-Za-z0-9]+/)
57
- .filter(Boolean)
58
- .map(toPascalCaseSegment)
36
+ const namespace = parts
37
+ .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)
59
38
  .join('');
60
39
 
61
- if (!pascalCaseName) return 'ScbStarterApp';
62
- if (/^[0-9]/.test(pascalCaseName)) return `_${pascalCaseName}`;
63
- return pascalCaseName;
40
+ return /^[A-Za-z_][A-Za-z0-9_]*$/.test(namespace) ? namespace : 'ScbStarterApp';
64
41
  }
65
42
 
66
- function ensureTargetIsCreatable(targetDir) {
67
- if (!fs.existsSync(targetDir)) return;
68
- const entries = fs.readdirSync(targetDir);
69
- if (entries.length > 0) {
70
- fail(`Mappen ${targetDir} finns redan och är inte tom.`);
71
- }
43
+ function replacePlaceholders(source, targetName) {
44
+ return source
45
+ .replaceAll('__SCB_WC_PACKAGE_NAME__', packageJson.name)
46
+ .replaceAll('__SCB_WC_VERSION__', packageJson.version)
47
+ .replaceAll('__STARTER_NAME__', toPackageName(targetName))
48
+ .replaceAll('__STARTER_NAMESPACE__', toNamespace(targetName));
72
49
  }
73
50
 
74
- function copyTemplateDir(sourceDir, targetDir) {
51
+ function copyStarter(sourceDir, targetDir, targetName) {
75
52
  fs.mkdirSync(targetDir, { recursive: true });
76
53
 
77
54
  for (const entry of fs.readdirSync(sourceDir, { withFileTypes: true })) {
78
- const from = path.join(sourceDir, entry.name);
79
- const to = path.join(targetDir, renameTemplateEntry(entry.name));
55
+ const sourcePath = path.join(sourceDir, entry.name);
56
+ const targetNameForEntry = entry.name === 'dot-gitignore' ? '.gitignore' : entry.name;
57
+ const targetPath = path.join(targetDir, targetNameForEntry);
80
58
 
81
59
  if (entry.isDirectory()) {
82
- copyTemplateDir(from, to);
60
+ copyStarter(sourcePath, targetPath, targetName);
83
61
  continue;
84
62
  }
85
63
 
86
- fs.mkdirSync(path.dirname(to), { recursive: true });
87
- fs.copyFileSync(from, to);
64
+ const source = fs.readFileSync(sourcePath, 'utf8');
65
+ fs.writeFileSync(targetPath, replacePlaceholders(source, targetName), 'utf8');
88
66
  }
89
67
  }
90
68
 
91
- function replacePlaceholders(rootDir, replacements) {
92
- const walk = (currentDir) => {
93
- for (const entry of fs.readdirSync(currentDir, { withFileTypes: true })) {
94
- const fullPath = path.join(currentDir, entry.name);
95
-
96
- if (entry.isDirectory()) {
97
- walk(fullPath);
98
- continue;
99
- }
100
-
101
- const ext = path.extname(entry.name);
102
- if (!textExtensions.has(ext)) continue;
103
-
104
- let contents = fs.readFileSync(fullPath, 'utf8');
105
- for (const [placeholder, value] of Object.entries(replacements)) {
106
- contents = contents.replaceAll(placeholder, value);
107
- }
108
- fs.writeFileSync(fullPath, contents, 'utf8');
109
- }
110
- };
111
-
112
- walk(rootDir);
113
- }
114
-
115
- const [, , command, template, maybeTargetDir] = process.argv;
116
-
117
- if (!command || command === '--help' || command === '-h') {
118
- console.log(usage);
119
- process.exit(0);
120
- }
69
+ const [, , command, template, targetArg] = process.argv;
121
70
 
122
71
  if (command !== 'init') {
123
- fail(`Okänt kommando: ${command}\n\n${usage}`);
72
+ fail('Okänt kommando.');
124
73
  }
125
74
 
126
- if (!template || !['html', 'react', 'blazor'].includes(template)) {
127
- fail(`Välj en starter: html, react eller blazor.\n\n${usage}`);
75
+ if (!templates.has(template)) {
76
+ fail('Okänd mall.');
128
77
  }
129
78
 
130
- const targetDir = path.resolve(process.cwd(), maybeTargetDir || `${template}-starter`);
131
- const sourceDir = path.join(startersRoot, template);
79
+ const targetName = targetArg ?? `scb-${template}-app`;
80
+ const sourceDir = path.join(starterRoot, template);
81
+ const targetDir = path.resolve(process.cwd(), targetName);
132
82
 
133
83
  if (!fs.existsSync(sourceDir)) {
134
- fail(`Hittar inte startermallen för ${template}.`);
84
+ fail(`Saknar starter: ${template}`);
135
85
  }
136
86
 
137
- ensureTargetIsCreatable(targetDir);
138
- copyTemplateDir(sourceDir, targetDir);
139
- replacePlaceholders(targetDir, {
140
- '__SCB_WC_PACKAGE_NAME__': packageJson.name,
141
- '__SCB_WC_VERSION__': packageJson.version,
142
- '__STARTER_NAME__': path.basename(targetDir),
143
- '__STARTER_NAMESPACE__': sanitizeStarterNamespace(path.basename(targetDir)),
144
- });
145
-
146
- console.log(`\nSkapade ${template}-starter i ${targetDir}\n`);
147
-
148
- if (template === 'blazor') {
149
- console.log('Nästa steg:');
150
- console.log(` 1. cd ${targetDir}`);
151
- console.log(' 2. npm install');
152
- console.log(' 3. npm run ui:setup');
153
- console.log(' 4. dotnet run');
154
- } else {
155
- console.log('Nästa steg:');
156
- console.log(` 1. cd ${targetDir}`);
157
- console.log(' 2. npm install');
158
- console.log(' 3. npm run dev');
87
+ if (fs.existsSync(targetDir) && fs.readdirSync(targetDir).length > 0) {
88
+ fail(`Mappen finns redan och är inte tom: ${targetDir}`);
159
89
  }
90
+
91
+ copyStarter(sourceDir, targetDir, path.basename(targetDir));
92
+
93
+ console.log(`Skapade ${template}-starter i ${targetDir}`);
package/index.js CHANGED
@@ -27,6 +27,11 @@ import { ScbCalendar as T } from "./scb-calendar/scb-calendar.js";
27
27
  import { ScbCalendarCard as E } from "./scb-calendar-card/scb-calendar-card.js";
28
28
  import { ScbTooltip as D } from "./scb-tooltip/scb-tooltip.js";
29
29
  import { ScbActionCard as O, ScbCard as k, ScbContainerCard as A, ScbLinkCard as j, ScbListCard as M, ScbSocialCard as N } from "./scb-card/scb-card.js";
30
+ import "./scb-card/scb-action-card.js";
31
+ import "./scb-card/scb-container-card.js";
32
+ import "./scb-card/scb-link-card.js";
33
+ import "./scb-card/scb-list-card.js";
34
+ import "./scb-card/scb-social-card.js";
30
35
  import { ScbCollapse as P } from "./scb-collapse/scb-collapse.js";
31
36
  import { ScbCookiesConsent as F } from "./scb-cookies-consent/scb-cookies-consent.js";
32
37
  import { ScbDrawer as I } from "./scb-drawer/scb-drawer.js";
@@ -9,7 +9,12 @@ import './scb-button/scb-button.js';
9
9
  import './scb-calendar-card/scb-calendar-card.js';
10
10
  import './scb-calendar/scb-calendar.js';
11
11
  import './scb-calendar/scb-calendar-event.js';
12
+ import './scb-card/scb-action-card.js';
12
13
  import './scb-card/scb-card.js';
14
+ import './scb-card/scb-container-card.js';
15
+ import './scb-card/scb-link-card.js';
16
+ import './scb-card/scb-list-card.js';
17
+ import './scb-card/scb-social-card.js';
13
18
  import './scb-checkbox/scb-checkbox.js';
14
19
  import './scb-checkbox/scb-checkbox-group.js';
15
20
  import './scb-chevron/scb-chevron.js';
@@ -0,0 +1 @@
1
+ import"./scb-card.js";(function(){try{var t=typeof globalThis<"u"?globalThis:window;if(!t.__scb_ce_guard_installed__){t.__scb_ce_guard_installed__=!0;var r=customElements.define.bind(customElements);customElements.define=function(e,o,c){try{customElements.get(e)||r(e,o,c)}catch(i){var n=String(i||"");if(n.indexOf("already been used")===-1&&n.indexOf("NotSupportedError")===-1)throw i}}}}catch{}})();