tera-system-ui 0.0.15 → 0.0.17

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 (70) hide show
  1. package/dist/components/brand-logo/BrandLogo.svelte +31 -31
  2. package/dist/components/button/Button.svelte +49 -49
  3. package/dist/components/combobox/Combobox.svelte +8 -8
  4. package/dist/components/command/command.scss +72 -72
  5. package/dist/components/command/components/Command.svelte +120 -120
  6. package/dist/components/command/components/CommandEmpty.svelte +30 -30
  7. package/dist/components/command/components/CommandGroup.svelte +110 -110
  8. package/dist/components/command/components/CommandInput.svelte +92 -92
  9. package/dist/components/command/components/CommandItem.svelte +110 -110
  10. package/dist/components/command/components/CommandList.svelte +56 -56
  11. package/dist/components/command/components/CommandLoading.svelte +28 -28
  12. package/dist/components/command/components/CommandSeparator.svelte +21 -21
  13. package/dist/components/dialog/Dialog.svelte +107 -107
  14. package/dist/components/dialog/dialog.scss +112 -112
  15. package/dist/components/header/Header.svelte +36 -36
  16. package/dist/components/header/header.scss +19 -19
  17. package/dist/components/icons/IconArrowBigRightFilled.svelte +10 -10
  18. package/dist/components/icons/IconBook.svelte +10 -10
  19. package/dist/components/icons/IconBookmarkPlus.svelte +10 -10
  20. package/dist/components/icons/IconCalculator.svelte +10 -10
  21. package/dist/components/icons/IconCheck.svelte +10 -10
  22. package/dist/components/icons/IconChevronDown.svelte +10 -10
  23. package/dist/components/icons/IconCopy.svelte +10 -10
  24. package/dist/components/icons/IconCopyCheckFilled.svelte +10 -10
  25. package/dist/components/icons/IconHamburger.svelte +10 -10
  26. package/dist/components/icons/IconLanguage.svelte +10 -10
  27. package/dist/components/icons/IconLoader2.svelte +10 -10
  28. package/dist/components/icons/IconMoon.svelte +10 -10
  29. package/dist/components/icons/IconPointFilled.svelte +10 -10
  30. package/dist/components/icons/IconSearch.svelte +10 -10
  31. package/dist/components/icons/IconSun.svelte +10 -10
  32. package/dist/components/icons/IconSwitchHorizontal.svelte +10 -10
  33. package/dist/components/icons/IconSwitchVertical.svelte +10 -10
  34. package/dist/components/icons/IconTransform.svelte +10 -10
  35. package/dist/components/icons/IconX.svelte +10 -10
  36. package/dist/components/input/Input.svelte +24 -24
  37. package/dist/components/language-picker-button/LanguagePickerButton.svelte +109 -109
  38. package/dist/components/light-dark-toggle/LightDarkToggle.svelte +36 -36
  39. package/dist/components/popover/Popover.svelte +136 -136
  40. package/dist/components/popover-responsive/PopoverResponsive.svelte +87 -87
  41. package/dist/components/side-navigation/SideNavigation.svelte +114 -113
  42. package/dist/components/side-navigation/SideNavigationItem.svelte +17 -17
  43. package/dist/components/side-navigation/SideNavigationLayout.svelte +19 -19
  44. package/dist/components/side-navigation/sidenav.scss +149 -149
  45. package/dist/components/tera-ui-context/TeraUiContext.svelte +28 -28
  46. package/dist/paraglide/.prettierignore +3 -0
  47. package/dist/paraglide/messages/de.d.ts +4 -0
  48. package/dist/paraglide/messages/de.js +42 -0
  49. package/dist/paraglide/messages/en.d.ts +4 -0
  50. package/dist/paraglide/messages/en.js +42 -0
  51. package/dist/paraglide/messages/es.d.ts +4 -0
  52. package/dist/paraglide/messages/es.js +42 -0
  53. package/dist/paraglide/messages/fr.d.ts +4 -0
  54. package/dist/paraglide/messages/fr.js +42 -0
  55. package/dist/paraglide/messages/it.d.ts +4 -0
  56. package/dist/paraglide/messages/it.js +42 -0
  57. package/dist/paraglide/messages/pt.d.ts +4 -0
  58. package/dist/paraglide/messages/pt.js +42 -0
  59. package/dist/paraglide/messages/ru.d.ts +4 -0
  60. package/dist/paraglide/messages/ru.js +42 -0
  61. package/dist/paraglide/messages/vi.d.ts +4 -0
  62. package/dist/paraglide/messages/vi.js +42 -0
  63. package/dist/paraglide/messages.d.ts +12 -0
  64. package/dist/paraglide/messages.js +122 -0
  65. package/dist/paraglide/runtime.d.ts +52 -0
  66. package/dist/paraglide/runtime.js +141 -0
  67. package/dist/themes/scrollbar.scss +37 -37
  68. package/package.json +95 -94
  69. package/scripts/add-component-template.js +120 -120
  70. package/scripts/generate-ts-index.js +136 -136
