vueless 0.0.679 → 0.0.681
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/bin/commands/copy.js +94 -0
- package/bin/commands/create.js +7 -6
- package/bin/commands/index.js +2 -0
- package/bin/commands/init.js +2 -2
- package/bin/utils/dataUtils.js +35 -5
- package/bin/utils/formatUtil.js +10 -1
- package/package.json +1 -1
- package/ui.button-toggle/storybook/stories.ts +0 -1
- package/ui.dropdown-badge/UDropdownBadge.vue +3 -4
- package/ui.dropdown-badge/config.ts +10 -1
- package/ui.dropdown-button/UDropdownButton.vue +1 -2
- package/ui.dropdown-button/config.ts +5 -5
- package/ui.form-checkbox/storybook/stories.ts +0 -1
- package/ui.form-color-picker/UColorPicker.vue +5 -2
- package/ui.form-input/config.ts +7 -4
- package/ui.form-input/storybook/stories.ts +0 -1
- package/ui.form-input-money/storybook/stories.ts +0 -1
- package/ui.form-input-money/types.ts +1 -1
- package/ui.form-input-number/storybook/stories.ts +0 -1
- package/ui.form-label/config.ts +3 -3
- package/ui.form-select/storybook/stories.ts +0 -1
- package/ui.form-select/types.ts +1 -1
- package/ui.form-textarea/storybook/stories.ts +0 -1
- package/ui.other-theme-color-toggle/UThemeColorToggle.vue +11 -6
- package/ui.text-badge/UBadge.vue +6 -6
- package/utils/storybook.ts +30 -20
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { cwd } from "node:process";
|
|
6
|
+
import { cp, readFile, writeFile, rename } from "node:fs/promises";
|
|
7
|
+
import { styleText } from "node:util";
|
|
8
|
+
|
|
9
|
+
import { getDirFiles } from "../../utils/node/helper.js";
|
|
10
|
+
import { replaceRelativeImports } from "../utils/formatUtil.js";
|
|
11
|
+
import { getStorybookId, getStoryMetaKeyIndex } from "../utils/dataUtils.js";
|
|
12
|
+
|
|
13
|
+
import { SRC_COMPONENTS_PATH, COMPONENTS_PATH } from "../constants.js";
|
|
14
|
+
import { COMPONENTS, VUELESS_DIR, VUELESS_LOCAL_DIR } from "../../constants.js";
|
|
15
|
+
|
|
16
|
+
function getSourcePath(componentName) {
|
|
17
|
+
return path.join(cwd(), VUELESS_DIR, COMPONENTS[componentName]);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export async function copyVuelessComponent(options) {
|
|
21
|
+
const [componentName, newComponentName] = options;
|
|
22
|
+
|
|
23
|
+
if (!componentName) {
|
|
24
|
+
throw new Error("Component name is required.");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (!(componentName in COMPONENTS)) {
|
|
28
|
+
throw new Error("There is no such component.");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const sourceComponentPath = getSourcePath(componentName);
|
|
32
|
+
|
|
33
|
+
const isSrcDir = existsSync(path.join(cwd(), VUELESS_LOCAL_DIR));
|
|
34
|
+
const destPath = isSrcDir
|
|
35
|
+
? path.join(cwd(), SRC_COMPONENTS_PATH, newComponentName)
|
|
36
|
+
: path.join(cwd(), COMPONENTS_PATH, newComponentName);
|
|
37
|
+
|
|
38
|
+
const isComponentExists = newComponentName in COMPONENTS || existsSync(destPath);
|
|
39
|
+
|
|
40
|
+
if (isComponentExists) {
|
|
41
|
+
throw new Error(`Component with name ${newComponentName} alrady exists.`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
await cp(sourceComponentPath, destPath, { recursive: true });
|
|
45
|
+
await modifyCreatedComponent(destPath, componentName, newComponentName);
|
|
46
|
+
|
|
47
|
+
const successMessage = styleText(
|
|
48
|
+
"green",
|
|
49
|
+
`Success: ${componentName} was copied into ${destPath} directory.`,
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
console.log(successMessage);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function modifyCreatedComponent(destPath, componentName, newComponentName) {
|
|
56
|
+
const destFiles = await getDirFiles(destPath, "");
|
|
57
|
+
const storybookId = await getStorybookId();
|
|
58
|
+
|
|
59
|
+
for await (const filePath of destFiles) {
|
|
60
|
+
const fileContent = await readFile(filePath, "utf-8");
|
|
61
|
+
|
|
62
|
+
let updatedContent = replaceRelativeImports(newComponentName, filePath, fileContent);
|
|
63
|
+
let targetPath = filePath;
|
|
64
|
+
|
|
65
|
+
if (filePath.endsWith("constants.ts")) {
|
|
66
|
+
updatedContent = updatedContent.replace(componentName, newComponentName);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (filePath.endsWith("stories.ts")) {
|
|
70
|
+
const storyLines = updatedContent.split("\n");
|
|
71
|
+
|
|
72
|
+
const storyComponentImportIndex = storyLines.findIndex(
|
|
73
|
+
(line) => line.includes(componentName) && line.includes("import"),
|
|
74
|
+
);
|
|
75
|
+
const storyIdIndex = getStoryMetaKeyIndex(fileContent, "id");
|
|
76
|
+
const storyTitleIndex = getStoryMetaKeyIndex(fileContent, "title");
|
|
77
|
+
|
|
78
|
+
storyLines[storyIdIndex] = ` id: "${storybookId}",`;
|
|
79
|
+
storyLines[storyTitleIndex] = ` title: "Custom / ${newComponentName}",`;
|
|
80
|
+
storyLines[storyComponentImportIndex] =
|
|
81
|
+
`import ${newComponentName} from "../${newComponentName}.vue"`;
|
|
82
|
+
|
|
83
|
+
updatedContent = storyLines.join("\n").replaceAll(componentName, newComponentName);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (targetPath.endsWith(`${componentName}.vue`)) {
|
|
87
|
+
targetPath = targetPath.replace(componentName, newComponentName);
|
|
88
|
+
|
|
89
|
+
await rename(filePath, targetPath);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
await writeFile(targetPath, updatedContent);
|
|
93
|
+
}
|
|
94
|
+
}
|
package/bin/commands/create.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
|
+
|
|
2
3
|
import { existsSync } from "node:fs";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
import { cwd } from "node:process";
|
|
@@ -7,7 +8,7 @@ import { styleText } from "node:util";
|
|
|
7
8
|
|
|
8
9
|
import { getDirFiles } from "../../utils/node/helper.js";
|
|
9
10
|
import { replaceRelativeImports } from "../utils/formatUtil.js";
|
|
10
|
-
import {
|
|
11
|
+
import { getStorybookId } from "../utils/dataUtils.js";
|
|
11
12
|
|
|
12
13
|
import { SRC_COMPONENTS_PATH, COMPONENTS_PATH } from "../constants.js";
|
|
13
14
|
|
|
@@ -20,7 +21,7 @@ export async function createVuelessComponent(options) {
|
|
|
20
21
|
const [componentName] = options;
|
|
21
22
|
|
|
22
23
|
if (!componentName) {
|
|
23
|
-
throw new Error("Component name is required");
|
|
24
|
+
throw new Error("Component name is required.");
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
const isSrcDir = existsSync(path.join(cwd(), VUELESS_LOCAL_DIR));
|
|
@@ -31,7 +32,7 @@ export async function createVuelessComponent(options) {
|
|
|
31
32
|
const isComponentExists = componentName in COMPONENTS || existsSync(destPath);
|
|
32
33
|
|
|
33
34
|
if (isComponentExists) {
|
|
34
|
-
throw new Error(`Component with name ${componentName} alrady exists
|
|
35
|
+
throw new Error(`Component with name ${componentName} alrady exists.`);
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
await cp(boilerplatePath, destPath, { recursive: true });
|
|
@@ -40,7 +41,7 @@ export async function createVuelessComponent(options) {
|
|
|
40
41
|
|
|
41
42
|
const successMessage = styleText(
|
|
42
43
|
"green",
|
|
43
|
-
`Success: ${componentName} was created in ${destPath} directory
|
|
44
|
+
`Success: ${componentName} was created in ${destPath} directory.`,
|
|
44
45
|
);
|
|
45
46
|
|
|
46
47
|
console.log(successMessage);
|
|
@@ -48,7 +49,7 @@ export async function createVuelessComponent(options) {
|
|
|
48
49
|
|
|
49
50
|
async function modifyCreatedComponent(destPath, componentName) {
|
|
50
51
|
const destFiles = await getDirFiles(destPath, "");
|
|
51
|
-
const
|
|
52
|
+
const storybookId = await getStorybookId();
|
|
52
53
|
|
|
53
54
|
for await (const filePath of destFiles) {
|
|
54
55
|
const fileContent = await readFile(filePath, "utf-8");
|
|
@@ -63,7 +64,7 @@ async function modifyCreatedComponent(destPath, componentName) {
|
|
|
63
64
|
if (filePath.endsWith("stories.ts")) {
|
|
64
65
|
updatedContent = updatedContent
|
|
65
66
|
.replaceAll(boilerplateName, componentName)
|
|
66
|
-
.replace("{{component_id}}", String(
|
|
67
|
+
.replace("{{component_id}}", String(storybookId));
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
if (targetPath.endsWith(`${boilerplateName}.vue`)) {
|
package/bin/commands/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { vuelssInit } from "./init.js";
|
|
2
2
|
import { createVuelessComponent } from "./create.js";
|
|
3
|
+
import { copyVuelessComponent } from "./copy.js";
|
|
3
4
|
|
|
4
5
|
export const commands = {
|
|
5
6
|
init: vuelssInit,
|
|
6
7
|
create: createVuelessComponent,
|
|
8
|
+
copy: copyVuelessComponent,
|
|
7
9
|
};
|
package/bin/commands/init.js
CHANGED
|
@@ -16,7 +16,7 @@ export async function vuelssInit(options) {
|
|
|
16
16
|
const isValidOptions = options.every((option) => vuelessInitOptions.includes(option));
|
|
17
17
|
|
|
18
18
|
if (options.length && !isValidOptions) {
|
|
19
|
-
throw new Error("Ivalid options were provided");
|
|
19
|
+
throw new Error("Ivalid options were provided.");
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
const fileExt = options.includes("--ts") ? TYPESCRIPT_EXT : JAVASCRIPT_EXT;
|
|
@@ -28,7 +28,7 @@ export async function vuelssInit(options) {
|
|
|
28
28
|
|
|
29
29
|
const successMessage = styleText(
|
|
30
30
|
"green",
|
|
31
|
-
`Success: ${formattedDestPath.split(path.sep).at(-1)} was created in ${cwd()} directory
|
|
31
|
+
`Success: ${formattedDestPath.split(path.sep).at(-1)} was created in ${cwd()} directory.`,
|
|
32
32
|
);
|
|
33
33
|
|
|
34
34
|
console.log(successMessage);
|
package/bin/utils/dataUtils.js
CHANGED
|
@@ -10,7 +10,7 @@ import { VUELESS_DIR } from "../../constants.js";
|
|
|
10
10
|
|
|
11
11
|
const storiesName = "stories.ts";
|
|
12
12
|
|
|
13
|
-
export async function
|
|
13
|
+
export async function getStorybookId() {
|
|
14
14
|
const srcComponentsDir = path.join(cwd(), SRC_COMPONENTS_PATH);
|
|
15
15
|
const componentsDir = path.join(cwd(), COMPONENTS_PATH);
|
|
16
16
|
const vuelessPackagePath = path.join(cwd(), VUELESS_DIR);
|
|
@@ -36,9 +36,8 @@ export async function getLastStorybookId() {
|
|
|
36
36
|
for await (const storyPath of stories) {
|
|
37
37
|
const storyContent = await readFile(storyPath, "utf-8");
|
|
38
38
|
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
});
|
|
39
|
+
const storyIdLineIndex = getStoryMetaKeyIndex(storyContent, "id");
|
|
40
|
+
const storyIdLine = storyContent.split("\n").at(storyIdLineIndex);
|
|
42
41
|
|
|
43
42
|
if (!storyIdLine) continue;
|
|
44
43
|
|
|
@@ -49,5 +48,36 @@ export async function getLastStorybookId() {
|
|
|
49
48
|
}
|
|
50
49
|
}
|
|
51
50
|
|
|
52
|
-
return id;
|
|
51
|
+
return id + 10;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function getStoryMetaKeyIndex(fileContent, key) {
|
|
55
|
+
const lines = fileContent.split("\n");
|
|
56
|
+
let insideExportBlock = false;
|
|
57
|
+
let bracketDepth = 0;
|
|
58
|
+
|
|
59
|
+
for (let i = 0; i < lines.length; i++) {
|
|
60
|
+
const line = lines[i].trim();
|
|
61
|
+
|
|
62
|
+
if (line.startsWith("export default {")) {
|
|
63
|
+
insideExportBlock = true;
|
|
64
|
+
bracketDepth = 1;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (insideExportBlock) {
|
|
69
|
+
bracketDepth += (line.match(/{/g) || []).length;
|
|
70
|
+
bracketDepth -= (line.match(/}/g) || []).length;
|
|
71
|
+
|
|
72
|
+
if (bracketDepth === 1 && line.startsWith(`${key}:`)) {
|
|
73
|
+
return i;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (bracketDepth === 0) {
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return -1; // Return -1 if no top-level `id` is found
|
|
53
83
|
}
|
package/bin/utils/formatUtil.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
|
|
3
|
+
import { VUELESS_LIBRARY } from "../../constants.js";
|
|
4
|
+
|
|
3
5
|
export function replaceRelativeImports(componentName, filePath, fileContent) {
|
|
4
6
|
const isTopLevelFile = path.dirname(filePath).endsWith(componentName);
|
|
5
7
|
const contentLines = fileContent.split("\n");
|
|
@@ -9,6 +11,7 @@ export function replaceRelativeImports(componentName, filePath, fileContent) {
|
|
|
9
11
|
|
|
10
12
|
function replaceRelativeLineImports(line, isTopLevelFile) {
|
|
11
13
|
const importRegex = /import\s+(?:[\w\s{},*]+)\s+from\s+(['"])(\.\.?\/.*?)(\.[tj]s)?\1(?!\?)/g;
|
|
14
|
+
const multiLineImportRegExp = /from\s+(['"])(\.\.?\/.*?)(\.[tj]s)?\1(?!\?)/g; // Matches import's "from" part
|
|
12
15
|
|
|
13
16
|
const isTopLevelLocalImport = isTopLevelFile && !line.includes("../");
|
|
14
17
|
const isInnerLocalImport =
|
|
@@ -18,6 +21,12 @@ function replaceRelativeLineImports(line, isTopLevelFile) {
|
|
|
18
21
|
return line;
|
|
19
22
|
}
|
|
20
23
|
|
|
24
|
+
if (line.startsWith("}")) {
|
|
25
|
+
return line.replace(multiLineImportRegExp, (match, quote, oldPath, ext) => {
|
|
26
|
+
return match.replace(oldPath + (ext || ""), VUELESS_LIBRARY);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
21
30
|
return line.replace(importRegex, (match, quote, oldPath, ext) => {
|
|
22
31
|
const isDefaultImport = match.includes("{");
|
|
23
32
|
|
|
@@ -25,7 +34,7 @@ function replaceRelativeLineImports(line, isTopLevelFile) {
|
|
|
25
34
|
match = defaultToNamedImport(match);
|
|
26
35
|
}
|
|
27
36
|
|
|
28
|
-
return match.replace(oldPath + (ext || ""),
|
|
37
|
+
return match.replace(oldPath + (ext || ""), VUELESS_LIBRARY);
|
|
29
38
|
});
|
|
30
39
|
}
|
|
31
40
|
|
package/package.json
CHANGED
|
@@ -78,6 +78,7 @@ const { config, wrapperAttrs, dropdownBadgeAttrs, dropdownListAttrs, dropdownIco
|
|
|
78
78
|
:size="size"
|
|
79
79
|
:color="color"
|
|
80
80
|
:variant="variant"
|
|
81
|
+
:round="round"
|
|
81
82
|
v-bind="dropdownBadgeAttrs"
|
|
82
83
|
tabindex="0"
|
|
83
84
|
:data-test="dataTest"
|
|
@@ -102,17 +103,15 @@ const { config, wrapperAttrs, dropdownBadgeAttrs, dropdownListAttrs, dropdownIco
|
|
|
102
103
|
<slot :label="label" :opened="isShownOptions" />
|
|
103
104
|
</template>
|
|
104
105
|
|
|
105
|
-
<template #right
|
|
106
|
+
<template #right>
|
|
106
107
|
<!--
|
|
107
108
|
@slot Use it to add something after the label.
|
|
108
109
|
@binding {boolean} opened
|
|
109
110
|
-->
|
|
110
|
-
<slot name="right" :opened="isShownOptions">
|
|
111
|
+
<slot v-if="!noIcon" name="right" :opened="isShownOptions">
|
|
111
112
|
<UIcon
|
|
112
|
-
v-if="!noIcon"
|
|
113
113
|
internal
|
|
114
114
|
color="inherit"
|
|
115
|
-
:size="iconSize"
|
|
116
115
|
:name="config.defaults.dropdownIcon"
|
|
117
116
|
v-bind="dropdownIconAttrs"
|
|
118
117
|
:data-test="`${dataTest}-dropdown`"
|
|
@@ -9,7 +9,16 @@ export default /*tw*/ {
|
|
|
9
9
|
},
|
|
10
10
|
compoundVariants: [{ opened: true, color: ["grayscale", "white"], class: "ring-gray-700/15" }],
|
|
11
11
|
},
|
|
12
|
-
dropdownIcon:
|
|
12
|
+
dropdownIcon: {
|
|
13
|
+
base: "{UIcon} transition duration-300 group-[]:rotate-180",
|
|
14
|
+
defaults: {
|
|
15
|
+
size: {
|
|
16
|
+
sm: "2xs",
|
|
17
|
+
md: "xs",
|
|
18
|
+
lg: "xs",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
},
|
|
13
22
|
dropdownList: {
|
|
14
23
|
base: "{UDropdownList} w-fit",
|
|
15
24
|
variants: {
|
|
@@ -110,9 +110,8 @@ const { config, dropdownButtonAttrs, dropdownListAttrs, dropdownIconAttrs, wrapp
|
|
|
110
110
|
@slot Use it to add something after the label.
|
|
111
111
|
@binding {boolean} opened
|
|
112
112
|
-->
|
|
113
|
-
<slot name="toggle" :opened="isShownOptions">
|
|
113
|
+
<slot v-if="!noIcon" name="toggle" :opened="isShownOptions">
|
|
114
114
|
<UIcon
|
|
115
|
-
v-if="!noIcon"
|
|
116
115
|
internal
|
|
117
116
|
color="inherit"
|
|
118
117
|
:name="config.defaults.dropdownIcon"
|
|
@@ -13,12 +13,12 @@ export default /*tw*/ {
|
|
|
13
13
|
base: "{UIcon} transition duration-300 group-[]:rotate-180",
|
|
14
14
|
defaults: {
|
|
15
15
|
size: {
|
|
16
|
-
"2xs": "
|
|
17
|
-
xs: "
|
|
16
|
+
"2xs": "2xs",
|
|
17
|
+
xs: "xs",
|
|
18
18
|
sm: "sm",
|
|
19
|
-
md: "
|
|
20
|
-
lg: "
|
|
21
|
-
xl: "
|
|
19
|
+
md: "sm",
|
|
20
|
+
lg: "sm",
|
|
21
|
+
xl: "sm",
|
|
22
22
|
},
|
|
23
23
|
},
|
|
24
24
|
},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { computed, useId } from "vue";
|
|
2
|
+
import { ref, computed, useId } from "vue";
|
|
3
3
|
|
|
4
4
|
import { vTooltip } from "../directives";
|
|
5
5
|
import useUI from "../composables/useUI.ts";
|
|
@@ -31,13 +31,16 @@ const emit = defineEmits([
|
|
|
31
31
|
|
|
32
32
|
const elementId = props.id || useId();
|
|
33
33
|
|
|
34
|
+
const localValue = ref("");
|
|
35
|
+
|
|
34
36
|
const selectedItem = computed({
|
|
35
|
-
get: () => props.modelValue,
|
|
37
|
+
get: () => props.modelValue || localValue.value,
|
|
36
38
|
set: (value) => emit("update:modelValue", value),
|
|
37
39
|
});
|
|
38
40
|
|
|
39
41
|
function onClickColor(color: string) {
|
|
40
42
|
selectedItem.value = color;
|
|
43
|
+
localValue.value = color;
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
/**
|
package/ui.form-input/config.ts
CHANGED
|
@@ -2,11 +2,14 @@ export default /*tw*/ {
|
|
|
2
2
|
inputLabel: "{ULabel}",
|
|
3
3
|
wrapper: {
|
|
4
4
|
base: `
|
|
5
|
-
w-full bg-white relative flex border border-gray-300 rounded-dynamic transition
|
|
5
|
+
w-full bg-white relative flex border border-gray-300 rounded-dynamic-sm transition
|
|
6
6
|
hover:border-gray-400 hover:focus-within:border-brand-500 focus-within:border-brand-500
|
|
7
7
|
focus-within:ring-dynamic focus-within:ring-offset-dynamic focus-within:ring-brand-700/15
|
|
8
8
|
`,
|
|
9
9
|
variants: {
|
|
10
|
+
labelAlign: {
|
|
11
|
+
topInside: "rounded-dynamic",
|
|
12
|
+
},
|
|
10
13
|
error: {
|
|
11
14
|
true: `
|
|
12
15
|
border-red-300 bg-red-50
|
|
@@ -53,9 +56,9 @@ export default /*tw*/ {
|
|
|
53
56
|
},
|
|
54
57
|
error: {
|
|
55
58
|
true: `
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
bg-red-50 placeholder:text-red-300 hover:border-red-400 focus:border-red-500 focus:ring-red-700/15
|
|
60
|
+
focus-within:border-red-500 focus-within:ring-red-700/15
|
|
61
|
+
`,
|
|
59
62
|
},
|
|
60
63
|
typePassword: {
|
|
61
64
|
true: "tracking-widest !leading-[1.18] [font-family:text-security-disc,serif] [-webkit-text-security:disc]",
|
package/ui.form-label/config.ts
CHANGED
|
@@ -3,9 +3,9 @@ export default /*tw*/ {
|
|
|
3
3
|
base: "flex w-full",
|
|
4
4
|
variants: {
|
|
5
5
|
align: {
|
|
6
|
-
top: "flex-col gap-2",
|
|
7
6
|
topInside: "flex-col gap-0 relative",
|
|
8
|
-
topWithDesc: "flex-col-reverse
|
|
7
|
+
topWithDesc: "flex-col-reverse gap-2",
|
|
8
|
+
top: "flex-col gap-2",
|
|
9
9
|
right: "flex-row w-fit",
|
|
10
10
|
left: "flex-row-reverse w-fit",
|
|
11
11
|
},
|
|
@@ -68,7 +68,7 @@ export default /*tw*/ {
|
|
|
68
68
|
lg: "text-sm",
|
|
69
69
|
},
|
|
70
70
|
align: {
|
|
71
|
-
top: "
|
|
71
|
+
top: "",
|
|
72
72
|
topInside: "pl-3 mt-1.5",
|
|
73
73
|
topWithDesc: "pt-0.5",
|
|
74
74
|
left: "pt-0.5",
|
package/ui.form-select/types.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { computed, useId } from "vue";
|
|
2
|
+
import { ref, computed, useId } from "vue";
|
|
3
3
|
|
|
4
4
|
import useUI from "../composables/useUI.ts";
|
|
5
5
|
import { getDefaults } from "../utils/ui.ts";
|
|
@@ -42,8 +42,11 @@ const emit = defineEmits([
|
|
|
42
42
|
|
|
43
43
|
const elementId = props.id || useId();
|
|
44
44
|
|
|
45
|
+
const localBrand = ref("");
|
|
46
|
+
const localGray = ref("");
|
|
47
|
+
|
|
45
48
|
const selectedBrandColor = computed({
|
|
46
|
-
get: () => props.brand || getSelectedBrandColor(),
|
|
49
|
+
get: () => props.brand || localBrand.value || getSelectedBrandColor(),
|
|
47
50
|
set: (brand: string) => {
|
|
48
51
|
const prevBrand = getSelectedBrandColor();
|
|
49
52
|
const isBrandGrayscale = brand === GRAYSCALE_COLOR;
|
|
@@ -55,14 +58,16 @@ const selectedBrandColor = computed({
|
|
|
55
58
|
|
|
56
59
|
setTheme({ brand });
|
|
57
60
|
emit("update:brand", brand);
|
|
61
|
+
localBrand.value = brand;
|
|
58
62
|
},
|
|
59
63
|
});
|
|
60
64
|
|
|
61
65
|
const selectedGrayColor = computed({
|
|
62
|
-
get: () => props.gray || getSelectedGrayColor(),
|
|
63
|
-
set: (
|
|
64
|
-
setTheme({ gray
|
|
65
|
-
emit("update:gray",
|
|
66
|
+
get: () => props.gray || localGray.value || getSelectedGrayColor(),
|
|
67
|
+
set: (gray: string) => {
|
|
68
|
+
setTheme({ gray });
|
|
69
|
+
emit("update:gray", gray);
|
|
70
|
+
localGray.value = gray;
|
|
66
71
|
},
|
|
67
72
|
});
|
|
68
73
|
|
package/ui.text-badge/UBadge.vue
CHANGED
|
@@ -98,9 +98,9 @@ const { badgeAttrs, bodyAttrs, leftIconAttrs, centerIconAttrs, rightIconAttrs }
|
|
|
98
98
|
>
|
|
99
99
|
<div v-bind="bodyAttrs">
|
|
100
100
|
<!--
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
@slot Use it to add icon before the text.
|
|
102
|
+
@binding {string} icon-name
|
|
103
|
+
-->
|
|
104
104
|
<slot name="left" :icon-name="leftIcon">
|
|
105
105
|
<UIcon v-if="leftIcon" internal :name="leftIcon" color="inherit" v-bind="leftIconAttrs" />
|
|
106
106
|
</slot>
|
|
@@ -118,9 +118,9 @@ const { badgeAttrs, bodyAttrs, leftIconAttrs, centerIconAttrs, rightIconAttrs }
|
|
|
118
118
|
</slot>
|
|
119
119
|
|
|
120
120
|
<!--
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
@slot Use it to add icon after the text.
|
|
122
|
+
@binding {string} icon-name
|
|
123
|
+
-->
|
|
124
124
|
<slot name="right" :icon-name="rightIcon">
|
|
125
125
|
<UIcon
|
|
126
126
|
v-if="rightIcon"
|
package/utils/storybook.ts
CHANGED
|
@@ -100,37 +100,36 @@ export function getArgTypes(componentName: string | undefined) {
|
|
|
100
100
|
const type = attribute.value.type;
|
|
101
101
|
|
|
102
102
|
if (attribute.enum) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
table: {
|
|
107
|
-
defaultValue: { summary: attribute.default || "" },
|
|
108
|
-
type: { summary: attribute.enum.join(" | ") },
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
}
|
|
103
|
+
attribute.enum = attribute.enum.map((item) => {
|
|
104
|
+
if (item === "UnknownObject") return "Object";
|
|
105
|
+
if (item === "UnknownArray") return "Array";
|
|
112
106
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
control: "object",
|
|
116
|
-
table: {
|
|
117
|
-
defaultValue: { summary: attribute.default || "" },
|
|
118
|
-
type: { summary: attribute.enum.join(" | ") },
|
|
119
|
-
},
|
|
120
|
-
};
|
|
107
|
+
return item;
|
|
108
|
+
});
|
|
121
109
|
}
|
|
122
110
|
|
|
123
111
|
const nonUnionTypes = [
|
|
112
|
+
"null",
|
|
124
113
|
"string",
|
|
125
114
|
"number",
|
|
126
115
|
"boolean",
|
|
127
116
|
"Date",
|
|
128
|
-
"UnknownObject",
|
|
129
|
-
"UnknownArray",
|
|
130
117
|
"Array",
|
|
118
|
+
"Object",
|
|
119
|
+
"UnknownArray",
|
|
120
|
+
"UnknownObject",
|
|
131
121
|
];
|
|
132
122
|
|
|
133
|
-
if (attribute.enum?.
|
|
123
|
+
if (attribute.enum?.some((value) => !nonUnionTypes.includes(value))) {
|
|
124
|
+
types[attribute.name] = {
|
|
125
|
+
options: attribute.enum,
|
|
126
|
+
control: "select",
|
|
127
|
+
table: {
|
|
128
|
+
defaultValue: { summary: attribute.default || "" },
|
|
129
|
+
type: { summary: attribute.enum.join(" | ") },
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
} else if (attribute.enum?.some((value) => nonUnionTypes.includes(value))) {
|
|
134
133
|
let control = attribute.enum[0];
|
|
135
134
|
|
|
136
135
|
if (control === "string") {
|
|
@@ -145,6 +144,17 @@ export function getArgTypes(componentName: string | undefined) {
|
|
|
145
144
|
control: control as ArgType["control"],
|
|
146
145
|
table: {
|
|
147
146
|
defaultValue: { summary: attribute.default || "" },
|
|
147
|
+
type: { summary: attribute.enum.join(" | ") },
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (attribute.enum?.length === 1) {
|
|
153
|
+
types[attribute.name] = {
|
|
154
|
+
control: "object",
|
|
155
|
+
table: {
|
|
156
|
+
defaultValue: { summary: attribute.default || "" },
|
|
157
|
+
type: { summary: attribute.enum.join(" | ") },
|
|
148
158
|
},
|
|
149
159
|
};
|
|
150
160
|
}
|