@oicl/openbridge-webcomponents-full-bundle 2.0.0-next.48 → 2.0.0-next.49

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 (43) hide show
  1. package/.storybook/ComponentPreview.tsx +26 -0
  2. package/.storybook/PreviewTemplate.tsx +99 -0
  3. package/.storybook/action-handler.ts +81 -0
  4. package/.storybook/channels.ts +44 -0
  5. package/.storybook/main.ts +313 -0
  6. package/.storybook/manager.ts +71 -0
  7. package/.storybook/openbridgeTheme.ts +197 -0
  8. package/.storybook/preview-head.html +15 -0
  9. package/.storybook/preview.tsx +129 -0
  10. package/.storybook/vitest.setup.ts +23 -0
  11. package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
  12. package/custom-elements.json +7 -1
  13. package/dist/components/icon-button/icon-button.d.ts +4 -0
  14. package/dist/components/icon-button/icon-button.d.ts.map +1 -1
  15. package/dist/components/icon-button/icon-button.js.map +1 -1
  16. package/eslint.config.mjs +589 -0
  17. package/fix-imports.mjs +185 -0
  18. package/fix-js-extensions.mjs +44 -0
  19. package/lit-localize.json +15 -0
  20. package/new-component.ts +148 -0
  21. package/package.json +55 -3
  22. package/postcss.config.mjs +195 -0
  23. package/script/check-css-mixins.ts +191 -0
  24. package/script/check-css-variables.ts +280 -0
  25. package/script/convert-icons.ts +202 -0
  26. package/script/convert-vessel-svg-to-ts.ts +110 -0
  27. package/script/docgen/README.md +95 -0
  28. package/script/docgen/docs-gen.ts +225 -0
  29. package/script/docgen/prompt-system.txt +187 -0
  30. package/script/download-alert-icons.ts +193 -0
  31. package/script/download-icons.ts +314 -0
  32. package/script/figmavariables.json +139 -0
  33. package/script/generate-bundle-entry.ts +77 -0
  34. package/script/prepare-full-bundle.ts +105 -0
  35. package/script/sort-custom-element-manifest.ts +67 -0
  36. package/src/components/icon-button/icon-button.ts +4 -0
  37. package/vite.config.ts +107 -0
  38. package/vitest.browser.config.ts +14 -0
  39. package/vitest.config.ts +51 -0
  40. package/xliff/es-419.xlf +111 -0
  41. package/xliff/fi-FI.xlf +139 -0
  42. package/dist/NotoSans.ttf +0 -0
  43. package/dist/oicl.svg +0 -4
