@marianmeres/stuic 1.120.0 → 1.121.0
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/actions/tooltip/tooltip.js +3 -3
- package/dist/components/AlertConfirmPrompt/AlertConfirmPrompt.svelte +22 -22
- package/dist/components/AppShell/AppShell.svelte +12 -12
- package/dist/components/Backdrop/Backdrop.svelte +2 -2
- package/dist/components/Button/Button.svelte +14 -13
- package/dist/components/DismissibleMessage/DismissibleMessage.svelte +7 -7
- package/dist/components/Drawer/Drawer.svelte +3 -3
- package/dist/components/HoverExpandableWidth/HoverExpandableWidth.svelte +2 -2
- package/dist/components/Input/Field.svelte +11 -11
- package/dist/components/Input/FieldCheckbox.svelte +6 -6
- package/dist/components/Input/FieldRadios.svelte +2 -2
- package/dist/components/Input/FieldSelect.svelte +9 -9
- package/dist/components/Input/Fieldset.svelte +3 -3
- package/dist/components/Input/PinInput.svelte +6 -6
- package/dist/components/Input/XFieldRadioInternal.svelte +6 -6
- package/dist/components/Notifications/Notifications.svelte +13 -13
- package/dist/components/Switch/Switch.svelte +7 -7
- package/dist/components/X/X.svelte +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/utils/tw-merge2.d.ts +2 -0
- package/dist/utils/tw-merge2.js +5 -0
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createStore } from '@marianmeres/store';
|
|
2
2
|
import { derived, get as storeGet, writable, } from 'svelte/store';
|
|
3
|
-
import {
|
|
3
|
+
import { twMerge2 } from '../../utils/tw-merge2.js';
|
|
4
4
|
import { windowSize } from '../../utils/window-size.js';
|
|
5
5
|
import { _makeInVisible, _makeVisible } from './_make-visible.js';
|
|
6
6
|
import { _setPosition } from './_set-position.js';
|
|
@@ -74,7 +74,7 @@ const _ensureDiv = (div, opts, log) => {
|
|
|
74
74
|
classes = [TooltipConfig.presetBase, TooltipConfig.class, opts.class].join(' ');
|
|
75
75
|
}
|
|
76
76
|
// make sure these are never overwritten (must come last)
|
|
77
|
-
classes =
|
|
77
|
+
classes = twMerge2(classes, 'fixed block transition-opacity')
|
|
78
78
|
.split(/\s/)
|
|
79
79
|
.filter(Boolean);
|
|
80
80
|
div.classList.add(...classes);
|
|
@@ -101,7 +101,7 @@ const _ensureArrow = (arrow, opts, log) => {
|
|
|
101
101
|
classes = [TooltipConfig.arrowPresetBase, TooltipConfig.arrowClass, opts.arrowClass].join(' ');
|
|
102
102
|
}
|
|
103
103
|
// make sure these are never overwritten (must come last)
|
|
104
|
-
classes =
|
|
104
|
+
classes = twMerge2(classes, 'fixed block size-0 transition-opacity')
|
|
105
105
|
.split(/\s/)
|
|
106
106
|
.filter(Boolean);
|
|
107
107
|
arrow.classList.add(...classes);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script context="module">import { createClog } from "@marianmeres/clog";
|
|
2
2
|
import { onMount } from "svelte";
|
|
3
|
-
import { twMerge } from "tailwind-merge";
|
|
4
3
|
import { focusTrap } from "../../actions/focus-trap.js";
|
|
4
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
5
5
|
import Button from "../Button/Button.svelte";
|
|
6
6
|
import Field from "../Input/Field.svelte";
|
|
7
7
|
import FieldSelect from "../Input/FieldSelect.svelte";
|
|
@@ -24,14 +24,14 @@ export class AlertConfirmPromptConfig {
|
|
|
24
24
|
transition-all
|
|
25
25
|
shadow-xl
|
|
26
26
|
focus-within:outline-0 focus-within:ring-0
|
|
27
|
-
bg-
|
|
28
|
-
dark:bg-
|
|
27
|
+
bg-neutral-50
|
|
28
|
+
dark:bg-neutral-950
|
|
29
29
|
|
|
30
|
-
text-
|
|
31
|
-
dark:text-
|
|
30
|
+
text-neutral-950
|
|
31
|
+
dark:text-neutral-50
|
|
32
32
|
|
|
33
|
-
border border-
|
|
34
|
-
dark:border-
|
|
33
|
+
border border-neutral-50
|
|
34
|
+
dark:border-neutral-50/20
|
|
35
35
|
`,
|
|
36
36
|
icon: `
|
|
37
37
|
size-12 sm:size-10
|
|
@@ -40,8 +40,8 @@ export class AlertConfirmPromptConfig {
|
|
|
40
40
|
flex flex-shrink-0 items-center justify-center
|
|
41
41
|
rounded-full
|
|
42
42
|
|
|
43
|
-
bg-
|
|
44
|
-
dark:bg-
|
|
43
|
+
bg-neutral-950/10 text-neutral-950/80
|
|
44
|
+
dark:bg-neutral-50/20 dark:text-neutral-50/80
|
|
45
45
|
`,
|
|
46
46
|
contentBlock: `mt-3 sm:mt-0 sm:flex-1`,
|
|
47
47
|
title: `
|
|
@@ -67,8 +67,8 @@ export class AlertConfirmPromptConfig {
|
|
|
67
67
|
absolute inset-0 flex justify-center items-center
|
|
68
68
|
rounded-lg
|
|
69
69
|
|
|
70
|
-
bg-
|
|
71
|
-
dark:bg-
|
|
70
|
+
bg-neutral-50/75
|
|
71
|
+
dark:bg-neutral-950/75
|
|
72
72
|
`
|
|
73
73
|
};
|
|
74
74
|
// prettier-ignore
|
|
@@ -136,27 +136,27 @@ const _collectClasses = (o, k) => [
|
|
|
136
136
|
o?.class?.[k] || ""
|
|
137
137
|
];
|
|
138
138
|
$:
|
|
139
|
-
_dialogClass =
|
|
139
|
+
_dialogClass = twMerge2(..._collectClasses(dialog, "dialog"));
|
|
140
140
|
$:
|
|
141
|
-
_iconClass =
|
|
141
|
+
_iconClass = twMerge2(..._collectClasses(dialog, "icon"));
|
|
142
142
|
$:
|
|
143
|
-
_contentBlockClass =
|
|
143
|
+
_contentBlockClass = twMerge2(..._collectClasses(dialog, "contentBlock"));
|
|
144
144
|
$:
|
|
145
|
-
_titleClass =
|
|
145
|
+
_titleClass = twMerge2(..._collectClasses(dialog, "title"));
|
|
146
146
|
$:
|
|
147
|
-
_contentClass =
|
|
147
|
+
_contentClass = twMerge2(..._collectClasses(dialog, "content"));
|
|
148
148
|
$:
|
|
149
|
-
_inputBoxClass =
|
|
149
|
+
_inputBoxClass = twMerge2(..._collectClasses(dialog, "inputBox"));
|
|
150
150
|
$:
|
|
151
|
-
_inputFieldClass =
|
|
151
|
+
_inputFieldClass = twMerge2(..._collectClasses(dialog, "inputField"));
|
|
152
152
|
$:
|
|
153
|
-
_menuClass =
|
|
153
|
+
_menuClass = twMerge2(..._collectClasses(dialog, "menu"));
|
|
154
154
|
$:
|
|
155
|
-
_menuLiClass =
|
|
155
|
+
_menuLiClass = twMerge2(AlertConfirmPromptConfig.preset.menuLi);
|
|
156
156
|
$:
|
|
157
|
-
_buttonClass =
|
|
157
|
+
_buttonClass = twMerge2(..._collectClasses(dialog, "button"));
|
|
158
158
|
$:
|
|
159
|
-
_spinnerBoxClass =
|
|
159
|
+
_spinnerBoxClass = twMerge2(..._collectClasses(dialog, "spinnerBox"));
|
|
160
160
|
$:
|
|
161
161
|
iconFn = dialog?.iconFn ?? defaultIcons?.[dialog?.variant];
|
|
162
162
|
</script>
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</script>
|
|
10
10
|
|
|
11
11
|
<script>import { createEventDispatcher } from "svelte";
|
|
12
|
-
import {
|
|
12
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
13
13
|
const dispatch = createEventDispatcher();
|
|
14
14
|
let _class = "";
|
|
15
15
|
export { _class as class };
|
|
@@ -78,14 +78,14 @@ $:
|
|
|
78
78
|
bind:this={shell}
|
|
79
79
|
{id}
|
|
80
80
|
data-shell="shell"
|
|
81
|
-
class={
|
|
81
|
+
class={twMerge2(`w-full h-full flex overflow-hidden ${_class}`)}
|
|
82
82
|
>
|
|
83
83
|
<!-- shell > rail -->
|
|
84
84
|
{#if $$slots.rail}
|
|
85
85
|
<div
|
|
86
86
|
bind:this={rail}
|
|
87
87
|
data-shell="rail"
|
|
88
|
-
class={
|
|
88
|
+
class={twMerge2(`flex-none overflow-x-hidden overflow-y-auto ${railClass}`)}
|
|
89
89
|
>
|
|
90
90
|
<slot name="rail" />
|
|
91
91
|
</div>
|
|
@@ -98,7 +98,7 @@ $:
|
|
|
98
98
|
<header
|
|
99
99
|
bind:this={header}
|
|
100
100
|
data-shell="header"
|
|
101
|
-
class={
|
|
101
|
+
class={twMerge2(`flex-none ${headerClass}`)}
|
|
102
102
|
>
|
|
103
103
|
<slot name="header" />
|
|
104
104
|
</header>
|
|
@@ -107,14 +107,14 @@ $:
|
|
|
107
107
|
<!-- shell > div > content -->
|
|
108
108
|
<div
|
|
109
109
|
data-shell="content"
|
|
110
|
-
class={
|
|
110
|
+
class={twMerge2(`flex-auto w-full h-full flex overflow-hidden ${contentClass}`)}
|
|
111
111
|
>
|
|
112
112
|
<!-- shell > div > content > sidebar-left -->
|
|
113
113
|
{#if $$slots.sidebarLeft}
|
|
114
114
|
<aside
|
|
115
115
|
bind:this={sidebarLeft}
|
|
116
116
|
data-shell="sidebar-left"
|
|
117
|
-
class={
|
|
117
|
+
class={twMerge2(
|
|
118
118
|
`${_sidebarFlexCls} overflow-x-hidden overflow-y-auto w-auto ${sidebarLeftClass}`
|
|
119
119
|
)}
|
|
120
120
|
>
|
|
@@ -126,7 +126,7 @@ $:
|
|
|
126
126
|
<div
|
|
127
127
|
bind:this={page}
|
|
128
128
|
data-shell="page"
|
|
129
|
-
class={
|
|
129
|
+
class={twMerge2(`${_pageFlexCls} overflow-x-hidden flex flex-col ${pageClass}`)}
|
|
130
130
|
style:scrollbar-gutter={scrollbarGutter}
|
|
131
131
|
on:scroll
|
|
132
132
|
>
|
|
@@ -135,7 +135,7 @@ $:
|
|
|
135
135
|
<header
|
|
136
136
|
bind:this={pageHeader}
|
|
137
137
|
data-shell="page-header"
|
|
138
|
-
class={
|
|
138
|
+
class={twMerge2(`flex-none ${pageHeaderClass}`)}
|
|
139
139
|
>
|
|
140
140
|
<slot name="pageHeader" />
|
|
141
141
|
</header>
|
|
@@ -145,7 +145,7 @@ $:
|
|
|
145
145
|
<main
|
|
146
146
|
bind:this={pageMain}
|
|
147
147
|
data-shell="page-main"
|
|
148
|
-
class={
|
|
148
|
+
class={twMerge2(`flex-auto ${pageMainClass}`)}
|
|
149
149
|
>
|
|
150
150
|
<slot />
|
|
151
151
|
</main>
|
|
@@ -155,7 +155,7 @@ $:
|
|
|
155
155
|
<footer
|
|
156
156
|
bind:this={pageFooter}
|
|
157
157
|
data-shell="page-footer"
|
|
158
|
-
class={
|
|
158
|
+
class={twMerge2(`flex-none ${pageFooterClass}`)}
|
|
159
159
|
>
|
|
160
160
|
<slot name="pageFooter" />
|
|
161
161
|
</footer>
|
|
@@ -167,7 +167,7 @@ $:
|
|
|
167
167
|
<aside
|
|
168
168
|
bind:this={sidebarRight}
|
|
169
169
|
data-shell="sidebar-right"
|
|
170
|
-
class={
|
|
170
|
+
class={twMerge2(
|
|
171
171
|
`${_sidebarFlexCls} overflow-x-hidden overflow-y-auto ${sidebarRightClass}`
|
|
172
172
|
)}
|
|
173
173
|
>
|
|
@@ -181,7 +181,7 @@ $:
|
|
|
181
181
|
<footer
|
|
182
182
|
bind:this={footer}
|
|
183
183
|
data-shell="footer"
|
|
184
|
-
class={
|
|
184
|
+
class={twMerge2(`flex-none ${footerClass}`)}
|
|
185
185
|
>
|
|
186
186
|
<slot name="footer" />
|
|
187
187
|
</footer>
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
|
|
8
8
|
<script>import { createEventDispatcher } from "svelte";
|
|
9
9
|
import { fade } from "svelte/transition";
|
|
10
|
-
import { twMerge } from "tailwind-merge";
|
|
11
10
|
import { focusTrap } from "../../actions/focus-trap.js";
|
|
12
11
|
import { prefersReducedMotionStore } from "../../utils/prefers-reduced-motion.js";
|
|
12
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
13
13
|
const dispatch = createEventDispatcher();
|
|
14
14
|
export let useFocusTrap = true;
|
|
15
15
|
export let focusTrapOptions = {};
|
|
@@ -33,7 +33,7 @@ $:
|
|
|
33
33
|
<!-- prettier-ignore -->
|
|
34
34
|
<div
|
|
35
35
|
bind:this={el}
|
|
36
|
-
class={
|
|
36
|
+
class={twMerge2(`
|
|
37
37
|
fixed inset-0 flex z-10
|
|
38
38
|
${BackdropConfig.class} ${_class}
|
|
39
39
|
`.trim())}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script context="module">import {
|
|
1
|
+
<script context="module">import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
2
2
|
export class ButtonConfig {
|
|
3
3
|
static defaultSize = "md";
|
|
4
4
|
static defaultShadow = false;
|
|
@@ -11,11 +11,10 @@ export class ButtonConfig {
|
|
|
11
11
|
active:brightness-[0.95]
|
|
12
12
|
disabled:!cursor-not-allowed disabled:!opacity-50 disabled:hover:brightness-100
|
|
13
13
|
no-underline
|
|
14
|
-
border
|
|
14
|
+
border border-neutral-300 dark:border-neutral-500
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
dark:bg-neutral-600 dark:text-
|
|
18
|
-
border-neutral-400 dark:border-neutral-500
|
|
16
|
+
bg-neutral-200 text-neutral-950
|
|
17
|
+
dark:bg-neutral-600 dark:text-neutral-50
|
|
19
18
|
`.trim();
|
|
20
19
|
static presetSquare = "p-0 aspect-square justify-center";
|
|
21
20
|
static presetsRounded = {
|
|
@@ -26,11 +25,11 @@ export class ButtonConfig {
|
|
|
26
25
|
xl: "rounded-lg"
|
|
27
26
|
};
|
|
28
27
|
static presetsShadow = {
|
|
29
|
-
xs: "shadow-sm dark:shadow-
|
|
30
|
-
sm: "shadow dark:shadow-
|
|
31
|
-
md: "shadow dark:shadow-
|
|
32
|
-
lg: "shadow-md dark:shadow-
|
|
33
|
-
xl: "shadow-md dark:shadow-
|
|
28
|
+
xs: "shadow-sm dark:shadow-neutral-950",
|
|
29
|
+
sm: "shadow dark:shadow-neutral-950",
|
|
30
|
+
md: "shadow dark:shadow-neutral-950",
|
|
31
|
+
lg: "shadow-md dark:shadow-neutral-950",
|
|
32
|
+
xl: "shadow-md dark:shadow-neutral-950"
|
|
34
33
|
};
|
|
35
34
|
static presetsSize = {
|
|
36
35
|
xs: "px-2 py-0.5 leading-tight text-xs",
|
|
@@ -50,8 +49,8 @@ export class ButtonConfig {
|
|
|
50
49
|
// to be defined at consumer level...
|
|
51
50
|
static variant = {
|
|
52
51
|
primary: `
|
|
53
|
-
bg-stuic-primary
|
|
54
|
-
dark:bg-stuic-primary-dark
|
|
52
|
+
bg-stuic-primary text-stuic-on-primary
|
|
53
|
+
dark:bg-stuic-primary-dark dark:text-stuic-on-primary-dark
|
|
55
54
|
`.trim(),
|
|
56
55
|
secondary: `
|
|
57
56
|
bg-stuic-secondary text-stuic-on-secondary
|
|
@@ -78,7 +77,7 @@ $:
|
|
|
78
77
|
size = ButtonConfig.defaultSize;
|
|
79
78
|
let buttonClass;
|
|
80
79
|
$:
|
|
81
|
-
buttonClass =
|
|
80
|
+
buttonClass = twMerge2(
|
|
82
81
|
ButtonConfig.presetBase,
|
|
83
82
|
// either full, or config, or none
|
|
84
83
|
rounded ? rounded === "full" || square ? "rounded-full" : ButtonConfig.presetsRounded[size] : "",
|
|
@@ -100,6 +99,8 @@ $:
|
|
|
100
99
|
//
|
|
101
100
|
_class
|
|
102
101
|
);
|
|
102
|
+
$:
|
|
103
|
+
console.log(123, buttonClass.replace(/\s+/gi, " "));
|
|
103
104
|
</script>
|
|
104
105
|
|
|
105
106
|
{#if href}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script context="module">import { slide } from "svelte/transition";
|
|
2
|
-
import {
|
|
2
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
3
3
|
import Thc, { isTHCNotEmpty } from "../Thc/Thc.svelte";
|
|
4
4
|
import X from "../X/X.svelte";
|
|
5
5
|
const themes = {
|
|
@@ -32,8 +32,8 @@ const _PRESET = {
|
|
|
32
32
|
box: `mb-4 rounded flex text-sm`,
|
|
33
33
|
content: `flex-1 px-4 py-3`,
|
|
34
34
|
dismiss: `
|
|
35
|
-
hover:bg-
|
|
36
|
-
focus-visible:bg-
|
|
35
|
+
hover:bg-neutral-950/5 dark:hover:bg-neutral-950/20
|
|
36
|
+
focus-visible:bg-neutral-950/5 focus-visible:hover:bg-neutral-950/20 focus-visible:ring-0
|
|
37
37
|
rounded rounded-l-none
|
|
38
38
|
px-3
|
|
39
39
|
flex items-center justify-center
|
|
@@ -79,16 +79,16 @@ const _collectClasses = (k, extra = "") => [
|
|
|
79
79
|
<!-- {#if isNotEmpty(message)} -->
|
|
80
80
|
{#if show}
|
|
81
81
|
<div
|
|
82
|
-
class={
|
|
82
|
+
class={twMerge2(_collectClasses('box', themes[theme] ?? themes.primary))}
|
|
83
83
|
transition:slide={{ duration }}
|
|
84
84
|
>
|
|
85
|
-
<div class={
|
|
85
|
+
<div class={twMerge2(_collectClasses('content'))}>
|
|
86
86
|
<Thc thc={message} {forceAsHtml} />
|
|
87
87
|
</div>
|
|
88
88
|
|
|
89
89
|
{#if typeof onDismiss === 'function'}
|
|
90
|
-
<button class={
|
|
91
|
-
<X class={
|
|
90
|
+
<button class={twMerge2(_collectClasses('dismiss'))} on:click={() => onDismiss()}>
|
|
91
|
+
<X class={twMerge2(_collectClasses('x'))} strokeWidth={1.5} />
|
|
92
92
|
</button>
|
|
93
93
|
{/if}
|
|
94
94
|
</div>
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import { createSwitchStore } from "@marianmeres/switch-store";
|
|
3
3
|
import { createEventDispatcher } from "svelte";
|
|
4
4
|
import { fly } from "svelte/transition";
|
|
5
|
-
import { twMerge } from "tailwind-merge";
|
|
6
5
|
import { onOutside } from "../../actions/on-outside.js";
|
|
7
6
|
import { prefersReducedMotionStore } from "../../utils/prefers-reduced-motion.js";
|
|
7
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
8
8
|
import Backdrop from "../Backdrop/Backdrop.svelte";
|
|
9
9
|
export const createDrawerStore = (open = false) => createSwitchStore(open);
|
|
10
10
|
</script>
|
|
@@ -55,7 +55,7 @@ $:
|
|
|
55
55
|
|
|
56
56
|
{#if $drawer.isOpen}
|
|
57
57
|
<Backdrop
|
|
58
|
-
class={
|
|
58
|
+
class={twMerge2(`${_presetsClsBackdrop[position] || ''} ${backdropClass}`)}
|
|
59
59
|
on:escape
|
|
60
60
|
on:mousedown={(e) => dispatch('click_backdrop')}
|
|
61
61
|
{fadeInDuration}
|
|
@@ -79,7 +79,7 @@ $:
|
|
|
79
79
|
duration: transitionEnabled ? transitionDuration : 0,
|
|
80
80
|
...(_presetsAnim[position] || {}),
|
|
81
81
|
}}
|
|
82
|
-
class={
|
|
82
|
+
class={twMerge2(`overflow-y-auto ${_presetsCls[position] || ''} ${_class}`)}
|
|
83
83
|
use:onOutside
|
|
84
84
|
>
|
|
85
85
|
<slot />
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script>import { createClog } from "@marianmeres/clog";
|
|
2
2
|
import { createEventDispatcher } from "svelte";
|
|
3
3
|
import { get } from "svelte/store";
|
|
4
|
-
import { twMerge } from "tailwind-merge";
|
|
5
4
|
import { DevicePointer } from "../../utils/device-pointer.js";
|
|
6
5
|
import { prefersReducedMotionStore } from "../../utils/prefers-reduced-motion.js";
|
|
6
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
7
7
|
import { windowSize } from "../../utils/window-size.js";
|
|
8
8
|
const clog = createClog("HoverExpandableWidth");
|
|
9
9
|
const dispatch = createEventDispatcher();
|
|
@@ -105,7 +105,7 @@ $:
|
|
|
105
105
|
on:mouseleave={() => _planDelayedExec(_shrink, delayOut)}
|
|
106
106
|
on:click
|
|
107
107
|
aria-expanded={_isExpanded}
|
|
108
|
-
class={
|
|
108
|
+
class={twMerge2(`overflow-x-hidden overflow-y-auto ${_class}`)}
|
|
109
109
|
style="width: 100%; height: 100%; transition-duration: {duration}ms;"
|
|
110
110
|
>
|
|
111
111
|
<slot
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
<script context="module">import { createClog } from "@marianmeres/clog";
|
|
2
2
|
import { createEventDispatcher } from "svelte";
|
|
3
3
|
import { slide } from "svelte/transition";
|
|
4
|
-
import { twMerge } from "tailwind-merge";
|
|
5
4
|
import { autogrow } from "../../actions/autogrow.js";
|
|
6
5
|
import { trim } from "../../actions/trim.js";
|
|
7
6
|
import { validate as validateAction } from "../../actions/validate.js";
|
|
@@ -37,8 +36,8 @@ const _PRESET = {
|
|
|
37
36
|
tracking-tight
|
|
38
37
|
focus:outline-0 focus-visible:ring-0
|
|
39
38
|
placeholder:tracking-tight
|
|
40
|
-
placeholder:text-
|
|
41
|
-
text-
|
|
39
|
+
placeholder:text-neutral-950/35 dark:placeholder:text-neutral-50/35
|
|
40
|
+
text-neutral-950 dark:text-neutral-50
|
|
42
41
|
`,
|
|
43
42
|
invalid: `border-stuic-primary`,
|
|
44
43
|
validationMessage: `my-1 text-xs text-stuic-primary px-2 tracking-tight`,
|
|
@@ -76,7 +75,8 @@ export class FieldConfig {
|
|
|
76
75
|
}
|
|
77
76
|
</script>
|
|
78
77
|
|
|
79
|
-
<script>import
|
|
78
|
+
<script>import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
79
|
+
import PinInput from "./PinInput.svelte";
|
|
80
80
|
const clog = createClog("Field");
|
|
81
81
|
const dispatch = createEventDispatcher();
|
|
82
82
|
const setType = (el, t) => el.type = t;
|
|
@@ -125,33 +125,33 @@ const _collectClasses = (k, extra = "") => [
|
|
|
125
125
|
classBySize?.[size]?.[k] || ""
|
|
126
126
|
];
|
|
127
127
|
$:
|
|
128
|
-
_boxClass =
|
|
128
|
+
_boxClass = twMerge2(_collectClasses("box"));
|
|
129
129
|
$:
|
|
130
|
-
_labelClass =
|
|
130
|
+
_labelClass = twMerge2(
|
|
131
131
|
_collectClasses(
|
|
132
132
|
"label",
|
|
133
133
|
showAsterixOnRequired && required ? _collectClasses("asterix").join(" ") : ""
|
|
134
134
|
)
|
|
135
135
|
);
|
|
136
136
|
$:
|
|
137
|
-
_wrapClass =
|
|
137
|
+
_wrapClass = twMerge2(
|
|
138
138
|
_collectClasses(
|
|
139
139
|
"wrap",
|
|
140
140
|
validation && !validation.valid ? _collectClasses("invalid").join(" ") : ""
|
|
141
141
|
)
|
|
142
142
|
);
|
|
143
143
|
$:
|
|
144
|
-
_inputClass =
|
|
144
|
+
_inputClass = twMerge2(
|
|
145
145
|
"form-input",
|
|
146
146
|
type === "textarea" ? "min-h-16" : "",
|
|
147
147
|
_collectClasses("input")
|
|
148
148
|
);
|
|
149
149
|
$:
|
|
150
|
-
_validationMessageClass =
|
|
150
|
+
_validationMessageClass = twMerge2(_collectClasses("validationMessage"));
|
|
151
151
|
$:
|
|
152
|
-
_descriptionClass =
|
|
152
|
+
_descriptionClass = twMerge2(_collectClasses("description"));
|
|
153
153
|
$:
|
|
154
|
-
_belowClass =
|
|
154
|
+
_belowClass = twMerge2(_collectClasses("below"));
|
|
155
155
|
</script>
|
|
156
156
|
|
|
157
157
|
<div
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script context="module">import { slide } from "svelte/transition";
|
|
2
|
-
import { twMerge } from "tailwind-merge";
|
|
3
2
|
import { validate as validateAction } from "../../actions/validate.js";
|
|
4
3
|
import { getId } from "../../utils/get-id.js";
|
|
4
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
5
5
|
import Thc from "../Thc/Thc.svelte";
|
|
6
6
|
const _emptyClasses = () => ({
|
|
7
7
|
box: "",
|
|
@@ -73,20 +73,20 @@ const _collectClasses = (k, extra = "") => [
|
|
|
73
73
|
classBySize?.[size]?.[k] || ""
|
|
74
74
|
];
|
|
75
75
|
$:
|
|
76
|
-
_boxClass =
|
|
76
|
+
_boxClass = twMerge2(_collectClasses("box"));
|
|
77
77
|
$:
|
|
78
|
-
_inputClass =
|
|
78
|
+
_inputClass = twMerge2(
|
|
79
79
|
_collectClasses(
|
|
80
80
|
"input",
|
|
81
81
|
validation && !validation.valid ? _collectClasses("invalid").join(" ") : ""
|
|
82
82
|
)
|
|
83
83
|
);
|
|
84
84
|
$:
|
|
85
|
-
_labelClass =
|
|
85
|
+
_labelClass = twMerge2(_collectClasses("label"));
|
|
86
86
|
$:
|
|
87
|
-
_validationMessageClass =
|
|
87
|
+
_validationMessageClass = twMerge2(_collectClasses("validationMessage"));
|
|
88
88
|
$:
|
|
89
|
-
_descriptionClass =
|
|
89
|
+
_descriptionClass = twMerge2(_collectClasses("description"));
|
|
90
90
|
</script>
|
|
91
91
|
|
|
92
92
|
<div class={_boxClass}>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script context="module">import { createClog } from "@marianmeres/clog";
|
|
2
|
-
import { twMerge } from "tailwind-merge";
|
|
3
2
|
import { getId } from "../../utils/get-id.js";
|
|
3
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
4
4
|
import XFieldRadioInternal from "./XFieldRadioInternal.svelte";
|
|
5
5
|
const _emptyClasses = () => ({
|
|
6
6
|
group: "",
|
|
@@ -49,7 +49,7 @@ $:
|
|
|
49
49
|
</script>
|
|
50
50
|
|
|
51
51
|
{#if options.length}
|
|
52
|
-
<div class={
|
|
52
|
+
<div class={twMerge2(`gap-y-2 grid ${_class.group || ''}`)}>
|
|
53
53
|
{#each _options as o, i}
|
|
54
54
|
<XFieldRadioInternal
|
|
55
55
|
bind:group={value}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script context="module">import { createClog } from "@marianmeres/clog";
|
|
2
2
|
import { createEventDispatcher } from "svelte";
|
|
3
3
|
import { slide } from "svelte/transition";
|
|
4
|
-
import { twMerge } from "tailwind-merge";
|
|
5
4
|
import { validate as validateAction } from "../../actions/validate.js";
|
|
6
5
|
import { getId } from "../../utils/get-id.js";
|
|
6
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
7
7
|
import Thc from "../Thc/Thc.svelte";
|
|
8
8
|
const _emptyClasses = () => ({
|
|
9
9
|
box: "",
|
|
@@ -33,7 +33,7 @@ const _PRESET = {
|
|
|
33
33
|
bg-neutral-100 dark:bg-neutral-700
|
|
34
34
|
tracking-tight
|
|
35
35
|
focus:outline-0 focus-visible:ring-0
|
|
36
|
-
placeholder:text-
|
|
36
|
+
placeholder:text-neutral-950/35 dark:placeholder:text-neutral-50/35
|
|
37
37
|
placeholder:tracking-tight
|
|
38
38
|
`,
|
|
39
39
|
invalid: `border-stuic-primary`,
|
|
@@ -126,29 +126,29 @@ const _collectClasses = (k, extra = "") => [
|
|
|
126
126
|
classBySize?.[size]?.[k] || ""
|
|
127
127
|
];
|
|
128
128
|
$:
|
|
129
|
-
_boxClass =
|
|
129
|
+
_boxClass = twMerge2(_collectClasses("box"));
|
|
130
130
|
$:
|
|
131
|
-
_labelClass =
|
|
131
|
+
_labelClass = twMerge2(
|
|
132
132
|
_collectClasses(
|
|
133
133
|
"label",
|
|
134
134
|
showAsterixOnRequired && required ? _collectClasses("asterix").join(" ") : ""
|
|
135
135
|
)
|
|
136
136
|
);
|
|
137
137
|
$:
|
|
138
|
-
_wrapClass =
|
|
138
|
+
_wrapClass = twMerge2(
|
|
139
139
|
_collectClasses(
|
|
140
140
|
"wrap",
|
|
141
141
|
validation && !validation.valid ? _collectClasses("invalid").join(" ") : ""
|
|
142
142
|
)
|
|
143
143
|
);
|
|
144
144
|
$:
|
|
145
|
-
_inputClass =
|
|
145
|
+
_inputClass = twMerge2("form-input", _collectClasses("input"));
|
|
146
146
|
$:
|
|
147
|
-
_validationMessageClass =
|
|
147
|
+
_validationMessageClass = twMerge2(_collectClasses("validationMessage"));
|
|
148
148
|
$:
|
|
149
|
-
_descriptionClass =
|
|
149
|
+
_descriptionClass = twMerge2(_collectClasses("description"));
|
|
150
150
|
$:
|
|
151
|
-
_belowClass =
|
|
151
|
+
_belowClass = twMerge2(_collectClasses("below"));
|
|
152
152
|
</script>
|
|
153
153
|
|
|
154
154
|
<div
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script context="module">import {
|
|
1
|
+
<script context="module">import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
2
2
|
import Thc from "../Thc/Thc.svelte";
|
|
3
3
|
const _PRESET = {
|
|
4
4
|
box: `border border-neutral-200 p-4 pt-3 rounded-md`,
|
|
@@ -19,9 +19,9 @@ const _collectClasses = (k, extra = "") => [
|
|
|
19
19
|
];
|
|
20
20
|
</script>
|
|
21
21
|
|
|
22
|
-
<fieldset class={
|
|
22
|
+
<fieldset class={twMerge2(_collectClasses('box'))}>
|
|
23
23
|
{#if legend}
|
|
24
|
-
<legend class={
|
|
24
|
+
<legend class={twMerge2(_collectClasses('legend'))}>
|
|
25
25
|
<Thc thc={legend} forceAsHtml />
|
|
26
26
|
</legend>
|
|
27
27
|
{/if}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<script>import { createClog } from "@marianmeres/clog";
|
|
2
2
|
import { iconBsEye } from "@marianmeres/icons-fns/bootstrap/iconBsEye.js";
|
|
3
3
|
import { iconBsEyeSlash } from "@marianmeres/icons-fns/bootstrap/iconBsEyeSlash.js";
|
|
4
|
+
import { iconBsX } from "@marianmeres/icons-fns/bootstrap/iconBsX.js";
|
|
4
5
|
import { createEventDispatcher } from "svelte";
|
|
5
|
-
import { twMerge } from "tailwind-merge";
|
|
6
6
|
import { trim } from "../../actions/trim.js";
|
|
7
7
|
import { validate as validateAction } from "../../actions/validate.js";
|
|
8
8
|
import { getId } from "../../utils/get-id.js";
|
|
9
|
-
import {
|
|
9
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
10
10
|
const dispatch = createEventDispatcher();
|
|
11
11
|
const clog = createClog("PinInput");
|
|
12
12
|
export let tabindex = 0;
|
|
@@ -66,8 +66,8 @@ const gridCols = [
|
|
|
66
66
|
<div class="absolute inset-0 grid {gridCols[length - 2]} pointer-events-none p-1 gap-1">
|
|
67
67
|
{#each _cells as c, idx (idx)}
|
|
68
68
|
<div
|
|
69
|
-
class={
|
|
70
|
-
'flex items-center justify-center rounded bg-
|
|
69
|
+
class={twMerge2(
|
|
70
|
+
'flex items-center justify-center rounded bg-neutral-950/10 font-mono',
|
|
71
71
|
pinCellClass
|
|
72
72
|
)}
|
|
73
73
|
>
|
|
@@ -86,8 +86,8 @@ const gridCols = [
|
|
|
86
86
|
{id}
|
|
87
87
|
type="text"
|
|
88
88
|
spellcheck="false"
|
|
89
|
-
class={
|
|
90
|
-
'caret-
|
|
89
|
+
class={twMerge2(
|
|
90
|
+
'caret-neutral-950',
|
|
91
91
|
inputClass,
|
|
92
92
|
`font-mono text-transparent dark:text-transparent`
|
|
93
93
|
)}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<script context="module">import { createEventDispatcher } from "svelte";
|
|
2
2
|
import { slide } from "svelte/transition";
|
|
3
|
-
import { twMerge } from "tailwind-merge";
|
|
4
3
|
import { validate as validateAction } from "../../actions/validate.js";
|
|
5
4
|
import { getId } from "../../utils/get-id.js";
|
|
5
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
6
6
|
import Thc from "../Thc/Thc.svelte";
|
|
7
7
|
import {
|
|
8
8
|
FieldRadiosConfig
|
|
@@ -65,20 +65,20 @@ const _collectClasses = (k, extra = "") => [
|
|
|
65
65
|
classBySize?.[size]?.[k] || ""
|
|
66
66
|
];
|
|
67
67
|
$:
|
|
68
|
-
_boxClass =
|
|
68
|
+
_boxClass = twMerge2(_collectClasses("box"));
|
|
69
69
|
$:
|
|
70
|
-
_inputClass =
|
|
70
|
+
_inputClass = twMerge2(
|
|
71
71
|
_collectClasses(
|
|
72
72
|
"input",
|
|
73
73
|
validation && !validation.valid ? _collectClasses("invalid").join(" ") : ""
|
|
74
74
|
)
|
|
75
75
|
);
|
|
76
76
|
$:
|
|
77
|
-
_labelClass =
|
|
77
|
+
_labelClass = twMerge2(_collectClasses("label"));
|
|
78
78
|
$:
|
|
79
|
-
_validationMessageClass =
|
|
79
|
+
_validationMessageClass = twMerge2(_collectClasses("validationMessage"));
|
|
80
80
|
$:
|
|
81
|
-
_descriptionClass =
|
|
81
|
+
_descriptionClass = twMerge2(_collectClasses("description"));
|
|
82
82
|
</script>
|
|
83
83
|
|
|
84
84
|
<div class={_boxClass}>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script context="module">import { createClog } from "@marianmeres/clog";
|
|
2
2
|
import { fade } from "svelte/transition";
|
|
3
|
-
import {
|
|
3
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
4
4
|
import Thc from "../Thc/Thc.svelte";
|
|
5
5
|
import X from "../X/X.svelte";
|
|
6
6
|
import { notificationsDefaultIcons } from "./notifications-icons.js";
|
|
@@ -31,7 +31,7 @@ export class NotificationsConfig {
|
|
|
31
31
|
w-full max-w-sm
|
|
32
32
|
rounded-md
|
|
33
33
|
shadow-lg
|
|
34
|
-
bg-neutral-700 text-
|
|
34
|
+
bg-neutral-700 text-neutral-50
|
|
35
35
|
`,
|
|
36
36
|
count: `
|
|
37
37
|
absolute -top-2 -right-2
|
|
@@ -39,7 +39,7 @@ export class NotificationsConfig {
|
|
|
39
39
|
flex items-center justify-center
|
|
40
40
|
px-2 py-1 rounded-full
|
|
41
41
|
leading-none text-xs
|
|
42
|
-
bg-
|
|
42
|
+
bg-neutral-950 text-neutral-50
|
|
43
43
|
`,
|
|
44
44
|
icon: `
|
|
45
45
|
flex items-start justify-center
|
|
@@ -56,8 +56,8 @@ export class NotificationsConfig {
|
|
|
56
56
|
flex flex-col items-center justify-center
|
|
57
57
|
leading-none
|
|
58
58
|
px-3
|
|
59
|
-
hover:bg-
|
|
60
|
-
focus-visible:bg-
|
|
59
|
+
hover:bg-neutral-950/20
|
|
60
|
+
focus-visible:bg-neutral-950/20 focus-visible:outline-none focus-visible:ring-0
|
|
61
61
|
group
|
|
62
62
|
rounded-tr-md rounded-br-md
|
|
63
63
|
`,
|
|
@@ -105,7 +105,7 @@ $:
|
|
|
105
105
|
$:
|
|
106
106
|
yMobile = Y_POSITIONS.includes(posYMobile) ? posYMobile : DEFAULT.posYMobile;
|
|
107
107
|
$:
|
|
108
|
-
_wrapClass =
|
|
108
|
+
_wrapClass = twMerge2(
|
|
109
109
|
NotificationsConfig.preset.wrap,
|
|
110
110
|
`flex flex-row inset-0
|
|
111
111
|
pointer-events-none bg-transparent`,
|
|
@@ -113,7 +113,7 @@ $:
|
|
|
113
113
|
YMAP[y]
|
|
114
114
|
);
|
|
115
115
|
$:
|
|
116
|
-
_wrapInnerClass =
|
|
116
|
+
_wrapInnerClass = twMerge2(
|
|
117
117
|
NotificationsConfig.preset.wrapInner,
|
|
118
118
|
`flex flex-col w-full
|
|
119
119
|
pointer-events-none bg-transparent`,
|
|
@@ -127,12 +127,12 @@ const _collectClasses = (n, k) => [
|
|
|
127
127
|
classesByType?.[n.type]?.[k] || "",
|
|
128
128
|
n.class?.[k] || ""
|
|
129
129
|
];
|
|
130
|
-
const _boxClass = (n) =>
|
|
131
|
-
const _countClass = (n) =>
|
|
132
|
-
const _iconClass = (n) =>
|
|
133
|
-
const _contentClass = (n) =>
|
|
134
|
-
const _buttonClass = (n) =>
|
|
135
|
-
const _xClass = (n) =>
|
|
130
|
+
const _boxClass = (n) => twMerge2(..._collectClasses(n, "box"));
|
|
131
|
+
const _countClass = (n) => twMerge2(..._collectClasses(n, "count"));
|
|
132
|
+
const _iconClass = (n) => twMerge2(..._collectClasses(n, "icon"));
|
|
133
|
+
const _contentClass = (n) => twMerge2(..._collectClasses(n, "content"));
|
|
134
|
+
const _buttonClass = (n) => twMerge2(..._collectClasses(n, "button"));
|
|
135
|
+
const _xClass = (n) => twMerge2(..._collectClasses(n, "x"));
|
|
136
136
|
const _iconFn = (o) => o.iconFn ?? defaultIcons?.[o.type];
|
|
137
137
|
const _isFn = (v) => typeof v === "function";
|
|
138
138
|
</script>
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
<script context="module">
|
|
2
|
-
export class SwitchConfig {
|
|
1
|
+
<script context="module">export class SwitchConfig {
|
|
3
2
|
static defaultSize = "md";
|
|
4
3
|
static defaultVariant = void 0;
|
|
5
4
|
static presetBase = `
|
|
@@ -12,7 +11,7 @@ export class SwitchConfig {
|
|
|
12
11
|
disabled:!cursor-not-allowed disabled:!opacity-50 disabled:hover:brightness-100
|
|
13
12
|
|
|
14
13
|
bg-neutral-400 dark:bg-neutral-400
|
|
15
|
-
data-[checked=true]:bg-stuic-primary dark:data-[checked=true]:bg-stuic-primary
|
|
14
|
+
data-[checked=true]:bg-stuic-primary dark:data-[checked=true]:bg-stuic-primary-dark
|
|
16
15
|
`.trim();
|
|
17
16
|
static presetsSize = {
|
|
18
17
|
xs: "h-4 w-7",
|
|
@@ -30,8 +29,8 @@ export class SwitchConfig {
|
|
|
30
29
|
translate-x-1 rounded-full
|
|
31
30
|
transition-all duration-100
|
|
32
31
|
shadow
|
|
33
|
-
bg-
|
|
34
|
-
text-
|
|
32
|
+
bg-neutral-50 dark:bg-neutral-50
|
|
33
|
+
text-neutral-950 dark:text-neutral-950
|
|
35
34
|
`.trim();
|
|
36
35
|
static presetsSizeDot = {
|
|
37
36
|
// size + translate-x = width
|
|
@@ -48,6 +47,7 @@ export class SwitchConfig {
|
|
|
48
47
|
</script>
|
|
49
48
|
|
|
50
49
|
<script>import { createEventDispatcher } from "svelte";
|
|
50
|
+
import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
51
51
|
let _class = "";
|
|
52
52
|
export { _class as class };
|
|
53
53
|
export let classDot = "";
|
|
@@ -67,7 +67,7 @@ $:
|
|
|
67
67
|
size = SwitchConfig.defaultSize;
|
|
68
68
|
let switchClass;
|
|
69
69
|
$:
|
|
70
|
-
switchClass =
|
|
70
|
+
switchClass = twMerge2(
|
|
71
71
|
SwitchConfig.presetBase,
|
|
72
72
|
SwitchConfig.presetsSize[size],
|
|
73
73
|
SwitchConfig.class,
|
|
@@ -79,7 +79,7 @@ $:
|
|
|
79
79
|
);
|
|
80
80
|
let dotClass;
|
|
81
81
|
$:
|
|
82
|
-
dotClass =
|
|
82
|
+
dotClass = twMerge2(
|
|
83
83
|
SwitchConfig.presetBaseDot,
|
|
84
84
|
SwitchConfig.presetsSizeDot[size],
|
|
85
85
|
SwitchConfig.classDot,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script>import {
|
|
1
|
+
<script>import { twMerge2 } from "../../utils/tw-merge2.js";
|
|
2
2
|
let _class = "";
|
|
3
3
|
export { _class as class };
|
|
4
4
|
export let strokeWidth = 2;
|
|
@@ -9,7 +9,7 @@ export let strokeWidth = 2;
|
|
|
9
9
|
viewBox="0 0 24 24"
|
|
10
10
|
stroke-width={strokeWidth}
|
|
11
11
|
stroke="currentColor"
|
|
12
|
-
class={
|
|
12
|
+
class={twMerge2(`inline size-6 ${_class}`)}
|
|
13
13
|
>
|
|
14
14
|
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" />
|
|
15
15
|
</svg>
|
package/dist/index.d.ts
CHANGED
|
@@ -34,4 +34,5 @@ export { calculateAlignment } from './utils/calculate-alignment.js';
|
|
|
34
34
|
export { DevicePointer } from './utils/device-pointer.js';
|
|
35
35
|
export { getId } from './utils/get-id.js';
|
|
36
36
|
export { windowSize, breakpoint } from './utils/window-size.js';
|
|
37
|
+
export { twMerge2, clsClean } from './utils/tw-merge2.js';
|
|
37
38
|
export type { TW_COLORS } from './utils/tw-types.js';
|
package/dist/index.js
CHANGED
|
@@ -50,3 +50,4 @@ export { calculateAlignment } from './utils/calculate-alignment.js';
|
|
|
50
50
|
export { DevicePointer } from './utils/device-pointer.js';
|
|
51
51
|
export { getId } from './utils/get-id.js';
|
|
52
52
|
export { windowSize, breakpoint } from './utils/window-size.js';
|
|
53
|
+
export { twMerge2, clsClean } from './utils/tw-merge2.js';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { twMerge } from 'tailwind-merge';
|
|
2
|
+
export const clsClean = (s) => `${s || ''}`.replace(/\s+/gi, ' ').trim();
|
|
3
|
+
// twMerge does not seem to handle "\t" and/or "\n" within the input strings correctly,
|
|
4
|
+
// so we need to do the cleanup ourselves
|
|
5
|
+
export const twMerge2 = (...args) => twMerge(...args.map(clsClean));
|