@@ -0,0 +1,141 @@
1
+ /* eslint-disable */
2
+ /** @type {((tag: AvailableLanguageTag) => void) | undefined} */
3
+ let _onSetLanguageTag
4
+
5
+ /**
6
+ * The project's source language tag.
7
+ *
8
+ * @example
9
+ * if (newlySelectedLanguageTag === sourceLanguageTag){
10
+ * // do nothing as the source language tag is the default language
11
+ * return
12
+ * }
13
+ */
14
+ export const sourceLanguageTag = "en"
15
+
16
+ /**
17
+ * The project's available language tags.
18
+ *
19
+ * @example
20
+ * if (availableLanguageTags.includes(userSelectedLanguageTag) === false){
21
+ * throw new Error("Language tag not available")
22
+ * }
23
+ */
24
+ export const availableLanguageTags = /** @type {const} */ (["de","en","es","fr","pt","vi","ru","it"])
25
+
26
+ /**
27
+ * Get the current language tag.
28
+ *
29
+ * @example
30
+ * if (languageTag() === "de"){
31
+ * console.log("Germany 🇩🇪")
32
+ * } else if (languageTag() === "nl"){
33
+ * console.log("Netherlands 🇳🇱")
34
+ * }
35
+ *
36
+ * @type {() => AvailableLanguageTag}
37
+ */
38
+ export let languageTag = () => sourceLanguageTag
39
+
40
+ /**
41
+ * Set the language tag.
42
+ *
43
+ * @example
44
+ *
45
+ * // changing to language
46
+ * setLanguageTag("en")
47
+ *
48
+ * // passing a getter function also works.
49
+ * //
50
+ * // a getter function is useful for resolving a language tag
51
+ * // on the server where every request has a different language tag
52
+ * setLanguageTag(() => {
53
+ * return request.languageTag
54
+ * })
55
+ *
56
+ * @param {AvailableLanguageTag | (() => AvailableLanguageTag)} tag
57
+ */
58
+ export const setLanguageTag = (tag) => {
59
+ if (typeof tag === "function") {
60
+ languageTag = enforceLanguageTag(tag)
61
+ } else {
62
+ languageTag = enforceLanguageTag(() => tag)
63
+ }
64
+ // call the callback function if it has been defined
65
+ if (_onSetLanguageTag !== undefined) {
66
+ _onSetLanguageTag(languageTag())
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Wraps an untrusted function and enforces that it returns a language tag.
72
+ * @param {() => AvailableLanguageTag} unsafeLanguageTag
73
+ * @returns {() => AvailableLanguageTag}
74
+ */
75
+ function enforceLanguageTag(unsafeLanguageTag) {
76
+ return () => {
77
+ const tag = unsafeLanguageTag()
78
+ if(!isAvailableLanguageTag(tag)) {
79
+ throw new Error(`languageTag() didn't return a valid language tag. Check your setLanguageTag call`)
80
+ }
81
+ return tag
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Set the `onSetLanguageTag()` callback function.
87
+ *
88
+ * The function can be used to trigger client-side side-effects such as
89
+ * making a new request to the server with the updated language tag,
90
+ * or re-rendering the UI on the client (SPA apps).
91
+ *
92
+ * - Don't use this function on the server (!).
93
+ * Triggering a side-effect is only useful on the client because a server-side
94
+ * environment doesn't need to re-render the UI.
95
+ *
96
+ * - The `onSetLanguageTag()` callback can only be defined once to avoid unexpected behavior.
97
+ *
98
+ * @example
99
+ * // if you use inlang paraglide on the server, make sure
100
+ * // to not call `onSetLanguageTag()` on the server
101
+ * if (isServer === false) {
102
+ * onSetLanguageTag((tag) => {
103
+ * // (for example) make a new request to the
104
+ * // server with the updated language tag
105
+ * window.location.href = `/${tag}/${window.location.pathname}`
106
+ * })
107
+ * }
108
+ *
109
+ * @param {(languageTag: AvailableLanguageTag) => void} fn
110
+ */
111
+ export const onSetLanguageTag = (fn) => {
112
+ _onSetLanguageTag = fn
113
+ }
114
+
115
+ /**
116
+ * Check if something is an available language tag.
117
+ *
118
+ * @example
119
+ * if (isAvailableLanguageTag(params.locale)) {
120
+ * setLanguageTag(params.locale)
121
+ * } else {
122
+ * setLanguageTag("en")
123
+ * }
124
+ *
125
+ * @param {any} thing
126
+ * @returns {thing is AvailableLanguageTag}
127
+ */
128
+ export function isAvailableLanguageTag(thing) {
129
+ return availableLanguageTags.includes(thing)
130
+ }
131
+
132
+ // ------ TYPES ------
133
+
134
+ /**
135
+ * A language tag that is available in the project.
136
+ *
137
+ * @example
138
+ * setLanguageTag(request.languageTag as AvailableLanguageTag)
139
+ *
140
+ * @typedef {typeof availableLanguageTags[number]} AvailableLanguageTag
141
+ */
@@ -1,37 +1,37 @@
1
- /* Light mode scrollbar styles */
2
- ::-webkit-scrollbar {
3
- width: 8px;
4
- height: 8px;
5
- }
6
-
7
- ::-webkit-scrollbar-track {
8
- background: transparent; /* Transparent track */
9
- }
10
-
11
- ::-webkit-scrollbar-thumb {
12
- background-color: rgba(0, 0, 0, 0.2); /* Light mode: dark thumb */
13
- border-radius: 10px;
14
- }
15
-
16
- ::-webkit-scrollbar-thumb:hover {
17
- background-color: rgba(0, 0, 0, 0.4); /* Darker thumb on hover */
18
- }
19
-
20
- /* Dark mode scrollbar styles */
21
- .dark ::-webkit-scrollbar-thumb {
22
- background-color: rgba(255, 255, 255, 0.2); /* Dark mode: light thumb */
23
- }
24
-
25
- .dark ::-webkit-scrollbar-thumb:hover {
26
- background-color: rgba(255, 255, 255, 0.4); /* Lighter thumb on hover */
27
- }
28
-
29
- /* Firefox scrollbar styling */
30
- * {
31
- scrollbar-width: thin;
32
- scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
33
- }
34
-
35
- html.dark, .dark * {
36
- scrollbar-color: rgba(255, 255, 255, 0.2) transparent;
37
- }
1
+ /* Light mode scrollbar styles */
2
+ ::-webkit-scrollbar {
3
+ width: 8px;
4
+ height: 8px;
5
+ }
6
+
7
+ ::-webkit-scrollbar-track {
8
+ background: transparent; /* Transparent track */
9
+ }
10
+
11
+ ::-webkit-scrollbar-thumb {
12
+ background-color: rgba(0, 0, 0, 0.2); /* Light mode: dark thumb */
13
+ border-radius: 10px;
14
+ }
15
+
16
+ ::-webkit-scrollbar-thumb:hover {
17
+ background-color: rgba(0, 0, 0, 0.4); /* Darker thumb on hover */
18
+ }
19
+
20
+ /* Dark mode scrollbar styles */
21
+ .dark ::-webkit-scrollbar-thumb {
22
+ background-color: rgba(255, 255, 255, 0.2); /* Dark mode: light thumb */
23
+ }
24
+
25
+ .dark ::-webkit-scrollbar-thumb:hover {
26
+ background-color: rgba(255, 255, 255, 0.4); /* Lighter thumb on hover */
27
+ }
28
+
29
+ /* Firefox scrollbar styling */
30
+ * {
31
+ scrollbar-width: thin;
32
+ scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
33
+ }
34
+
35
+ html.dark, .dark * {
36
+ scrollbar-color: rgba(255, 255, 255, 0.2) transparent;
37
+ }
package/package.json CHANGED
@@ -1,94 +1,95 @@
1
- {
2
- "name": "tera-system-ui",
3
- "version": "0.0.15",
4
- "scripts": {
5
- "dev": "vite dev",
6
- "build": "vite build && npm run package",
7
- "preview": "vite preview",
8
- "package": "svelte-kit sync && svelte-package && publint",
9
- "prepublishOnly": "npm run package",
10
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
11
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
12
- "storybook": "storybook dev -p 6006",
13
- "build-storybook": "storybook build",
14
- "lang-compile": "paraglide-js compile --project ./project.inlang --outdir ./src/lib/paraglide"
15
- },
16
- "bin": {
17
- "ui": "./scripts/add-component-template.js",
18
- "gen": "./scripts/generate-ts-index.js"
19
- },
20
- "files": [
21
- "dist",
22
- "!dist/**/*.test.*",
23
- "!dist/**/*.spec.*"
24
- ],
25
- "sideEffects": [
26
- "**/*.css"
27
- ],
28
- "svelte": "./dist/index.js",
29
- "types": "./dist/index.d.ts",
30
- "type": "module",
31
- "exports": {
32
- ".": {
33
- "types": "./dist/index.d.ts",
34
- "svelte": "./dist/index.js",
35
- "default": "./dist/index.js"
36
- },
37
- "./i18n": {
38
- "types": "./dist/i18n/index.d.ts",
39
- "svelte": "./dist/i18n/index.js",
40
- "default": "./dist/i18n/index.js"
41
- },
42
- "./icons": {
43
- "types": "./dist/components/icons/index.d.ts",
44
- "svelte": "./dist/components/icons/index.js",
45
- "default": "./dist/components/icons/index.js"
46
- },
47
- "./command": {
48
- "types": "./dist/components/command/index.d.ts",
49
- "svelte": "./dist/components/command/index.js",
50
- "default": "./dist/components/command/index.js"
51
- },
52
- "./themes/tw-preset": "./dist/themes/tw-preset.cjs",
53
- "./themes/tera-ui-base": "./dist/themes/tera-ui-base.css"
54
- },
55
- "peerDependencies": {
56
- "svelte": "^5.0.0"
57
- },
58
- "devDependencies": {
59
- "@chromatic-com/storybook": "^3.2.1",
60
- "@storybook/addon-essentials": "^8.3.6",
61
- "@storybook/addon-interactions": "^8.3.6",
62
- "@storybook/addon-links": "^8.3.6",
63
- "@storybook/addon-styling": "^1.3.7",
64
- "@storybook/addon-svelte-csf": "^5.0.0-next.8",
65
- "@storybook/addon-themes": "^8.3.6",
66
- "@storybook/addon-viewport": "^8.3.6",
67
- "@storybook/blocks": "^8.3.6",
68
- "@storybook/svelte": "^8.3.6",
69
- "@storybook/sveltekit": "^8.3.6",
70
- "@storybook/test": "^8.3.6",
71
- "@sveltejs/adapter-auto": "^3.3.1",
72
- "@sveltejs/kit": "^2.7.3",
73
- "@sveltejs/package": "^2.3.7",
74
- "@sveltejs/vite-plugin-svelte": "^4.0.0",
75
- "npx": "^10.2.2",
76
- "publint": "^0.2.12",
77
- "sass-embedded": "^1.80.5",
78
- "storybook": "^8.3.6",
79
- "svelte": "^5.1.6",
80
- "svelte-check": "^4.0.5",
81
- "tailwindcss": "^3.4.14",
82
- "typescript": "^5.6.3",
83
- "vite": "^5.4.10"
84
- },
85
- "dependencies": {
86
- "@floating-ui/dom": "^1.6.12",
87
- "@inlang/paraglide-sveltekit": "0.11.5",
88
- "@tabler/icons-svelte": "^3.21.0",
89
- "clsx": "^2.1.1",
90
- "autoprefixer": "^10.4.20",
91
- "@inlang/paraglide-js": "1.11.3",
92
- "tailwind-variants": "^0.2.1"
93
- }
94
- }
1
+ {
2
+ "name": "tera-system-ui",
3
+ "version": "0.0.17",
4
+ "scripts": {
5
+ "dev": "vite dev",
6
+ "build": "vite build && npm run package",
7
+ "preview": "vite preview",
8
+ "package": "svelte-kit sync && svelte-package && publint",
9
+ "customPrepublish": "node ./scripts/prepublish.js",
10
+ "prepublishOnly": "npm run customPrepublish && npm run package",
11
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
12
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
13
+ "storybook": "storybook dev -p 6006",
14
+ "build-storybook": "storybook build",
15
+ "lang-compile": "paraglide-js compile --project ./project.inlang --outdir ./src/lib/paraglide"
16
+ },
17
+ "bin": {
18
+ "ui": "./scripts/add-component-template.js",
19
+ "gen": "./scripts/generate-ts-index.js"
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "!dist/**/*.test.*",
24
+ "!dist/**/*.spec.*"
25
+ ],
26
+ "sideEffects": [
27
+ "**/*.css"
28
+ ],
29
+ "svelte": "./dist/index.js",
30
+ "types": "./dist/index.d.ts",
31
+ "type": "module",
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "svelte": "./dist/index.js",
36
+ "default": "./dist/index.js"
37
+ },
38
+ "./i18n": {
39
+ "types": "./dist/i18n/index.d.ts",
40
+ "svelte": "./dist/i18n/index.js",
41
+ "default": "./dist/i18n/index.js"
42
+ },
43
+ "./icons": {
44
+ "types": "./dist/components/icons/index.d.ts",
45
+ "svelte": "./dist/components/icons/index.js",
46
+ "default": "./dist/components/icons/index.js"
47
+ },
48
+ "./command": {
49
+ "types": "./dist/components/command/index.d.ts",
50
+ "svelte": "./dist/components/command/index.js",
51
+ "default": "./dist/components/command/index.js"
52
+ },
53
+ "./themes/tw-preset": "./dist/themes/tw-preset.cjs",
54
+ "./themes/tera-ui-base": "./dist/themes/tera-ui-base.css"
55
+ },
56
+ "peerDependencies": {
57
+ "svelte": "^5.0.0"
58
+ },
59
+ "devDependencies": {
60
+ "@chromatic-com/storybook": "^3.2.1",
61
+ "@storybook/addon-essentials": "^8.3.6",
62
+ "@storybook/addon-interactions": "^8.3.6",
63
+ "@storybook/addon-links": "^8.3.6",
64
+ "@storybook/addon-styling": "^1.3.7",
65
+ "@storybook/addon-svelte-csf": "^5.0.0-next.8",
66
+ "@storybook/addon-themes": "^8.3.6",
67
+ "@storybook/addon-viewport": "^8.3.6",
68
+ "@storybook/blocks": "^8.3.6",
69
+ "@storybook/svelte": "^8.3.6",
70
+ "@storybook/sveltekit": "^8.3.6",
71
+ "@storybook/test": "^8.3.6",
72
+ "@sveltejs/adapter-auto": "^3.3.1",
73
+ "@sveltejs/kit": "^2.7.3",
74
+ "@sveltejs/package": "^2.3.7",
75
+ "@sveltejs/vite-plugin-svelte": "^4.0.0",
76
+ "npx": "^10.2.2",
77
+ "publint": "^0.2.12",
78
+ "sass-embedded": "^1.80.5",
79
+ "storybook": "^8.3.6",
80
+ "svelte": "^5.1.6",
81
+ "svelte-check": "^4.0.5",
82
+ "tailwindcss": "^3.4.14",
83
+ "typescript": "^5.6.3",
84
+ "vite": "^5.4.10"
85
+ },
86
+ "dependencies": {
87
+ "@floating-ui/dom": "^1.6.12",
88
+ "@inlang/paraglide-sveltekit": "0.11.5",
89
+ "@tabler/icons-svelte": "^3.21.0",
90
+ "clsx": "^2.1.1",
91
+ "autoprefixer": "^10.4.20",
92
+ "@inlang/paraglide-js": "1.11.3",
93
+ "tailwind-variants": "^0.2.1"
94
+ }
95
+ }
@@ -1,121 +1,121 @@
1
1
  #!/usr/bin/env node
2
-
3
- import fs from "fs";
4
-
5
- import path from "path";
6
- // Get the component name from the command line arguments
7
- const componentName = process.argv[3];
8
- const command = process.argv[2];
9
-
10
- if (!componentName) {
11
- console.error("Please provide a component name: `npx tera-ui add component-name`");
12
- process.exit(1);
13
- }
14
-
15
- if (command !== 'add') {
16
- console.error(`Please provide a correct command: current command ${command}`);
17
- process.exit(1);
18
- }
19
-
20
-
21
- const PASCAL_CASE = 'PASCAL_CASE';
22
- const KEBAB_CASE = 'KEBAB_CASE';
23
-
24
-
25
- function convertCase(text, convertTo) {
26
- const isPascalCase = /^[A-Z][a-z0-9]+([A-Z][a-z0-9]*)*$/.test(text);
27
- const isKebabCase = /^[a-z]+(-[a-z0-9]+)*$/.test(text);
28
-
29
- if ((convertTo === PASCAL_CASE && isPascalCase) ||
30
- (convertTo === KEBAB_CASE && isKebabCase)) {
31
- return text;
32
- }
33
-
34
- if (convertTo === PASCAL_CASE) {
35
- return text
36
- .toLowerCase()
37
- .replace(/(?:^|[-_])(.)/g, (_, char) => char.toUpperCase());
38
- } else if (convertTo === KEBAB_CASE) {
39
- return text
40
- .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
41
- .toLowerCase();
42
- } else {
43
- throw new Error("Invalid 'convertTo' parameter. Use 'PASCAL_CASE' or 'KEBAB_CASE'.");
44
- }
45
- }
46
-
47
-
48
- function readFileContent(path) {
49
- try {
50
- const data = fs.readFileSync(path, 'utf8');
51
- return data;
52
- } catch (error) {
53
- console.error("Error reading file:", error.message);
54
- return null;
55
- }
56
- }
57
-
58
-
59
- const componentTemplateFolder = path.join(process.cwd(), 'scripts/file-template/component');
60
-
61
- function getComponentSvelte(componentName) {
62
- let template = readFileContent(componentTemplateFolder + '/Component.svelte')
63
- let componentNameCase = convertCase(componentName, PASCAL_CASE);
64
- return template.replaceAll('ComponentProps', componentNameCase + 'Props')
65
- .replaceAll('"./Component"', `"./${componentNameCase}"`);
66
- }
67
-
68
- function getComponentTS(componentName) {
69
- let template = readFileContent(componentTemplateFolder + '/Component.ts')
70
- let componentNameCase = convertCase(componentName, PASCAL_CASE);
71
- return template.replaceAll('Component', componentNameCase);
72
- }
73
-
74
- function getIndexTS(componentName) {
75
- let template = readFileContent(componentTemplateFolder + '/index.ts')
76
- let componentNameCase = convertCase(componentName, PASCAL_CASE);
77
- return template.replaceAll('Component', componentNameCase);
78
- }
79
-
80
-
81
- function getComponentStoriesSvelte(componentName) {
82
- let template = readFileContent(componentTemplateFolder + '/Component.stories.svelte')
83
- let componentNameCase = convertCase(componentName, PASCAL_CASE);
84
- return template.replaceAll('ComponentName', componentNameCase)
85
- .replaceAll('component-path', convertCase(componentName, KEBAB_CASE));
86
- }
87
-
88
-
89
- // Define the component folder and files
90
- const componentDir = path.join(process.cwd(), 'src', 'lib', 'components', convertCase(componentName, KEBAB_CASE));
91
- const componentStoriesDir = path.join(process.cwd(), 'src', 'stories', convertCase(componentName, KEBAB_CASE));
92
-
93
-
94
- const files = {
95
- [`${convertCase(componentName, PASCAL_CASE)}.svelte`]: getComponentSvelte(componentName),
96
- [`${convertCase(componentName, PASCAL_CASE)}.ts`]: getComponentTS(componentName),
97
- [`index.ts`]: getIndexTS(componentName),
98
- [`${convertCase(componentName, PASCAL_CASE)}.stories.svelte`]: getComponentStoriesSvelte(componentName),
99
- };
100
-
101
-
102
- // Create the folder and files with template content
103
- if (!fs.existsSync(componentDir)) {
104
- fs.mkdirSync(componentDir);
105
- }
106
-
107
- if (!fs.existsSync(componentStoriesDir)) {
108
- fs.mkdirSync(componentStoriesDir);
109
- }
110
-
111
-
112
- for (const [filename, content] of Object.entries(files)) {
113
- const filePath = filename.includes('.stories.')
114
- ? path.join(componentStoriesDir, filename)
115
- : path.join(componentDir, filename);
116
-
117
-
118
- fs.writeFileSync(filePath, content, 'utf8');
119
- }
120
-
121
- console.log(`Component ${componentName} created successfully with 3 template files!`);
2
+
3
+ import fs from "fs";
4
+
5
+ import path from "path";
6
+ // Get the component name from the command line arguments
7
+ const componentName = process.argv[3];
8
+ const command = process.argv[2];
9
+
10
+ if (!componentName) {
11
+ console.error("Please provide a component name: `npx tera-ui add component-name`");
12
+ process.exit(1);
13
+ }
14
+
15
+ if (command !== 'add') {
16
+ console.error(`Please provide a correct command: current command ${command}`);
17
+ process.exit(1);
18
+ }
19
+
20
+
21
+ const PASCAL_CASE = 'PASCAL_CASE';
22
+ const KEBAB_CASE = 'KEBAB_CASE';
23
+
24
+
25
+ function convertCase(text, convertTo) {
26
+ const isPascalCase = /^[A-Z][a-z0-9]+([A-Z][a-z0-9]*)*$/.test(text);
27
+ const isKebabCase = /^[a-z]+(-[a-z0-9]+)*$/.test(text);
28
+
29
+ if ((convertTo === PASCAL_CASE && isPascalCase) ||
30
+ (convertTo === KEBAB_CASE && isKebabCase)) {
31
+ return text;
32
+ }
33
+
34
+ if (convertTo === PASCAL_CASE) {
35
+ return text
36
+ .toLowerCase()
37
+ .replace(/(?:^|[-_])(.)/g, (_, char) => char.toUpperCase());
38
+ } else if (convertTo === KEBAB_CASE) {
39
+ return text
40
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
41
+ .toLowerCase();
42
+ } else {
43
+ throw new Error("Invalid 'convertTo' parameter. Use 'PASCAL_CASE' or 'KEBAB_CASE'.");
44
+ }
45
+ }
46
+
47
+
48
+ function readFileContent(path) {
49
+ try {
50
+ const data = fs.readFileSync(path, 'utf8');
51
+ return data;
52
+ } catch (error) {
53
+ console.error("Error reading file:", error.message);
54
+ return null;
55
+ }
56
+ }
57
+
58
+
59
+ const componentTemplateFolder = path.join(process.cwd(), 'scripts/file-template/component');
60
+
61
+ function getComponentSvelte(componentName) {
62
+ let template = readFileContent(componentTemplateFolder + '/Component.svelte')
63
+ let componentNameCase = convertCase(componentName, PASCAL_CASE);
64
+ return template.replaceAll('ComponentProps', componentNameCase + 'Props')
65
+ .replaceAll('"./Component"', `"./${componentNameCase}"`);
66
+ }
67
+
68
+ function getComponentTS(componentName) {
69
+ let template = readFileContent(componentTemplateFolder + '/Component.ts')
70
+ let componentNameCase = convertCase(componentName, PASCAL_CASE);
71
+ return template.replaceAll('Component', componentNameCase);
72
+ }
73
+
74
+ function getIndexTS(componentName) {
75
+ let template = readFileContent(componentTemplateFolder + '/index.ts')
76
+ let componentNameCase = convertCase(componentName, PASCAL_CASE);
77
+ return template.replaceAll('Component', componentNameCase);
78
+ }
79
+
80
+
81
+ function getComponentStoriesSvelte(componentName) {
82
+ let template = readFileContent(componentTemplateFolder + '/Component.stories.svelte')
83
+ let componentNameCase = convertCase(componentName, PASCAL_CASE);
84
+ return template.replaceAll('ComponentName', componentNameCase)
85
+ .replaceAll('component-path', convertCase(componentName, KEBAB_CASE));
86
+ }
87
+
88
+
89
+ // Define the component folder and files
90
+ const componentDir = path.join(process.cwd(), 'src', 'lib', 'components', convertCase(componentName, KEBAB_CASE));
91
+ const componentStoriesDir = path.join(process.cwd(), 'src', 'stories', convertCase(componentName, KEBAB_CASE));
92
+
93
+
94
+ const files = {
95
+ [`${convertCase(componentName, PASCAL_CASE)}.svelte`]: getComponentSvelte(componentName),
96
+ [`${convertCase(componentName, PASCAL_CASE)}.ts`]: getComponentTS(componentName),
97
+ [`index.ts`]: getIndexTS(componentName),
98
+ [`${convertCase(componentName, PASCAL_CASE)}.stories.svelte`]: getComponentStoriesSvelte(componentName),
99
+ };
100
+
101
+
102
+ // Create the folder and files with template content
103
+ if (!fs.existsSync(componentDir)) {
104
+ fs.mkdirSync(componentDir);
105
+ }
106
+
107
+ if (!fs.existsSync(componentStoriesDir)) {
108
+ fs.mkdirSync(componentStoriesDir);
109
+ }
110
+
111
+
112
+ for (const [filename, content] of Object.entries(files)) {
113
+ const filePath = filename.includes('.stories.')
114
+ ? path.join(componentStoriesDir, filename)
115
+ : path.join(componentDir, filename);
116
+
117
+
118
+ fs.writeFileSync(filePath, content, 'utf8');
119
+ }
120
+
121
+ console.log(`Component ${componentName} created successfully with 3 template files!`);