@@ -0,0 +1,77 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import {globSync} from 'glob';
4
+
5
+ const BUNDLE_FILE = 'bundle.ts';
6
+
7
+ function findComponentFiles(
8
+ directory: string,
9
+ excludeFiles: string[] = []
10
+ ): string[] {
11
+ const components: string[] = [];
12
+ const fullPath = path.join(process.cwd(), directory);
13
+
14
+ if (!fs.existsSync(fullPath)) {
15
+ return components;
16
+ }
17
+
18
+ const items = globSync(`${fullPath}/**/*.ts`, {
19
+ ignore: [
20
+ '**/*.stories.ts',
21
+ '**/*.spec.ts',
22
+ '**/*.test.ts',
23
+ '**/_test-utils.ts',
24
+ ],
25
+ });
26
+ const rootPath = path.join(process.cwd());
27
+
28
+ for (const item of items) {
29
+ if (
30
+ item.endsWith('.ts') &&
31
+ !item.endsWith('.stories.ts') &&
32
+ !excludeFiles.includes(item)
33
+ ) {
34
+ const filename = item.replace('.ts', '');
35
+ const relativePath = filename.replace(rootPath, '');
36
+
37
+ components.push(relativePath);
38
+ }
39
+ }
40
+
41
+ return components.sort((a, b) => a.localeCompare(b));
42
+ }
43
+
44
+ function generateBundleFile() {
45
+ console.log(`Generating ${BUNDLE_FILE}...`);
46
+
47
+ let content = `// Bundle entry file - imports all web components for standalone browser usage
48
+ // Auto-generated by script/generate-bundle-entry.ts - do not edit manually
49
+
50
+ // Types
51
+ export * from './src/types.js';
52
+
53
+ `;
54
+ const folders = fs
55
+ .readdirSync('src')
56
+ .map((dir) => path.join('src', dir))
57
+ .filter((dir) => fs.statSync(dir).isDirectory());
58
+
59
+ for (const folder of folders) {
60
+ console.log(`Adding components from ${folder}...`);
61
+ const components = findComponentFiles(folder);
62
+
63
+ if (components.length > 0) {
64
+ content += `// ${folder}\n`;
65
+ for (const comp of components) {
66
+ content += `import '.${comp}.js';\n`;
67
+ }
68
+ content += '\n';
69
+ }
70
+ }
71
+
72
+ fs.writeFileSync(BUNDLE_FILE, content, 'utf-8');
73
+
74
+ console.log(`✓ Generated ${BUNDLE_FILE} with all component imports`);
75
+ }
76
+
77
+ generateBundleFile();
@@ -0,0 +1,105 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+
4
+ const scriptPath = path.resolve(process.argv[1]);
5
+ const scriptDirectory = path.dirname(scriptPath);
6
+
7
+ const packageRoot = path.resolve(scriptDirectory, '..');
8
+ const sourcePackagePath = path.join(packageRoot, 'package.json');
9
+ const fullBundlePackageRoot = path.join(packageRoot, '.full-bundle-publish');
10
+ const sourcePackage = JSON.parse(fs.readFileSync(sourcePackagePath, 'utf-8'));
11
+ const releaseVersion = process.argv[2] ?? sourcePackage.version;
12
+ const {scripts: _scripts, ...sourcePackageWithoutScripts} = sourcePackage;
13
+
14
+ const nonWorkingScripts = new Set([
15
+ 'wrappers',
16
+ 'build:full',
17
+ 'wrappers:clean',
18
+ 'wrappers:build',
19
+ 'wrappers:generate',
20
+ 'wrappers:post-fix',
21
+ 'test-storybook:docker',
22
+ ]);
23
+
24
+ const scripts = Object.fromEntries(
25
+ Object.entries(_scripts).filter(([name]) => !nonWorkingScripts.has(name))
26
+ );
27
+
28
+ const fullBundlePackage = {
29
+ ...sourcePackageWithoutScripts,
30
+ name: '@oicl/openbridge-webcomponents-full-bundle',
31
+ version: releaseVersion,
32
+ scripts,
33
+ files: [
34
+ 'dist',
35
+ '!dist/AR-test-image.png',
36
+ '!dist/companylogo-day.png',
37
+ 'bundle/openbridge-webcomponents.bundle.js',
38
+ 'bundle/openbridge-webcomponents.bundle.js.map',
39
+ '.storybook',
40
+ 'script',
41
+ 'xliff',
42
+ 'src',
43
+ 'docs',
44
+ 'custom-elements.json',
45
+ 'tsconfig.json',
46
+ 'eslint.config.mjs',
47
+ 'vite.config.ts',
48
+ 'postcss.config.mjs',
49
+ 'lit-localize.json',
50
+ 'new-component.ts',
51
+ 'fix-imports.mjs',
52
+ 'fix-js-extensions.mjs',
53
+ 'vitest.browser.config.ts',
54
+ 'vitest.config.ts',
55
+ ],
56
+ };
57
+
58
+ fs.rmSync(fullBundlePackageRoot, {recursive: true, force: true});
59
+ fs.mkdirSync(fullBundlePackageRoot, {recursive: true});
60
+
61
+ for (const dirName of [
62
+ 'dist',
63
+ 'bundle',
64
+ 'src',
65
+ 'docs',
66
+ 'xliff',
67
+ 'script',
68
+ '.storybook',
69
+ ]) {
70
+ fs.cpSync(
71
+ path.join(packageRoot, dirName),
72
+ path.join(fullBundlePackageRoot, dirName),
73
+ {
74
+ recursive: true,
75
+ }
76
+ );
77
+ }
78
+
79
+ for (const file of [
80
+ 'custom-elements.json',
81
+ 'tsconfig.json',
82
+ 'vite.config.ts',
83
+ 'eslint.config.mjs',
84
+ 'postcss.config.mjs',
85
+ 'lit-localize.json',
86
+ 'new-component.ts',
87
+ 'fix-imports.mjs',
88
+ 'fix-js-extensions.mjs',
89
+ 'vitest.browser.config.ts',
90
+ 'vitest.config.ts',
91
+ ]) {
92
+ fs.copyFileSync(
93
+ path.join(packageRoot, file),
94
+ path.join(fullBundlePackageRoot, file)
95
+ );
96
+ }
97
+
98
+ fs.writeFileSync(
99
+ path.join(fullBundlePackageRoot, 'package.json'),
100
+ JSON.stringify(fullBundlePackage, null, 2) + '\n'
101
+ );
102
+
103
+ console.log(
104
+ `✓ Prepared full-bundle publish directory: ${fullBundlePackageRoot}`
105
+ );
@@ -0,0 +1,67 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+
4
+ interface Declaration {
5
+ kind: string;
6
+ name?: string;
7
+ [key: string]: unknown;
8
+ }
9
+
10
+ interface Module {
11
+ kind: string;
12
+ path: string;
13
+ declarations?: Declaration[];
14
+ exports?: unknown[];
15
+ [key: string]: unknown;
16
+ }
17
+
18
+ interface CustomElementsJson {
19
+ schemaVersion: string;
20
+ readme: string;
21
+ modules: Module[];
22
+ }
23
+
24
+ const filePath = path.join(process.cwd(), 'custom-elements.json');
25
+
26
+ const data: CustomElementsJson = JSON.parse(fs.readFileSync(filePath, 'utf8'));
27
+
28
+ const filteredModules = data.modules
29
+ .map((module): Module | null => {
30
+ if (!module.declarations || !Array.isArray(module.declarations)) {
31
+ return null;
32
+ }
33
+
34
+ const filteredDeclarations = module.declarations.filter(
35
+ (declaration: Declaration) => {
36
+ return declaration.name && declaration.name.startsWith('Obc');
37
+ }
38
+ );
39
+
40
+ if (filteredDeclarations.length === 0) {
41
+ return null;
42
+ }
43
+
44
+ return {
45
+ ...module,
46
+ declarations: filteredDeclarations,
47
+ };
48
+ })
49
+ .filter((module): module is Module => module !== null);
50
+
51
+ filteredModules.sort((a, b) => {
52
+ const pathA = a.path || '';
53
+ const pathB = b.path || '';
54
+ return pathA.localeCompare(pathB);
55
+ });
56
+
57
+ const result: CustomElementsJson = {
58
+ ...data,
59
+ modules: filteredModules,
60
+ };
61
+
62
+ fs.writeFileSync(filePath, JSON.stringify(result, null, 2) + '\n', 'utf8');
63
+
64
+ console.log(
65
+ `Filtered and sorted ${filteredModules.length} modules with Obc declarations`
66
+ );
67
+ console.log(`Original file had ${data.modules.length} modules`);
@@ -58,6 +58,9 @@ export enum IconButtonVariant {
58
58
  * | (default) | Always | The icon to display (e.g., `<obi-search>`) |
59
59
  * | label | If `hasLabel` is set | Optional label text below the icon |
60
60
  *
61
+ * ## Events
62
+ * - Emits a standard `click` event (`onClick` handler in framework wrappers) when activated.
63
+ *
61
64
  * ## Best Practices
62
65
  * - Ensure icons are clear and universally recognizable.
63
66
  * - For accessibility, provide an `aria-label` or descriptive label for the button's action.
@@ -77,6 +80,7 @@ export enum IconButtonVariant {
77
80
  *
78
81
  * @slot - Icon slot (default): Place an icon such as <obi-search> here.
79
82
  * @slot label - Optional label shown below the icon when `hasLabel` is true.
83
+ * @fires click - Fired when the button is clicked (if not disabled).
80
84
  */
81
85
  @customElement('obc-icon-button')
82
86
  export class ObcIconButton extends LitElement {
package/vite.config.ts ADDED
@@ -0,0 +1,107 @@
1
+ import postcssLit from 'rollup-plugin-postcss-lit';
2
+ import {defineConfig} from 'vite';
3
+ import dts from 'vite-plugin-dts';
4
+ import {globbySync} from 'globby';
5
+ import postcss from 'postcss';
6
+ import postcssConfig from './postcss.config.mjs';
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+
10
+ const input = globbySync('src/**/*.ts', {
11
+ ignore: [
12
+ 'src/**/*.stories.ts',
13
+ 'src/**/*.spec.ts',
14
+ 'src/**/*.test.ts',
15
+ 'src/storybook-util.ts',
16
+ 'src/ar/_test-utils.ts',
17
+ ],
18
+ });
19
+
20
+ // https://vitejs.dev/config/
21
+ export default defineConfig(({mode}) => {
22
+ const isBundleMode = mode === 'bundle';
23
+
24
+ return {
25
+ build: {
26
+ minify: false,
27
+ lib: {
28
+ entry: 'src/index.ts',
29
+ name: 'openbridge-webcomponents',
30
+ fileName: 'openbridge-webcomponents',
31
+ formats: ['es'],
32
+ },
33
+ rollupOptions: {
34
+ input: isBundleMode ? 'bundle.ts' : input,
35
+ external: isBundleMode
36
+ ? // For bundle mode, bundle everything (no externals)
37
+ []
38
+ : // For regular mode, externalize as before
39
+ (id) =>
40
+ id.startsWith('lit') ||
41
+ id.startsWith('@lit') ||
42
+ id.startsWith('uplot') ||
43
+ id.startsWith('chart.js') ||
44
+ id.startsWith('@kurkle/color'),
45
+ preserveEntrySignatures: 'strict',
46
+ output: isBundleMode
47
+ ? // Bundle mode: single file output
48
+ {
49
+ format: 'es',
50
+ entryFileNames: 'openbridge-webcomponents.bundle.js',
51
+ dir: 'bundle',
52
+ sourcemap: true,
53
+ preserveModules: false,
54
+ inlineDynamicImports: true,
55
+ }
56
+ : // Regular mode: preserve modules
57
+ {
58
+ format: 'es',
59
+ entryFileNames: (opt) => {
60
+ return `${opt.name}.js`;
61
+ },
62
+ sourcemap: true,
63
+ preserveModules: true,
64
+ preserveModulesRoot: 'src',
65
+ inlineDynamicImports: false,
66
+ },
67
+ },
68
+ },
69
+ plugins: [
70
+ postcssLit(),
71
+ dts({
72
+ clearPureImport: false,
73
+ exclude: [
74
+ 'src/**/*.stories.ts',
75
+ 'src/**/*.spec.ts',
76
+ 'src/**/*.test.ts',
77
+ 'src/storybook-util.ts',
78
+ 'src/ar/_test-utils.ts',
79
+ ],
80
+ }),
81
+ {
82
+ name: 'custom-postcss',
83
+ async generateBundle() {
84
+ const inputCSS = path.resolve(__dirname, 'src/main.css'); // Your source CSS
85
+ // Make dist folder if it doesn't exist
86
+ if (!fs.existsSync(path.resolve(__dirname, 'dist'))) {
87
+ fs.mkdirSync(path.resolve(__dirname, 'dist'));
88
+ }
89
+ const outputCSS = path.resolve(__dirname, 'dist/openbridge.css'); // Destination
90
+
91
+ if (fs.existsSync(inputCSS)) {
92
+ const css = fs.readFileSync(inputCSS, 'utf-8');
93
+ const result = await postcss(postcssConfig({}).plugins).process(
94
+ css,
95
+ {
96
+ from: inputCSS,
97
+ to: outputCSS,
98
+ }
99
+ );
100
+
101
+ fs.writeFileSync(outputCSS, result.css);
102
+ }
103
+ },
104
+ },
105
+ ],
106
+ };
107
+ });
@@ -0,0 +1,14 @@
1
+ import {defineConfig} from 'vitest/config';
2
+ import {playwright} from '@vitest/browser-playwright';
3
+
4
+ export default defineConfig({
5
+ test: {
6
+ // ignore files in dist folder
7
+ exclude: ['dist/**', 'node_modules/**'],
8
+ browser: {
9
+ enabled: true,
10
+ provider: playwright(),
11
+ instances: [{browser: 'chromium'}],
12
+ },
13
+ },
14
+ });
@@ -0,0 +1,51 @@
1
+ import {defineConfig} from 'vitest/config';
2
+ import {playwright} from '@vitest/browser-playwright';
3
+
4
+ import {storybookTest} from '@storybook/addon-vitest/vitest-plugin';
5
+ import {storybookVis} from 'storybook-addon-vis/vitest-plugin';
6
+
7
+ import path from 'node:path';
8
+ import {fileURLToPath} from 'node:url';
9
+
10
+ const dirname = path.dirname(fileURLToPath(import.meta.url));
11
+
12
+ export default defineConfig({
13
+ test: {
14
+ projects: [
15
+ {
16
+ extends: true,
17
+ plugins: [
18
+ storybookTest({
19
+ // The location of your Storybook config, main.js|ts
20
+ configDir: path.join(dirname, '.storybook'),
21
+ // This should match your package.json script to run Storybook
22
+ // The --no-open flag will skip the automatic opening of a browser
23
+ storybookScript: 'npm run storybook --no-open',
24
+ tags: {
25
+ exclude: ['skip-test'],
26
+ },
27
+ }),
28
+ storybookVis({
29
+ comparisonMethod: 'pixel',
30
+ failureThreshold: 4,
31
+ failureThresholdType: 'pixel',
32
+ snapshotRootDir: (config) =>
33
+ path.join(dirname, '__vis__', config.platform),
34
+ }),
35
+ ],
36
+ test: {
37
+ name: 'storybook',
38
+ setupFiles: ['./.storybook/vitest.setup.ts'],
39
+ // Enable browser mode
40
+ browser: {
41
+ enabled: true,
42
+ // Make sure to install Playwright
43
+ provider: playwright({}),
44
+ headless: true,
45
+ instances: [{browser: 'chromium'}],
46
+ },
47
+ },
48
+ },
49
+ ],
50
+ },
51
+ });
@@ -0,0 +1,111 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
3
+ <file target-language="es-419" source-language="en" original="lit-localize-inputs" datatype="plaintext">
4
+ <body>
5
+ <trans-unit id="sa7f8e003ff63ef9f">
6
+ <source>No active alerts</source>
7
+ <target>No alertas activas</target>
8
+ </trans-unit>
9
+ <trans-unit id="s3cd891731e99f7e6">
10
+ <source>Active alerts</source>
11
+ <target>Alertas activas</target>
12
+ </trans-unit>
13
+ <trans-unit id="s8119af112f965c78">
14
+ <source>Brilliance</source>
15
+ <target>Brillantez</target>
16
+ </trans-unit>
17
+ <trans-unit id="se0955919920ee87d">
18
+ <source>Day</source>
19
+ <target>Día</target>
20
+ </trans-unit>
21
+ <trans-unit id="s0f3699a7bd401f61">
22
+ <source>Night</source>
23
+ <target>Noche</target>
24
+ </trans-unit>
25
+ <trans-unit id="sf993bb199fefbe04">
26
+ <source>All</source>
27
+ </trans-unit>
28
+ <trans-unit id="s01b603dddbaba7b6">
29
+ <source>Unacked</source>
30
+ </trans-unit>
31
+ <trans-unit id="se92d11374fcdf768">
32
+ <source>No unacknowledged alerts</source>
33
+ </trans-unit>
34
+ <trans-unit id="sf268637d594dacb2">
35
+ <source>Shelved</source>
36
+ </trans-unit>
37
+ <trans-unit id="s2a2488656f97b746">
38
+ <source>No shelved alerts</source>
39
+ </trans-unit>
40
+ <trans-unit id="sf59d9197d2e50c93">
41
+ <source>Blocked</source>
42
+ </trans-unit>
43
+ <trans-unit id="s61a9ee872da3a0cd">
44
+ <source>No blocked alerts</source>
45
+ </trans-unit>
46
+ <trans-unit id="s16fccc311f4779f6">
47
+ <source>Rectified</source>
48
+ </trans-unit>
49
+ <trans-unit id="seb27af82aef6a03e">
50
+ <source>No rectified alerts</source>
51
+ </trans-unit>
52
+ <trans-unit id="sfa32c219a0764262">
53
+ <source>ACK</source>
54
+ </trans-unit>
55
+ <trans-unit id="s5ba9818f6a39054c">
56
+ <source>Go to the 'Alert list' for more details or to manage existing alerts.</source>
57
+ </trans-unit>
58
+ <trans-unit id="sa6ef04345891fb38">
59
+ <source>ACK visible</source>
60
+ </trans-unit>
61
+ <trans-unit id="s68395a4c26a9e8ac">
62
+ <source>Silence</source>
63
+ </trans-unit>
64
+ <trans-unit id="s88d1c1e15ca1aade">
65
+ <source>Alerts</source>
66
+ </trans-unit>
67
+ <trans-unit id="s3cf89cb47fdde7e9">
68
+ <source>Link</source>
69
+ </trans-unit>
70
+ <trans-unit id="s47278872f6826da8">
71
+ <source>Dusk</source>
72
+ </trans-unit>
73
+ <trans-unit id="s9e34794bcfdc6665">
74
+ <source>Bright</source>
75
+ </trans-unit>
76
+ <trans-unit id="s33e301ba1f4a6864">
77
+ <source>Screen Control</source>
78
+ </trans-unit>
79
+ <trans-unit id="s6686fcc6d2c8f0bd">
80
+ <source>Note</source>
81
+ </trans-unit>
82
+ <trans-unit id="sfbc33dd48f23752c">
83
+ <source>Tag ID</source>
84
+ </trans-unit>
85
+ <trans-unit id="s079a052719914d71">
86
+ <source>Category</source>
87
+ </trans-unit>
88
+ <trans-unit id="sa2b9faa7ad068cfc">
89
+ <source>Activated</source>
90
+ </trans-unit>
91
+ <trans-unit id="s35aab6bf5dda3be0">
92
+ <source>Alert timer</source>
93
+ </trans-unit>
94
+ <trans-unit id="sdc7335a13d9e03f5">
95
+ <source>Acknowledged</source>
96
+ </trans-unit>
97
+ <trans-unit id="s93c7817bb872836a">
98
+ <source>Acknowledged by</source>
99
+ </trans-unit>
100
+ <trans-unit id="sf2de3605b3655264">
101
+ <source>Shelfing timer</source>
102
+ </trans-unit>
103
+ <trans-unit id="s097d821eb8e9069f">
104
+ <source>Shelved by</source>
105
+ </trans-unit>
106
+ <trans-unit id="sa711a6fcc9552dbf">
107
+ <source>Readout</source>
108
+ </trans-unit>
109
+ </body>
110
+ </file>
111
+ </xliff>
@@ -0,0 +1,139 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
3
+ <file target-language="fi-FI" source-language="en" original="lit-localize-inputs" datatype="plaintext">
4
+ <body>
5
+ <trans-unit id="sf993bb199fefbe04">
6
+ <source>All</source>
7
+ <target>Kaikki</target>
8
+ </trans-unit>
9
+ <trans-unit id="sa7f8e003ff63ef9f">
10
+ <source>No active alerts</source>
11
+ <target>Ei aktiivisia hälytyksiä</target>
12
+ </trans-unit>
13
+ <trans-unit id="s01b603dddbaba7b6">
14
+ <source>Unacked</source>
15
+ <target>Vahvistamaton</target>
16
+ </trans-unit>
17
+ <trans-unit id="se92d11374fcdf768">
18
+ <source>No unacknowledged alerts</source>
19
+ <target>Ei vahvistamattomia hälytyksiä</target>
20
+ </trans-unit>
21
+ <trans-unit id="sf268637d594dacb2">
22
+ <source>Shelved</source>
23
+ <target>Hyllytetty</target>
24
+ </trans-unit>
25
+ <trans-unit id="s2a2488656f97b746">
26
+ <source>No shelved alerts</source>
27
+ <target>Ei hyllytettyjä hälytyksiä</target>
28
+ </trans-unit>
29
+ <trans-unit id="sf59d9197d2e50c93">
30
+ <source>Blocked</source>
31
+ <target>Estetty</target>
32
+ </trans-unit>
33
+ <trans-unit id="s61a9ee872da3a0cd">
34
+ <source>No blocked alerts</source>
35
+ <target>Ei estettyjä hälytyksiä</target>
36
+ </trans-unit>
37
+ <trans-unit id="s16fccc311f4779f6">
38
+ <source>Rectified</source>
39
+ <target>Korjattu</target>
40
+ </trans-unit>
41
+ <trans-unit id="seb27af82aef6a03e">
42
+ <source>No rectified alerts</source>
43
+ <target>Ei korjattuja hälytyksiä</target>
44
+ </trans-unit>
45
+ <trans-unit id="sfa32c219a0764262">
46
+ <source>ACK</source>
47
+ <target>VAHVISTA</target>
48
+ </trans-unit>
49
+ <trans-unit id="s5ba9818f6a39054c">
50
+ <source>Go to the 'Alert list' for more details or to manage existing alerts.</source>
51
+ <target>Siirry 'Hälytyslistaan' saadaksesi lisätietoja tai hallitaksesi olemassa olevia hälytyksiä.</target>
52
+ </trans-unit>
53
+ <trans-unit id="s3cd891731e99f7e6">
54
+ <source>Active alerts</source>
55
+ <target>Aktiiviset hälytykset</target>
56
+ </trans-unit>
57
+ <trans-unit id="sa6ef04345891fb38">
58
+ <source>ACK visible</source>
59
+ <target>Vahvistus näkyvissä</target>
60
+ </trans-unit>
61
+ <trans-unit id="s68395a4c26a9e8ac">
62
+ <source>Silence</source>
63
+ <target>Hiljennä</target>
64
+ </trans-unit>
65
+ <trans-unit id="s88d1c1e15ca1aade">
66
+ <source>Alerts</source>
67
+ <target>Hälytykset</target>
68
+ </trans-unit>
69
+ <trans-unit id="s8119af112f965c78">
70
+ <source>Brilliance</source>
71
+ <target>Kirkkaus</target>
72
+ </trans-unit>
73
+ <trans-unit id="s3cf89cb47fdde7e9">
74
+ <source>Link</source>
75
+ <target>Linkki</target>
76
+ </trans-unit>
77
+ <trans-unit id="s0f3699a7bd401f61">
78
+ <source>Night</source>
79
+ <target>Yö</target>
80
+ </trans-unit>
81
+ <trans-unit id="s47278872f6826da8">
82
+ <source>Dusk</source>
83
+ <target>Hämärä</target>
84
+ </trans-unit>
85
+ <trans-unit id="se0955919920ee87d">
86
+ <source>Day</source>
87
+ <target>Päivä</target>
88
+ </trans-unit>
89
+ <trans-unit id="s9e34794bcfdc6665">
90
+ <source>Bright</source>
91
+ <target>Kirkas</target>
92
+ </trans-unit>
93
+ <trans-unit id="s33e301ba1f4a6864">
94
+ <source>Screen Control</source>
95
+ <target>Näytön hallinta</target>
96
+ </trans-unit>
97
+ <trans-unit id="s6686fcc6d2c8f0bd">
98
+ <source>Note</source>
99
+ <target>Huomautus</target>
100
+ </trans-unit>
101
+ <trans-unit id="sfbc33dd48f23752c">
102
+ <source>Tag ID</source>
103
+ <target>Tunnistetunnus</target>
104
+ </trans-unit>
105
+ <trans-unit id="s079a052719914d71">
106
+ <source>Category</source>
107
+ <target>Kategoria</target>
108
+ </trans-unit>
109
+ <trans-unit id="sa2b9faa7ad068cfc">
110
+ <source>Activated</source>
111
+ <target>Aktivoitu</target>
112
+ </trans-unit>
113
+ <trans-unit id="s35aab6bf5dda3be0">
114
+ <source>Alert timer</source>
115
+ <target>Hälytysajastin</target>
116
+ </trans-unit>
117
+ <trans-unit id="sdc7335a13d9e03f5">
118
+ <source>Acknowledged</source>
119
+ <target>Vahvistettu</target>
120
+ </trans-unit>
121
+ <trans-unit id="s93c7817bb872836a">
122
+ <source>Acknowledged by</source>
123
+ <target>Vahvistanut</target>
124
+ </trans-unit>
125
+ <trans-unit id="sf2de3605b3655264">
126
+ <source>Shelfing timer</source>
127
+ <target>Hyllytysajastin</target>
128
+ </trans-unit>
129
+ <trans-unit id="s097d821eb8e9069f">
130
+ <source>Shelved by</source>
131
+ <target>Hyllyttänyt</target>
132
+ </trans-unit>
133
+ <trans-unit id="sa711a6fcc9552dbf">
134
+ <source>Readout</source>
135
+ <target>Lukeminen</target>
136
+ </trans-unit>
137
+ </body>
138
+ </file>
139
+ </xliff>
package/dist/NotoSans.ttf DELETED
Binary file