vueless 1.0.2-beta.51 → 1.0.2-beta.52

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vueless",
3
- "version": "1.0.2-beta.51",
3
+ "version": "1.0.2-beta.52",
4
4
  "license": "MIT",
5
5
  "description": "Vue Styleless UI Component Library, powered by Tailwind CSS.",
6
6
  "keywords": [
@@ -14,12 +14,12 @@ withDefaults(defineProps<Props>(), {
14
14
  ...getDefaults<Props, Config>(defaultConfig, COMPONENT_NAME),
15
15
  });
16
16
 
17
- const wrapperRef = useTemplateRef<HTMLDivElement>("wrapper");
17
+ const wrapperRef = useTemplateRef<HTMLElement>("wrapper");
18
18
 
19
19
  defineExpose({
20
20
  /**
21
21
  * A reference to the component's wrapper element for direct DOM manipulation.
22
- * @property {HTMLDivElement}
22
+ * @property {HTMLElement}
23
23
  */
24
24
  wrapperRef,
25
25
  });
@@ -33,8 +33,8 @@ const { getDataTest, wrapperAttrs } = useUI<Config>(defaultConfig);
33
33
  </script>
34
34
 
35
35
  <template>
36
- <div ref="wrapper" v-bind="wrapperAttrs" :data-test="getDataTest()">
36
+ <component :is="tag" ref="wrapper" v-bind="wrapperAttrs" :data-test="getDataTest()">
37
37
  <!-- @slot Use it to add something inside. -->
38
38
  <slot />
39
- </div>
39
+ </component>
40
40
  </template>
@@ -57,6 +57,7 @@ export default /*tw*/ {
57
57
  align: "start",
58
58
  content: "start",
59
59
  justify: "start",
60
+ tag: "div",
60
61
  wrap: false,
61
62
  reverse: false,
62
63
  block: false,
@@ -148,6 +148,21 @@ describe("UCol.vue", () => {
148
148
  expect(component.attributes("class")).toContain(expectedClasses);
149
149
  });
150
150
 
151
+ // Tag prop
152
+ it("renders the correct HTML tag", () => {
153
+ const tags = ["div", "section", "article", "main", "aside", "nav", "span"];
154
+
155
+ tags.forEach((tag) => {
156
+ const component = mount(UCol, {
157
+ props: {
158
+ tag,
159
+ },
160
+ });
161
+
162
+ expect(component.element.tagName.toLowerCase()).toBe(tag);
163
+ });
164
+ });
165
+
151
166
  // DataTest prop
152
167
  it("applies the correct data-test attribute", () => {
153
168
  const dataTest = "col-test";
@@ -49,6 +49,11 @@ export interface Props {
49
49
  */
50
50
  block?: boolean;
51
51
 
52
+ /**
53
+ * Allows changing HTML tag.
54
+ */
55
+ tag?: string;
56
+
52
57
  /**
53
58
  * Component config object.
54
59
  */
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { computed, useSlots, watch, useId, useTemplateRef, nextTick } from "vue";
2
+ import { computed, useSlots, watch, useId, useTemplateRef, nextTick, ref } from "vue";
3
3
 
4
4
  import useUI from "../composables/useUI.ts";
5
5
  import { getDefaults } from "../utils/ui.ts";
@@ -48,6 +48,8 @@ const slots = useSlots();
48
48
 
49
49
  const wrapperRef = useTemplateRef<HTMLDivElement>("wrapper");
50
50
 
51
+ const isWrapperTransitionComplete = ref(false);
52
+
51
53
  const isShownModal = computed({
52
54
  get: () => props.modelValue,
53
55
  set: (value) => emit("update:modelValue", value),
@@ -114,6 +116,8 @@ function onChangeShownModal(newValue: boolean) {
114
116
 
115
117
  if (newValue) {
116
118
  nextTick(() => wrapperRef.value?.focus());
119
+ } else {
120
+ isWrapperTransitionComplete.value = false;
117
121
  }
118
122
  }
119
123
 
@@ -173,6 +177,11 @@ defineExpose({
173
177
  * Get element / nested component attributes for each config token ✨
174
178
  * Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
175
179
  */
180
+ const mutatedProps = computed(() => ({
181
+ /* component state, not a props */
182
+ wrapperTransitionCompleted: isWrapperTransitionComplete.value,
183
+ }));
184
+
176
185
  const {
177
186
  getDataTest,
178
187
  config,
@@ -194,7 +203,7 @@ const {
194
203
  closeButtonAttrs,
195
204
  beforeTitleAttrs,
196
205
  titleFallbackAttrs,
197
- } = useUI<Config>(defaultConfig);
206
+ } = useUI<Config>(defaultConfig, mutatedProps);
198
207
  </script>
199
208
 
200
209
  <template>
@@ -202,7 +211,11 @@ const {
202
211
  <div v-if="isShownModal" v-bind="overlayAttrs" />
203
212
  </Transition>
204
213
 
205
- <Transition v-bind="config.wrapperTransition">
214
+ <Transition
215
+ v-bind="config.wrapperTransition"
216
+ @after-enter="isWrapperTransitionComplete = true"
217
+ @leave="isWrapperTransitionComplete = false"
218
+ >
206
219
  <div
207
220
  v-if="isShownModal"
208
221
  :id="elementId"
@@ -17,7 +17,15 @@ export default /*tw*/ {
17
17
  leaveFromClass: "opacity-100",
18
18
  leaveToClass: "opacity-0",
19
19
  },
20
- innerWrapper: "py-12 w-full h-full overflow-auto",
20
+ innerWrapper: {
21
+ base: "py-12 w-full h-screen scroll-container [scrollbar-gutter:stable]",
22
+ variants: {
23
+ wrapperTransitionCompleted: {
24
+ true: "overflow-y-auto",
25
+ false: "overflow-y-hidden",
26
+ },
27
+ },
28
+ },
21
29
  header: "flex justify-between px-4 md:px-6 py-6",
22
30
  beforeTitle: "flex items-center gap-3",
23
31
  titleFallback: "flex flex-col",
@@ -15,12 +15,12 @@ withDefaults(defineProps<Props>(), {
15
15
  ...getDefaults<Props, Config>(defaultConfig, COMPONENT_NAME),
16
16
  });
17
17
 
18
- const wrapperRef = useTemplateRef<HTMLDivElement>("wrapper");
18
+ const wrapperRef = useTemplateRef<HTMLElement>("wrapper");
19
19
 
20
20
  defineExpose({
21
21
  /**
22
22
  * A reference to the component's wrapper element for direct DOM manipulation.
23
- * @property {HTMLDivElement}
23
+ * @property {HTMLElement}
24
24
  */
25
25
  wrapperRef,
26
26
  });
@@ -33,8 +33,8 @@ const { getDataTest, wrapperAttrs } = useUI<Config>(defaultConfig);
33
33
  </script>
34
34
 
35
35
  <template>
36
- <div ref="wrapper" v-bind="wrapperAttrs" :data-test="getDataTest()">
36
+ <component :is="tag" ref="wrapper" v-bind="wrapperAttrs" :data-test="getDataTest()">
37
37
  <!-- @slot Use it to add something inside. -->
38
38
  <slot />
39
- </div>
39
+ </component>
40
40
  </template>
@@ -55,6 +55,7 @@ export default /*tw*/ {
55
55
  align: "start",
56
56
  content: "start",
57
57
  justify: "start",
58
+ tag: "div",
58
59
  wrap: false,
59
60
  block: false,
60
61
  reverse: false,
@@ -146,6 +146,21 @@ describe("URow.vue", () => {
146
146
  expect(component.attributes("class")).toContain(expectedClasses);
147
147
  });
148
148
 
149
+ // Tag prop
150
+ it("renders the correct HTML tag", () => {
151
+ const tags = ["div", "section", "article", "main", "aside", "nav", "span"];
152
+
153
+ tags.forEach((tag) => {
154
+ const component = mount(URow, {
155
+ props: {
156
+ tag,
157
+ },
158
+ });
159
+
160
+ expect(component.element.tagName.toLowerCase()).toBe(tag);
161
+ });
162
+ });
163
+
149
164
  // DataTest prop
150
165
  it("applies the correct data-test attribute", () => {
151
166
  const dataTest = "test-row";
@@ -49,6 +49,11 @@ export interface Props {
49
49
  */
50
50
  block?: boolean;
51
51
 
52
+ /**
53
+ * Allows changing HTML tag.
54
+ */
55
+ tag?: string;
56
+
52
57
  /**
53
58
  * Component config object.
54
59
  */