@witchcraft/ui 0.2.1-beta.2 → 0.2.1
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/dist/module.json +1 -1
- package/dist/module.mjs +4 -5
- package/dist/runtime/build/WitchcraftUiResolver.d.ts +2 -2
- package/dist/runtime/build/generateTheme.js +2 -2
- package/dist/runtime/components/Aria/Aria.vue +4 -2
- package/dist/runtime/components/Aria/Aria.vue.d.ts +1 -1
- package/dist/runtime/components/Icon/Icon.vue +3 -3
- package/dist/runtime/components/Icon/Icon.vue.d.ts +1 -1
- package/dist/runtime/components/LibButton/LibButton.vue +9 -4
- package/dist/runtime/components/LibButton/LibButton.vue.d.ts +1 -1
- package/dist/runtime/components/LibCheckbox/LibCheckbox.vue +3 -4
- package/dist/runtime/components/LibCheckbox/LibCheckbox.vue.d.ts +1 -1
- package/dist/runtime/components/LibColorInput/LibColorInput.vue +15 -8
- package/dist/runtime/components/LibColorInput/LibColorInput.vue.d.ts +1 -1
- package/dist/runtime/components/LibColorPicker/LibColorPicker.vue +10 -6
- package/dist/runtime/components/LibColorPicker/LibColorPicker.vue.d.ts +1 -1
- package/dist/runtime/components/LibColorPicker/utils/truncate.js +1 -1
- package/dist/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.vue +5 -2
- package/dist/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.vue.d.ts +1 -1
- package/dist/runtime/components/LibDatePicker/LibDatePicker.vue.d.ts +1 -1
- package/dist/runtime/components/LibDatePicker/LibRangeDatePicker.vue +8 -6
- package/dist/runtime/components/LibDatePicker/LibRangeDatePicker.vue.d.ts +1 -1
- package/dist/runtime/components/LibDatePicker/LibSingleDatePicker.vue +7 -5
- package/dist/runtime/components/LibDatePicker/LibSingleDatePicker.vue.d.ts +1 -1
- package/dist/runtime/components/LibDatePicker/LibTimeZonePicker.vue.d.ts +1 -1
- package/dist/runtime/components/LibDebug/LibDebug.vue +9 -4
- package/dist/runtime/components/LibDebug/LibDebug.vue.d.ts +1 -1
- package/dist/runtime/components/LibDevOnly/LibDevOnly.vue +2 -1
- package/dist/runtime/components/LibDevOnly/LibDevOnly.vue.d.ts +4 -1
- package/dist/runtime/components/LibFileInput/LibFileInput.vue +29 -13
- package/dist/runtime/components/LibFileInput/LibFileInput.vue.d.ts +2 -2
- package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.vue +42 -12
- package/dist/runtime/components/LibLabel/LibLabel.vue +2 -2
- package/dist/runtime/components/LibLabel/LibLabel.vue.d.ts +3 -3
- package/dist/runtime/components/LibMultiValues/LibMultiValues.vue +1 -2
- package/dist/runtime/components/LibMultiValues/LibMultiValues.vue.d.ts +2 -2
- package/dist/runtime/components/LibNotifications/LibNotification.vue +19 -8
- package/dist/runtime/components/LibNotifications/LibNotifications.vue +10 -6
- package/dist/runtime/components/LibNotifications/LibNotifications.vue.d.ts +2 -2
- package/dist/runtime/components/LibPagination/LibPagination.vue +25 -12
- package/dist/runtime/components/LibPagination/LibPagination.vue.d.ts +2 -2
- package/dist/runtime/components/LibPalette/LibPalette.vue +6 -5
- package/dist/runtime/components/LibPalette/LibPalette.vue.d.ts +5 -5
- package/dist/runtime/components/LibPopup/LibPopup.vue +6 -4
- package/dist/runtime/components/LibPopup/LibPopup.vue.d.ts +3 -3
- package/dist/runtime/components/LibProgressBar/LibProgressBar.vue +5 -3
- package/dist/runtime/components/LibProgressBar/LibProgressBar.vue.d.ts +9 -9
- package/dist/runtime/components/LibRecorder/LibRecorder.vue +1 -1
- package/dist/runtime/components/LibRecorder/LibRecorder.vue.d.ts +2 -2
- package/dist/runtime/components/LibRoot/LibRoot.vue +11 -6
- package/dist/runtime/components/LibRoot/LibRoot.vue.d.ts +1 -1
- package/dist/runtime/components/LibSimpleInput/LibSimpleInput.vue +1 -1
- package/dist/runtime/components/LibSimpleInput/LibSimpleInput.vue.d.ts +1 -1
- package/dist/runtime/components/LibSuggestions/LibSuggestions.vue +5 -3
- package/dist/runtime/components/LibSuggestions/LibSuggestions.vue.d.ts +1 -1
- package/dist/runtime/components/LibTable/LibTable.vue +23 -8
- package/dist/runtime/components/LibTable/LibTable.vue.d.ts +1 -1
- package/dist/runtime/components/Template/NAME.vue +2 -3
- package/dist/runtime/components/Template/NAME.vue.d.ts +1 -1
- package/dist/runtime/components/TestControls/TestControls.vue +4 -2
- package/dist/runtime/components/TestControls/TestControls.vue.d.ts +1 -1
- package/dist/runtime/composables/useDragWithThreshold.d.ts +1 -1
- package/dist/runtime/composables/useInjectedI18n.d.ts +1 -1
- package/dist/runtime/composables/useScrollNearContainerEdges.d.ts +1 -1
- package/dist/runtime/composables/useSetupI18n.d.ts +1 -1
- package/dist/runtime/composables/useSuggestions.d.ts +2 -2
- package/dist/runtime/helpers/NotificationHandler.d.ts +1 -1
- package/dist/runtime/helpers/base64ToImg.js +2 -2
- package/dist/runtime/tailwind/themeConvertionOpts.d.ts +1 -1
- package/dist/runtime/types/index.d.ts +1 -1
- package/dist/runtime/utils/notifyIfError.d.ts +1 -1
- package/package.json +4 -6
- package/src/module.ts +28 -32
- package/src/runtime/build/WitchcraftUiResolver.ts +3 -3
- package/src/runtime/build/generateTheme.ts +3 -2
- package/src/runtime/build/unpluginIconViteOptions.ts +1 -1
- package/src/runtime/components/Aria/Aria.vue +5 -6
- package/src/runtime/components/Focus.stories.ts +11 -12
- package/src/runtime/components/Icon/Icon.vue +5 -9
- package/src/runtime/components/LibButton/LibButton.stories.ts +21 -22
- package/src/runtime/components/LibButton/LibButton.vue +23 -21
- package/src/runtime/components/LibCheckbox/LibCheckbox.stories.ts +6 -10
- package/src/runtime/components/LibCheckbox/LibCheckbox.vue +17 -19
- package/src/runtime/components/LibColorInput/LibColorInput.stories.ts +8 -13
- package/src/runtime/components/LibColorInput/LibColorInput.vue +49 -45
- package/src/runtime/components/LibColorPicker/LibColorPicker.stories.ts +14 -18
- package/src/runtime/components/LibColorPicker/LibColorPicker.vue +50 -52
- package/src/runtime/components/LibColorPicker/utils/safeConvertToHsva.ts +1 -2
- package/src/runtime/components/LibColorPicker/utils/safeConvertToRgba.ts +1 -2
- package/src/runtime/components/LibColorPicker/utils/truncate.ts +1 -2
- package/src/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.stories.ts +5 -8
- package/src/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.vue +11 -9
- package/src/runtime/components/LibDatePicker/LibDatePicker.stories.ts +14 -15
- package/src/runtime/components/LibDatePicker/LibDatePicker.vue +1 -2
- package/src/runtime/components/LibDatePicker/LibRangeDatePicker.vue +13 -13
- package/src/runtime/components/LibDatePicker/LibSingleDatePicker.vue +9 -8
- package/src/runtime/components/LibDatePicker/LibTimeZonePicker.vue +2 -1
- package/src/runtime/components/LibDatePicker/helpers.ts +0 -2
- package/src/runtime/components/LibDebug/LibDebug.stories.ts +11 -15
- package/src/runtime/components/LibDebug/LibDebug.vue +14 -11
- package/src/runtime/components/LibDevOnly/LibDevOnly.vue +8 -4
- package/src/runtime/components/LibFileInput/LibFileInput.stories.ts +12 -15
- package/src/runtime/components/LibFileInput/LibFileInput.vue +65 -47
- package/src/runtime/components/LibInputDeprecated/LibInputDeprecated.stories.ts +59 -67
- package/src/runtime/components/LibInputDeprecated/LibInputDeprecated.vue +73 -48
- package/src/runtime/components/LibLabel/LibLabel.stories.ts +4 -8
- package/src/runtime/components/LibLabel/LibLabel.vue +8 -8
- package/src/runtime/components/LibMultiValues/LibMultiValues.stories.ts +10 -15
- package/src/runtime/components/LibMultiValues/LibMultiValues.vue +14 -18
- package/src/runtime/components/LibNotifications/LibNotification.stories.ts +30 -34
- package/src/runtime/components/LibNotifications/LibNotification.vue +27 -17
- package/src/runtime/components/LibNotifications/LibNotifications.stories.ts +11 -15
- package/src/runtime/components/LibNotifications/LibNotifications.vue +21 -16
- package/src/runtime/components/LibPagination/LibPagination.stories.ts +5 -9
- package/src/runtime/components/LibPagination/LibPagination.vue +46 -32
- package/src/runtime/components/LibPalette/LibPalette.stories.ts +3 -7
- package/src/runtime/components/LibPalette/LibPalette.vue +13 -12
- package/src/runtime/components/LibPopup/LibPopup.stories.ts +19 -23
- package/src/runtime/components/LibPopup/LibPopup.vue +31 -35
- package/src/runtime/components/LibProgressBar/LibProgressBar.stories.ts +13 -17
- package/src/runtime/components/LibProgressBar/LibProgressBar.vue +36 -33
- package/src/runtime/components/LibRecorder/LibRecorder.stories.ts +11 -12
- package/src/runtime/components/LibRecorder/LibRecorder.vue +34 -34
- package/src/runtime/components/LibRoot/LibRoot.vue +16 -12
- package/src/runtime/components/LibSimpleInput/LibSimpleInput.stories.ts +20 -24
- package/src/runtime/components/LibSimpleInput/LibSimpleInput.vue +17 -21
- package/src/runtime/components/LibSuggestions/LibSuggestions.stories.ts +16 -19
- package/src/runtime/components/LibSuggestions/LibSuggestions.vue +27 -30
- package/src/runtime/components/LibTable/LibTable.stories.ts +30 -33
- package/src/runtime/components/LibTable/LibTable.vue +38 -24
- package/src/runtime/components/Reset.stories.ts +3 -6
- package/src/runtime/components/Scrolling.stories.ts +5 -8
- package/src/runtime/components/Template/NAME.vue +11 -11
- package/src/runtime/components/Template/TemplateStory.ts +9 -10
- package/src/runtime/components/TestControls/TestControls.vue +5 -5
- package/src/runtime/components/shared/props.ts +4 -6
- package/src/runtime/components/shared/storyHelpers/playInput.ts +2 -3
- package/src/runtime/components/shared/storyHelpers/playSuggestions.ts +5 -9
- package/src/runtime/composables/useAccesibilityOutline.ts +1 -1
- package/src/runtime/composables/useAriaLabel.ts +1 -1
- package/src/runtime/composables/useDarkMode.ts +15 -19
- package/src/runtime/composables/useDragWithThreshold.ts +6 -8
- package/src/runtime/composables/useGlobalResizeObserver.ts +0 -1
- package/src/runtime/composables/useInjectedDarkMode.ts +2 -2
- package/src/runtime/composables/useInjectedI18n.ts +1 -1
- package/src/runtime/composables/useInjectedLocale.ts +3 -4
- package/src/runtime/composables/useScrollNearContainerEdges.stories.ts +4 -4
- package/src/runtime/composables/useScrollNearContainerEdges.ts +12 -13
- package/src/runtime/composables/useSetupI18n.ts +4 -7
- package/src/runtime/composables/useSetupLocale.ts +3 -5
- package/src/runtime/composables/useSuggestions.ts +25 -30
- package/src/runtime/directives/vDetectFlex.ts +5 -8
- package/src/runtime/directives/vExtractRootEl.ts +1 -1
- package/src/runtime/directives/vResizableCols.ts +3 -7
- package/src/runtime/directives/vResizeObserver.ts +1 -2
- package/src/runtime/globalResizeObserver.ts +0 -1
- package/src/runtime/helpers/NotificationHandler.ts +8 -12
- package/src/runtime/helpers/base64ToImg.ts +2 -3
- package/src/runtime/helpers/createNoonUtcDate.ts +0 -1
- package/src/runtime/helpers/defaultTranslationFunction.ts +0 -1
- package/src/runtime/helpers/getTimeZoneList.ts +0 -1
- package/src/runtime/helpers/readFile.ts +2 -2
- package/src/runtime/helpers/resizeObserverWrapper.ts +0 -1
- package/src/runtime/helpers/storybook.ts +2 -3
- package/src/runtime/main.lib.ts +0 -2
- package/src/runtime/nuxt/plugins/vue-plugin.ts +4 -5
- package/src/runtime/tailwind/themeConvertionOpts.ts +3 -4
- package/src/runtime/theme.ts +0 -1
- package/src/runtime/types/index.ts +3 -4
- package/src/runtime/utils/notifyIfError.ts +2 -2
- package/src/runtime/utils/twMerge.ts +2 -2
- package/src/runtime/vue/VueComponentsPlugin.ts +1 -2
- package/src/runtime/vue/registerComponents.ts +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div
|
|
2
|
+
<div
|
|
3
|
+
:class="twMerge(`notification
|
|
3
4
|
max-w-700px
|
|
4
5
|
bg-neutral-50
|
|
5
6
|
dark:bg-neutral-900
|
|
@@ -13,14 +14,15 @@
|
|
|
13
14
|
gap-2
|
|
14
15
|
p-2 m-2
|
|
15
16
|
`,
|
|
16
|
-
|
|
17
|
+
($attrs as any).class)"
|
|
17
18
|
v-bind="{ ...$attrs, class: undefined }"
|
|
18
19
|
tabindex="0"
|
|
19
20
|
ref="notificationEl"
|
|
20
21
|
@keydown.enter.self="NotificationHandler.resolveToDefault(notification)"
|
|
21
22
|
>
|
|
22
23
|
<div class="notification--header flex-reverse flex justify-between">
|
|
23
|
-
<div
|
|
24
|
+
<div
|
|
25
|
+
v-if="notification.title"
|
|
24
26
|
tabindex="0"
|
|
25
27
|
class="title
|
|
26
28
|
focus-outline flex
|
|
@@ -32,7 +34,8 @@
|
|
|
32
34
|
</div>
|
|
33
35
|
<div class="notification--spacer flex-1"/>
|
|
34
36
|
<div class="actions flex">
|
|
35
|
-
<LibButton
|
|
37
|
+
<LibButton
|
|
38
|
+
:border="false"
|
|
36
39
|
class="notification--copy-button text-neutral-700"
|
|
37
40
|
@click="copy(handler ? handler.stringify(notification) : JSON.stringify(notification))"
|
|
38
41
|
>
|
|
@@ -48,21 +51,29 @@
|
|
|
48
51
|
</lib-button>
|
|
49
52
|
</div>
|
|
50
53
|
</div>
|
|
51
|
-
<div
|
|
54
|
+
<div
|
|
55
|
+
class="notification--message whitespace-pre-wrap"
|
|
56
|
+
tabindex="0"
|
|
57
|
+
>
|
|
52
58
|
{{ notification.message }}
|
|
53
59
|
</div>
|
|
54
60
|
<div class="notification--footer flex items-end justify-between">
|
|
55
|
-
<div
|
|
61
|
+
<div
|
|
62
|
+
v-if="notification.code"
|
|
63
|
+
class="code text-xs text-neutral-700 dark:text-neutral-300"
|
|
64
|
+
>
|
|
56
65
|
Code: {{ notification.code }}
|
|
57
66
|
</div>
|
|
58
67
|
<div class="notification--footer-spacer flex-1 py-1"/>
|
|
59
|
-
<div
|
|
68
|
+
<div
|
|
69
|
+
v-if="notification.options"
|
|
60
70
|
class="notification--options
|
|
61
71
|
flex flex-wrap justify-end
|
|
62
72
|
gap-2
|
|
63
73
|
"
|
|
64
74
|
>
|
|
65
|
-
<lib-button
|
|
75
|
+
<lib-button
|
|
76
|
+
:label="option"
|
|
66
77
|
:class="twMerge(`
|
|
67
78
|
notification--option-button
|
|
68
79
|
`,
|
|
@@ -78,8 +89,9 @@
|
|
|
78
89
|
</div>
|
|
79
90
|
</div>
|
|
80
91
|
</template>
|
|
92
|
+
|
|
81
93
|
<script setup lang="ts">
|
|
82
|
-
import { computed, type HTMLAttributes,ref, useAttrs } from "vue"
|
|
94
|
+
import { computed, type HTMLAttributes, ref, useAttrs } from "vue"
|
|
83
95
|
|
|
84
96
|
import IFa6RegularCopy from "~icons/fa6-regular/copy"
|
|
85
97
|
import IFa6SolidXmark from "~icons/fa6-solid/xmark"
|
|
@@ -91,30 +103,28 @@ import Icon from "../Icon/Icon.vue"
|
|
|
91
103
|
import LibButton from "../LibButton/LibButton.vue"
|
|
92
104
|
import type { TailwindClassProp } from "../shared/props.js"
|
|
93
105
|
|
|
94
|
-
|
|
95
106
|
defineOptions({
|
|
96
|
-
name: "
|
|
97
|
-
inheritAttrs: false
|
|
107
|
+
name: "LibNotification",
|
|
108
|
+
inheritAttrs: false
|
|
98
109
|
})
|
|
99
110
|
const $attrs = useAttrs()
|
|
100
111
|
|
|
101
112
|
const props = withDefaults(defineProps<Props>(), {
|
|
102
|
-
handler: undefined
|
|
113
|
+
handler: undefined
|
|
103
114
|
})
|
|
104
115
|
|
|
105
116
|
const getColor = (notification: NotificationEntry, option: string): "ok" | "primary" | "danger" | "secondary" => notification.default === option ? "primary" : notification.dangerous.includes(option) ? "danger" : "secondary"
|
|
106
117
|
|
|
107
118
|
/* Todo make this more flexible? */
|
|
108
|
-
|
|
119
|
+
|
|
109
120
|
const buttonColors = computed(() => props.notification.options.map((option: any /* what ??? */) => getColor(props.notification, option)))
|
|
110
121
|
|
|
111
122
|
const notificationEl = ref<null | HTMLElement>(null)
|
|
112
123
|
defineExpose({
|
|
113
124
|
focus: () => {
|
|
114
125
|
notificationEl.value?.focus()
|
|
115
|
-
}
|
|
126
|
+
}
|
|
116
127
|
})
|
|
117
|
-
|
|
118
128
|
</script>
|
|
119
129
|
|
|
120
130
|
<script lang="ts">
|
|
@@ -126,7 +136,7 @@ type RealProps = {
|
|
|
126
136
|
interface Props
|
|
127
137
|
extends
|
|
128
138
|
/** @vue-ignore */
|
|
129
|
-
Partial<Omit<HTMLAttributes,"class"> & TailwindClassProp>,
|
|
139
|
+
Partial<Omit<HTMLAttributes, "class"> & TailwindClassProp>,
|
|
130
140
|
RealProps
|
|
131
141
|
{}
|
|
132
142
|
</script>
|
|
@@ -5,23 +5,20 @@ import { reactive, ref } from "vue"
|
|
|
5
5
|
import LibNotifications from "./LibNotifications.vue"
|
|
6
6
|
|
|
7
7
|
import { NotificationHandler } from "../../helpers/NotificationHandler.js"
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
|
|
9
8
|
import * as components from "../index.js"
|
|
10
9
|
|
|
11
|
-
|
|
12
10
|
const meta: Meta<typeof LibNotifications> = {
|
|
13
11
|
component: LibNotifications,
|
|
14
12
|
title: "Components/Notifications",
|
|
15
13
|
args: {
|
|
16
14
|
// @ts-expect-error story only arg
|
|
17
|
-
withTitle: true
|
|
18
|
-
}
|
|
15
|
+
withTitle: true
|
|
16
|
+
}
|
|
19
17
|
}
|
|
20
18
|
|
|
21
19
|
export default meta
|
|
22
20
|
type Story = StoryObj<typeof LibNotifications>
|
|
23
21
|
|
|
24
|
-
|
|
25
22
|
export const Primary: Story = {
|
|
26
23
|
render: args => ({
|
|
27
24
|
components,
|
|
@@ -40,7 +37,7 @@ export const Primary: Story = {
|
|
|
40
37
|
message: `This is a notification that requires action. Pick an option:`,
|
|
41
38
|
requiresAction: true,
|
|
42
39
|
options: ["Ok", "Default Answer", "Cancel"],
|
|
43
|
-
default: "Default Answer"
|
|
40
|
+
default: "Default Answer"
|
|
44
41
|
})
|
|
45
42
|
}
|
|
46
43
|
const notifyWithDangerousOption = () => {
|
|
@@ -50,7 +47,7 @@ export const Primary: Story = {
|
|
|
50
47
|
message: `This is a notification that has a dangerous option. Pick an option:`,
|
|
51
48
|
options: ["Ok", "Default Answer", "Dangerous Option", "Cancel"],
|
|
52
49
|
default: "Default Answer",
|
|
53
|
-
dangerous: ["Dangerous Option"]
|
|
50
|
+
dangerous: ["Dangerous Option"]
|
|
54
51
|
})
|
|
55
52
|
}
|
|
56
53
|
const notifyNonCancellable = () => {
|
|
@@ -60,7 +57,7 @@ export const Primary: Story = {
|
|
|
60
57
|
message: `This is a non-cancellable notification. Pick an option:`,
|
|
61
58
|
options: ["Ok", "Default Answer"],
|
|
62
59
|
default: "Default Answer",
|
|
63
|
-
cancellable: false
|
|
60
|
+
cancellable: false
|
|
64
61
|
})
|
|
65
62
|
}
|
|
66
63
|
const notifyNonCancellableRequiresAction = () => {
|
|
@@ -71,7 +68,7 @@ export const Primary: Story = {
|
|
|
71
68
|
requiresAction: true,
|
|
72
69
|
options: ["Ok", "Default Answer"],
|
|
73
70
|
default: "Default Answer",
|
|
74
|
-
cancellable: false
|
|
71
|
+
cancellable: false
|
|
75
72
|
})
|
|
76
73
|
}
|
|
77
74
|
const notifyTimeoutable = () => {
|
|
@@ -79,7 +76,7 @@ export const Primary: Story = {
|
|
|
79
76
|
void handler.notify({
|
|
80
77
|
title: withTitle.value ? `Notification(${count})` : undefined,
|
|
81
78
|
message: `This is a notification. No action required.`,
|
|
82
|
-
timeout: disableTimeout.value ? false : 2000
|
|
79
|
+
timeout: disableTimeout.value ? false : 2000
|
|
83
80
|
})
|
|
84
81
|
}
|
|
85
82
|
return {
|
|
@@ -93,8 +90,8 @@ export const Primary: Story = {
|
|
|
93
90
|
disableTimeout,
|
|
94
91
|
args: {
|
|
95
92
|
outline: false,
|
|
96
|
-
...args
|
|
97
|
-
}
|
|
93
|
+
...args
|
|
94
|
+
}
|
|
98
95
|
}
|
|
99
96
|
},
|
|
100
97
|
backgrounds: { disable: true },
|
|
@@ -118,7 +115,6 @@ export const Primary: Story = {
|
|
|
118
115
|
</template>
|
|
119
116
|
</lib-debug>
|
|
120
117
|
</lib-root>
|
|
121
|
-
|
|
122
|
-
})
|
|
118
|
+
`
|
|
119
|
+
})
|
|
123
120
|
}
|
|
124
|
-
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<TransitionGroup
|
|
2
|
+
<TransitionGroup
|
|
3
|
+
name="list"
|
|
3
4
|
tag="div"
|
|
4
5
|
:class="twMerge(`notifications
|
|
5
6
|
absolute
|
|
@@ -13,7 +14,8 @@
|
|
|
13
14
|
`, ($attrs as any).class)"
|
|
14
15
|
v-bind="{ ...$attrs, class: undefined }"
|
|
15
16
|
>
|
|
16
|
-
<lib-notification
|
|
17
|
+
<lib-notification
|
|
18
|
+
class="pointer-events-auto"
|
|
17
19
|
:handler="handler"
|
|
18
20
|
tabindex="0"
|
|
19
21
|
:notification="notification"
|
|
@@ -28,7 +30,8 @@
|
|
|
28
30
|
/>
|
|
29
31
|
</Transition>
|
|
30
32
|
<Transition>
|
|
31
|
-
<dialog
|
|
33
|
+
<dialog
|
|
34
|
+
v-show="topNotifications.length > 0"
|
|
32
35
|
:id="id"
|
|
33
36
|
:class="twMerge(`notifications-modal
|
|
34
37
|
bg-transparent
|
|
@@ -40,7 +43,8 @@
|
|
|
40
43
|
@click.self.prevent="topNotifications[0] && NotificationHandler.dismiss(topNotifications[0])"
|
|
41
44
|
>
|
|
42
45
|
<form>
|
|
43
|
-
<lib-notification
|
|
46
|
+
<lib-notification
|
|
47
|
+
v-if="topNotifications.length > 0 && topNotifications[0]"
|
|
44
48
|
:handler="handler"
|
|
45
49
|
class="top-notification"
|
|
46
50
|
:notification="topNotifications[0]"
|
|
@@ -50,9 +54,10 @@
|
|
|
50
54
|
</dialog>
|
|
51
55
|
</Transition>
|
|
52
56
|
</template>
|
|
57
|
+
|
|
53
58
|
<script setup lang="ts">
|
|
54
59
|
import { removeIfIn } from "@alanscodelog/utils/removeIfIn"
|
|
55
|
-
import {
|
|
60
|
+
import { nextTick, onBeforeUnmount, ref, shallowReactive } from "vue"
|
|
56
61
|
|
|
57
62
|
import LibNotification from "./LibNotification.vue"
|
|
58
63
|
|
|
@@ -62,11 +67,10 @@ import { twMerge } from "../../utils/twMerge.js"
|
|
|
62
67
|
import type { LinkableByIdProps, TailwindClassProp } from "../shared/props.js"
|
|
63
68
|
|
|
64
69
|
defineOptions({
|
|
65
|
-
name: "
|
|
66
|
-
inheritAttrs: false
|
|
70
|
+
name: "LibNotifications",
|
|
71
|
+
inheritAttrs: false
|
|
67
72
|
})
|
|
68
73
|
|
|
69
|
-
|
|
70
74
|
const props = defineProps<Props>()
|
|
71
75
|
|
|
72
76
|
const dialogEl = ref<HTMLDialogElement | null>(null)
|
|
@@ -121,21 +125,22 @@ for (const entry of handler.queue) { addNotification(entry) }
|
|
|
121
125
|
onBeforeUnmount(() => {
|
|
122
126
|
handler.removeNotificationListener(notificationListener)
|
|
123
127
|
})
|
|
124
|
-
|
|
125
128
|
</script>
|
|
129
|
+
|
|
126
130
|
<script lang="ts">
|
|
131
|
+
import type { HTMLAttributes } from "vue"
|
|
127
132
|
|
|
128
|
-
type RealProps
|
|
129
|
-
& LinkableByIdProps
|
|
130
|
-
& {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
133
|
+
type RealProps
|
|
134
|
+
= & LinkableByIdProps
|
|
135
|
+
& {
|
|
136
|
+
/** If not provided, uses the global handler (this requires useNotificationHandler be called and configured). */
|
|
137
|
+
handler?: NotificationHandler
|
|
138
|
+
}
|
|
134
139
|
|
|
135
140
|
interface Props
|
|
136
141
|
extends
|
|
137
142
|
/** @vue-ignore */
|
|
138
|
-
Partial<Omit<HTMLAttributes,"class"> & TailwindClassProp>,
|
|
143
|
+
Partial<Omit<HTMLAttributes, "class"> & TailwindClassProp>,
|
|
139
144
|
RealProps
|
|
140
145
|
{}
|
|
141
146
|
</script>
|
|
@@ -4,22 +4,19 @@ import { ref } from "vue"
|
|
|
4
4
|
|
|
5
5
|
import LibPagination from "./LibPagination.vue"
|
|
6
6
|
|
|
7
|
-
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
|
|
8
7
|
import * as components from "../index.js"
|
|
9
8
|
|
|
10
|
-
|
|
11
9
|
const meta: Meta<typeof LibPagination> = {
|
|
12
10
|
component: LibPagination,
|
|
13
11
|
title: "Components/Pagination",
|
|
14
12
|
args: {
|
|
15
|
-
total: 10
|
|
16
|
-
}
|
|
13
|
+
total: 10
|
|
14
|
+
}
|
|
17
15
|
}
|
|
18
16
|
|
|
19
17
|
export default meta
|
|
20
18
|
type Story = StoryObj<typeof LibPagination>
|
|
21
19
|
|
|
22
|
-
|
|
23
20
|
export const Primary: Story = {
|
|
24
21
|
render: args => ({
|
|
25
22
|
components,
|
|
@@ -35,7 +32,7 @@ export const Primary: Story = {
|
|
|
35
32
|
return {
|
|
36
33
|
changePage,
|
|
37
34
|
args,
|
|
38
|
-
num
|
|
35
|
+
num
|
|
39
36
|
}
|
|
40
37
|
},
|
|
41
38
|
template: `
|
|
@@ -47,7 +44,6 @@ export const Primary: Story = {
|
|
|
47
44
|
<lib-simple-input :label="'Change Page'" :modelValue="num.toString()" @update:modelValue="num = parseInt($event)" type="number" min="0" :max="args.total">
|
|
48
45
|
|
|
49
46
|
</lib-simple-input>
|
|
50
|
-
|
|
51
|
-
})
|
|
47
|
+
`
|
|
48
|
+
})
|
|
52
49
|
}
|
|
53
|
-
|
|
@@ -7,70 +7,78 @@
|
|
|
7
7
|
role="navigation"
|
|
8
8
|
:aria-label="t('pagination.aria')"
|
|
9
9
|
>
|
|
10
|
-
<slot
|
|
10
|
+
<slot
|
|
11
|
+
v-if="prevLink.i > 0 && prevLink.i !== currentLink.i"
|
|
11
12
|
name="link"
|
|
12
13
|
:i="prevLink.i"
|
|
13
14
|
:href="prevLink.href"
|
|
14
15
|
:text="t('pagination.previous-page')"
|
|
15
|
-
:aria-label=" t('pagination.aria.go-to-previous-page',{count:prevLink.i})"
|
|
16
|
+
:aria-label=" t('pagination.aria.go-to-previous-page', { count: prevLink.i })"
|
|
16
17
|
:class="`pagination--link ${pageClasses}`"
|
|
17
18
|
>
|
|
18
19
|
<a
|
|
19
20
|
:class="`pagination--link ${pageClasses}`"
|
|
20
21
|
:href="prevLink.href"
|
|
21
|
-
:aria-label=" t('pagination.aria.go-to-previous-page', {count:prevLink.i})"
|
|
22
|
+
:aria-label=" t('pagination.aria.go-to-previous-page', { count: prevLink.i })"
|
|
22
23
|
/>
|
|
23
24
|
</slot>
|
|
24
25
|
<div class="pagination--spacer flex-1"/>
|
|
25
|
-
<slot
|
|
26
|
+
<slot
|
|
27
|
+
v-if="firstLink.i !== currentLink.i"
|
|
26
28
|
name="link"
|
|
27
29
|
:i="0"
|
|
28
30
|
:href="firstLink.href"
|
|
29
31
|
:text="firstLink.i"
|
|
30
|
-
:aria-label="t('pagination.aria.go-to-page', {count:firstLink.i})"
|
|
32
|
+
:aria-label="t('pagination.aria.go-to-page', { count: firstLink.i })"
|
|
31
33
|
:class="`pagination--link pagination--first-link ${pageClasses}`"
|
|
32
34
|
>
|
|
33
35
|
{{ firstLink.href }}
|
|
34
36
|
<a
|
|
35
37
|
:class="`pagination--link pagination--first-link ${pageClasses}`"
|
|
36
38
|
:href="firstLink.href"
|
|
37
|
-
:aria-label="t('pagination.aria.go-to-page', {count:firstLink.i})"
|
|
39
|
+
:aria-label="t('pagination.aria.go-to-page', { count: firstLink.i })"
|
|
38
40
|
>
|
|
39
41
|
{{ firstLink.i }}
|
|
40
42
|
</a>
|
|
41
43
|
</slot>
|
|
42
|
-
<div
|
|
44
|
+
<div
|
|
45
|
+
v-if="prevLink.i - extraPages > firstLink.i"
|
|
46
|
+
class="pagination--page-fill"
|
|
47
|
+
>
|
|
43
48
|
...
|
|
44
49
|
</div>
|
|
45
50
|
<template
|
|
46
51
|
v-for="entry in extraPagesPrev"
|
|
47
52
|
:key="entry.i"
|
|
48
53
|
>
|
|
49
|
-
<slot
|
|
54
|
+
<slot
|
|
55
|
+
name="link"
|
|
50
56
|
:class="`pagination--link ${pageClasses}`"
|
|
51
57
|
:i="entry.i"
|
|
52
58
|
:href="entry.href"
|
|
53
|
-
:aria-label="t('pagination.aria.go-to-page', {count:entry.i})"
|
|
59
|
+
:aria-label="t('pagination.aria.go-to-page', { count: entry.i })"
|
|
54
60
|
>
|
|
55
61
|
<a
|
|
56
62
|
:class="`pagination--link ${pageClasses}`"
|
|
57
63
|
:href="entry.href"
|
|
58
|
-
:aria-label="t('pagination.aria.go-to-page', {count:entry.i})"
|
|
64
|
+
:aria-label="t('pagination.aria.go-to-page', { count: entry.i })"
|
|
59
65
|
>
|
|
60
66
|
{{ entry.i }}
|
|
61
67
|
</a>
|
|
62
68
|
</slot>
|
|
63
69
|
</template>
|
|
64
|
-
<slot
|
|
70
|
+
<slot
|
|
71
|
+
name="current"
|
|
65
72
|
:class="`pagination--link ${currentPageClasses}`"
|
|
66
73
|
tabindex="0"
|
|
67
74
|
:i="currentLink.i"
|
|
68
|
-
:aria-label="t('pagination.aria.current-page', {count:currentLink.i})"
|
|
75
|
+
:aria-label="t('pagination.aria.current-page', { count: currentLink.i })"
|
|
69
76
|
:aria_current="true"
|
|
70
77
|
>
|
|
71
|
-
<div
|
|
78
|
+
<div
|
|
79
|
+
:class="`pagination--current-page a ${currentPageClasses}`"
|
|
72
80
|
tabindex="0"
|
|
73
|
-
:aria-label="t('pagination.aria.current-page', {count:currentLink.i})"
|
|
81
|
+
:aria-label="t('pagination.aria.current-page', { count: currentLink.i })"
|
|
74
82
|
aria-current="true"
|
|
75
83
|
@click="$event.preventDefault()"
|
|
76
84
|
>
|
|
@@ -81,36 +89,42 @@
|
|
|
81
89
|
v-for="entry in extraPagesNext"
|
|
82
90
|
:key="entry.i"
|
|
83
91
|
>
|
|
84
|
-
<slot
|
|
92
|
+
<slot
|
|
93
|
+
name="link"
|
|
85
94
|
:class="`pagination--link ${pageClasses}`"
|
|
86
95
|
:i="entry.i"
|
|
87
96
|
:href="entry.href"
|
|
88
|
-
:aria-label="t('pagination.aria.go-to-page', {count:entry.i})"
|
|
97
|
+
:aria-label="t('pagination.aria.go-to-page', { count: entry.i })"
|
|
89
98
|
>
|
|
90
99
|
<a
|
|
91
100
|
:class="`pagination--link ${pageClasses}`"
|
|
92
101
|
:href="entry.href"
|
|
93
|
-
:aria-label="t('pagination.aria.go-to-page', {count:entry.i})"
|
|
102
|
+
:aria-label="t('pagination.aria.go-to-page', { count: entry.i })"
|
|
94
103
|
>
|
|
95
104
|
{{ entry.i }}
|
|
96
105
|
</a>
|
|
97
106
|
</slot>
|
|
98
107
|
</template>
|
|
99
|
-
<div
|
|
108
|
+
<div
|
|
109
|
+
v-if="nextLink.i + extraPages < total"
|
|
110
|
+
class="pagination--page-fill"
|
|
111
|
+
aria-hidden="true"
|
|
112
|
+
>
|
|
100
113
|
...
|
|
101
114
|
</div>
|
|
102
|
-
<slot
|
|
115
|
+
<slot
|
|
116
|
+
v-if="lastLink.i !== currentLink.i"
|
|
103
117
|
name="link"
|
|
104
118
|
:class="`pagination--link ${pageClasses}`"
|
|
105
119
|
:i="lastLink.i"
|
|
106
120
|
:href="lastLink.href"
|
|
107
121
|
:text="total"
|
|
108
|
-
:aria-label="t('pagination.aria.go-to-page', {count:lastLink.i})"
|
|
122
|
+
:aria-label="t('pagination.aria.go-to-page', { count: lastLink.i })"
|
|
109
123
|
>
|
|
110
124
|
<a
|
|
111
125
|
:class="`pagination--link ${pageClasses}`"
|
|
112
126
|
:href="lastLink.href"
|
|
113
|
-
:aria-label="t('pagination.aria.go-to-page', {count:lastLink.i})"
|
|
127
|
+
:aria-label="t('pagination.aria.go-to-page', { count: lastLink.i })"
|
|
114
128
|
>
|
|
115
129
|
{{ total }}
|
|
116
130
|
</a>
|
|
@@ -123,24 +137,25 @@
|
|
|
123
137
|
:i="nextLink.i"
|
|
124
138
|
:href="nextLink.href"
|
|
125
139
|
:text="t('pagination.next-page')"
|
|
126
|
-
:aria-label="t('pagination.aria.go-to-next-page', {count:nextLink.i})"
|
|
140
|
+
:aria-label="t('pagination.aria.go-to-next-page', { count: nextLink.i })"
|
|
127
141
|
>
|
|
128
142
|
<a
|
|
129
143
|
:class="`pagination--link ${pageClasses}`"
|
|
130
144
|
:href="nextLink.href"
|
|
131
|
-
:aria-label="t('pagination.aria.go-to-next-page', {count:nextLink.i})"
|
|
145
|
+
:aria-label="t('pagination.aria.go-to-next-page', { count: nextLink.i })"
|
|
132
146
|
>
|
|
133
147
|
Next
|
|
134
148
|
</a>
|
|
135
149
|
</slot>
|
|
136
150
|
</nav>
|
|
137
151
|
</template>
|
|
152
|
+
|
|
138
153
|
<script setup lang="ts">
|
|
139
|
-
import { computed, type HTMLAttributes,useAttrs,watch } from "vue"
|
|
154
|
+
import { computed, type HTMLAttributes, useAttrs, watch } from "vue"
|
|
140
155
|
|
|
141
156
|
import { useInjectedI18n } from "../../composables/useInjectedI18n.js"
|
|
142
157
|
import { twMerge } from "../../utils/twMerge.js"
|
|
143
|
-
import {
|
|
158
|
+
import type { TailwindClassProp } from "../shared/props.js"
|
|
144
159
|
|
|
145
160
|
const t = useInjectedI18n()
|
|
146
161
|
|
|
@@ -166,8 +181,8 @@ const currentPageClasses = `
|
|
|
166
181
|
scale-125
|
|
167
182
|
`
|
|
168
183
|
defineOptions({
|
|
169
|
-
name: "
|
|
170
|
-
inheritAttrs: false
|
|
184
|
+
name: "LibPagination",
|
|
185
|
+
inheritAttrs: false
|
|
171
186
|
})
|
|
172
187
|
|
|
173
188
|
const props = withDefaults(defineProps<Props>(), {
|
|
@@ -178,7 +193,7 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
178
193
|
}
|
|
179
194
|
return { href: route + i.toString(), i }
|
|
180
195
|
},
|
|
181
|
-
extraPages: 3
|
|
196
|
+
extraPages: 3
|
|
182
197
|
})
|
|
183
198
|
const $attrs = useAttrs()
|
|
184
199
|
|
|
@@ -216,10 +231,9 @@ const extraPagesNext = computed(() => [...Array(props.extraPages + 1)].map((_, i
|
|
|
216
231
|
if (num <= firstLink.value.i || num >= lastLink.value.i || num <= currentLink.value.i) return undefined
|
|
217
232
|
return props.customRoute(props.route, num)
|
|
218
233
|
}).filter(entry => entry !== undefined).slice(0, props.extraPages) as HrefInfo[])
|
|
219
|
-
|
|
220
234
|
</script>
|
|
221
|
-
<script lang="ts">
|
|
222
235
|
|
|
236
|
+
<script lang="ts">
|
|
223
237
|
/**
|
|
224
238
|
* Pagination component.
|
|
225
239
|
*
|
|
@@ -231,7 +245,7 @@ const extraPagesNext = computed(() => [...Array(props.extraPages + 1)].map((_, i
|
|
|
231
245
|
* ```
|
|
232
246
|
*/
|
|
233
247
|
export default {
|
|
234
|
-
name: "
|
|
248
|
+
name: "LibPagination"
|
|
235
249
|
}
|
|
236
250
|
type RealProps = {
|
|
237
251
|
/** The total number of pages. */
|
|
@@ -254,7 +268,7 @@ type RealProps = {
|
|
|
254
268
|
interface Props
|
|
255
269
|
extends
|
|
256
270
|
/** @vue-ignore */
|
|
257
|
-
Partial<Omit<HTMLAttributes,"class"> & TailwindClassProp>,
|
|
271
|
+
Partial<Omit<HTMLAttributes, "class"> & TailwindClassProp>,
|
|
258
272
|
RealProps
|
|
259
273
|
{}
|
|
260
274
|
</script>
|
|
@@ -4,29 +4,25 @@ import type { Meta, StoryObj } from "@storybook/vue3"
|
|
|
4
4
|
import LibPalette from "./LibPalette.vue"
|
|
5
5
|
|
|
6
6
|
import { theme } from "../../theme.js"
|
|
7
|
-
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
|
|
8
7
|
import * as components from "../index.js"
|
|
9
8
|
|
|
10
|
-
|
|
11
9
|
const meta: Meta<typeof LibPalette> = {
|
|
12
10
|
component: LibPalette,
|
|
13
11
|
title: "Components/Palette",
|
|
14
12
|
args: {
|
|
15
13
|
// theme,
|
|
16
|
-
}
|
|
14
|
+
}
|
|
17
15
|
}
|
|
18
16
|
|
|
19
17
|
export default meta
|
|
20
18
|
type Story = StoryObj<typeof LibPalette>
|
|
21
19
|
|
|
22
|
-
|
|
23
20
|
export const Primary: Story = {
|
|
24
21
|
render: args => ({
|
|
25
22
|
components: { ...components, LibPalette },
|
|
26
23
|
setup: () => ({ args: { ...args, theme } }),
|
|
27
24
|
template: `
|
|
28
25
|
<LibPalette v-bind="{...args}">{{args.value}}</LibPalette>
|
|
29
|
-
|
|
30
|
-
})
|
|
26
|
+
`
|
|
27
|
+
})
|
|
31
28
|
}
|
|
32
|
-
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
<div class="theme-palette flex h-full flex-col items-center justify-center ">
|
|
3
3
|
<div class="theme-palette--container mx-auto ">
|
|
4
4
|
<div class="grid grid-cols-11 gap-2 gap-y-10 px-10">
|
|
5
|
-
<template
|
|
5
|
+
<template
|
|
6
|
+
v-for="color, i in colors"
|
|
7
|
+
:key="color"
|
|
8
|
+
>
|
|
6
9
|
<div
|
|
7
10
|
:style="`background-color: var(${color});`"
|
|
8
11
|
:class="`theme-palette--item h-10 rounded-sm flex items-center justify-center text-fg dark:text-bg`"
|
|
@@ -23,27 +26,25 @@
|
|
|
23
26
|
</template>
|
|
24
27
|
|
|
25
28
|
<script lang="ts">
|
|
26
|
-
export default { name: "
|
|
29
|
+
export default { name: "LibPalette" }
|
|
27
30
|
</script>
|
|
28
31
|
|
|
29
32
|
<script setup lang="ts">
|
|
30
33
|
import { keys } from "@alanscodelog/utils/keys"
|
|
31
|
-
import {
|
|
32
|
-
|
|
33
|
-
import { type BaseInteractiveProps,type LinkableByIdProps } from "../shared/props.js"
|
|
34
|
+
import type { Theme } from "metamorphosis"
|
|
34
35
|
|
|
36
|
+
import type { BaseInteractiveProps, LinkableByIdProps } from "../shared/props.js"
|
|
35
37
|
|
|
36
38
|
const props = withDefaults(defineProps<
|
|
37
|
-
& LinkableByIdProps
|
|
38
|
-
& BaseInteractiveProps
|
|
39
|
-
& {
|
|
40
|
-
|
|
41
|
-
}>(), {
|
|
39
|
+
& LinkableByIdProps
|
|
40
|
+
& BaseInteractiveProps
|
|
41
|
+
& {
|
|
42
|
+
theme?: Theme
|
|
43
|
+
}>(), {
|
|
42
44
|
theme: () => ({} as any),
|
|
43
|
-
unstyle: false, disabled: false, readonly: false, border: true
|
|
45
|
+
unstyle: false, disabled: false, readonly: false, border: true
|
|
44
46
|
})
|
|
45
47
|
|
|
46
48
|
const exclude = ["--color-bg", "--color-fg"]
|
|
47
49
|
const colors = keys(props.theme.css).filter(key => key.startsWith("--color") && !exclude.includes(key))
|
|
48
|
-
|
|
49
50
|
</script>
|