@marianmeres/stuic 1.120.0 → 1.122.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.
@@ -1,6 +1,6 @@
1
1
  import { createStore } from '@marianmeres/store';
2
2
  import { derived, get as storeGet, writable, } from 'svelte/store';
3
- import { twMerge } from 'tailwind-merge';
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 = twMerge(classes, 'fixed block transition-opacity')
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 = twMerge(classes, 'fixed block size-0 transition-opacity')
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-white
28
- dark:bg-black
27
+ bg-neutral-50
28
+ dark:bg-neutral-950
29
29
 
30
- text-black
31
- dark:text-white
30
+ text-neutral-950
31
+ dark:text-neutral-50
32
32
 
33
- border border-white
34
- dark:border-white/20
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-black/10 text-black/80
44
- dark:bg-white/20 dark:text-white/80
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-white/75
71
- dark:bg-black/75
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 = twMerge(..._collectClasses(dialog, "dialog"));
139
+ _dialogClass = twMerge2(..._collectClasses(dialog, "dialog"));
140
140
  $:
141
- _iconClass = twMerge(..._collectClasses(dialog, "icon"));
141
+ _iconClass = twMerge2(..._collectClasses(dialog, "icon"));
142
142
  $:
143
- _contentBlockClass = twMerge(..._collectClasses(dialog, "contentBlock"));
143
+ _contentBlockClass = twMerge2(..._collectClasses(dialog, "contentBlock"));
144
144
  $:
145
- _titleClass = twMerge(..._collectClasses(dialog, "title"));
145
+ _titleClass = twMerge2(..._collectClasses(dialog, "title"));
146
146
  $:
147
- _contentClass = twMerge(..._collectClasses(dialog, "content"));
147
+ _contentClass = twMerge2(..._collectClasses(dialog, "content"));
148
148
  $:
149
- _inputBoxClass = twMerge(..._collectClasses(dialog, "inputBox"));
149
+ _inputBoxClass = twMerge2(..._collectClasses(dialog, "inputBox"));
150
150
  $:
151
- _inputFieldClass = twMerge(..._collectClasses(dialog, "inputField"));
151
+ _inputFieldClass = twMerge2(..._collectClasses(dialog, "inputField"));
152
152
  $:
153
- _menuClass = twMerge(..._collectClasses(dialog, "menu"));
153
+ _menuClass = twMerge2(..._collectClasses(dialog, "menu"));
154
154
  $:
155
- _menuLiClass = twMerge(AlertConfirmPromptConfig.preset.menuLi);
155
+ _menuLiClass = twMerge2(AlertConfirmPromptConfig.preset.menuLi);
156
156
  $:
157
- _buttonClass = twMerge(..._collectClasses(dialog, "button"));
157
+ _buttonClass = twMerge2(..._collectClasses(dialog, "button"));
158
158
  $:
159
- _spinnerBoxClass = twMerge(..._collectClasses(dialog, "spinnerBox"));
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 { twMerge } from "tailwind-merge";
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={twMerge(`w-full h-full flex overflow-hidden ${_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={twMerge(`flex-none overflow-x-hidden overflow-y-auto ${railClass}`)}
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={twMerge(`flex-none ${headerClass}`)}
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={twMerge(`flex-auto w-full h-full flex overflow-hidden ${contentClass}`)}
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={twMerge(
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={twMerge(`${_pageFlexCls} overflow-x-hidden flex flex-col ${pageClass}`)}
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={twMerge(`flex-none ${pageHeaderClass}`)}
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={twMerge(`flex-auto ${pageMainClass}`)}
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={twMerge(`flex-none ${pageFooterClass}`)}
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={twMerge(
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={twMerge(`flex-none ${footerClass}`)}
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={twMerge(`
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 { twMerge } from "tailwind-merge";
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
- bg-neutral-200 text-black
17
- dark:bg-neutral-600 dark:text-white
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-black",
30
- sm: "shadow dark:shadow-black",
31
- md: "shadow dark:shadow-black",
32
- lg: "shadow-md dark:shadow-black",
33
- xl: "shadow-md dark:shadow-black"
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 text-stuic-on-primary
54
- dark:bg-stuic-primary-dark dark:text-stuic-on-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 = twMerge(
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] : "",
@@ -1,5 +1,5 @@
1
1
  <script context="module">import { slide } from "svelte/transition";
2
- import { twMerge } from "tailwind-merge";
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-black/5 dark:hover:bg-black/20
36
- focus-visible:bg-black/5 focus-visible:hover:bg-black/20 focus-visible:ring-0
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={twMerge(_collectClasses('box', themes[theme] ?? themes.primary))}
82
+ class={twMerge2(_collectClasses('box', themes[theme] ?? themes.primary))}
83
83
  transition:slide={{ duration }}
84
84
  >
85
- <div class={twMerge(_collectClasses('content'))}>
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={twMerge(_collectClasses('dismiss'))} on:click={() => onDismiss()}>
91
- <X class={twMerge(_collectClasses('x'))} strokeWidth={1.5} />
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={twMerge(`${_presetsClsBackdrop[position] || ''} ${backdropClass}`)}
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={twMerge(`overflow-y-auto ${_presetsCls[position] || ''} ${_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={twMerge(`overflow-x-hidden overflow-y-auto ${_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-black/35 dark:placeholder:text-white/35
41
- text-black dark:text-white
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 PinInput from "./PinInput.svelte";
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 = twMerge(_collectClasses("box"));
128
+ _boxClass = twMerge2(_collectClasses("box"));
129
129
  $:
130
- _labelClass = twMerge(
130
+ _labelClass = twMerge2(
131
131
  _collectClasses(
132
132
  "label",
133
133
  showAsterixOnRequired && required ? _collectClasses("asterix").join(" ") : ""
134
134
  )
135
135
  );
136
136
  $:
137
- _wrapClass = twMerge(
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 = twMerge(
144
+ _inputClass = twMerge2(
145
145
  "form-input",
146
146
  type === "textarea" ? "min-h-16" : "",
147
147
  _collectClasses("input")
148
148
  );
149
149
  $:
150
- _validationMessageClass = twMerge(_collectClasses("validationMessage"));
150
+ _validationMessageClass = twMerge2(_collectClasses("validationMessage"));
151
151
  $:
152
- _descriptionClass = twMerge(_collectClasses("description"));
152
+ _descriptionClass = twMerge2(_collectClasses("description"));
153
153
  $:
154
- _belowClass = twMerge(_collectClasses("below"));
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 = twMerge(_collectClasses("box"));
76
+ _boxClass = twMerge2(_collectClasses("box"));
77
77
  $:
78
- _inputClass = twMerge(
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 = twMerge(_collectClasses("label"));
85
+ _labelClass = twMerge2(_collectClasses("label"));
86
86
  $:
87
- _validationMessageClass = twMerge(_collectClasses("validationMessage"));
87
+ _validationMessageClass = twMerge2(_collectClasses("validationMessage"));
88
88
  $:
89
- _descriptionClass = twMerge(_collectClasses("description"));
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={twMerge(`gap-y-2 grid ${_class.group || ''}`)}>
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-black/35 dark:placeholder:text-white/35
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 = twMerge(_collectClasses("box"));
129
+ _boxClass = twMerge2(_collectClasses("box"));
130
130
  $:
131
- _labelClass = twMerge(
131
+ _labelClass = twMerge2(
132
132
  _collectClasses(
133
133
  "label",
134
134
  showAsterixOnRequired && required ? _collectClasses("asterix").join(" ") : ""
135
135
  )
136
136
  );
137
137
  $:
138
- _wrapClass = twMerge(
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 = twMerge("form-input", _collectClasses("input"));
145
+ _inputClass = twMerge2("form-input", _collectClasses("input"));
146
146
  $:
147
- _validationMessageClass = twMerge(_collectClasses("validationMessage"));
147
+ _validationMessageClass = twMerge2(_collectClasses("validationMessage"));
148
148
  $:
149
- _descriptionClass = twMerge(_collectClasses("description"));
149
+ _descriptionClass = twMerge2(_collectClasses("description"));
150
150
  $:
151
- _belowClass = twMerge(_collectClasses("below"));
151
+ _belowClass = twMerge2(_collectClasses("below"));
152
152
  </script>
153
153
 
154
154
  <div
@@ -1,4 +1,4 @@
1
- <script context="module">import { twMerge } from "tailwind-merge";
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={twMerge(_collectClasses('box'))}>
22
+ <fieldset class={twMerge2(_collectClasses('box'))}>
23
23
  {#if legend}
24
- <legend class={twMerge(_collectClasses('legend'))}>
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 { iconBsX } from "@marianmeres/icons-fns/bootstrap/iconBsX.js";
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={twMerge(
70
- 'flex items-center justify-center rounded bg-black/10 font-mono',
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={twMerge(
90
- 'caret-black',
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 = twMerge(_collectClasses("box"));
68
+ _boxClass = twMerge2(_collectClasses("box"));
69
69
  $:
70
- _inputClass = twMerge(
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 = twMerge(_collectClasses("label"));
77
+ _labelClass = twMerge2(_collectClasses("label"));
78
78
  $:
79
- _validationMessageClass = twMerge(_collectClasses("validationMessage"));
79
+ _validationMessageClass = twMerge2(_collectClasses("validationMessage"));
80
80
  $:
81
- _descriptionClass = twMerge(_collectClasses("description"));
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 { twMerge } from "tailwind-merge";
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-white
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-black text-white
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-black/20
60
- focus-visible:bg-black/20 focus-visible:outline-none focus-visible:ring-0
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 = twMerge(
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 = twMerge(
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) => twMerge(..._collectClasses(n, "box"));
131
- const _countClass = (n) => twMerge(..._collectClasses(n, "count"));
132
- const _iconClass = (n) => twMerge(..._collectClasses(n, "icon"));
133
- const _contentClass = (n) => twMerge(..._collectClasses(n, "content"));
134
- const _buttonClass = (n) => twMerge(..._collectClasses(n, "button"));
135
- const _xClass = (n) => twMerge(..._collectClasses(n, "x"));
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">import { twMerge } from "tailwind-merge";
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-white dark:bg-white
34
- text-black dark:text-black
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 = twMerge(
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 = twMerge(
82
+ dotClass = twMerge2(
83
83
  SwitchConfig.presetBaseDot,
84
84
  SwitchConfig.presetsSizeDot[size],
85
85
  SwitchConfig.classDot,
@@ -1,4 +1,4 @@
1
- <script>import { twMerge } from "tailwind-merge";
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={twMerge(`inline size-6 ${_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,2 @@
1
+ export declare const clsClean: (s: string) => string;
2
+ export declare const twMerge2: (...args: any[]) => string;
@@ -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));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marianmeres/stuic",
3
- "version": "1.120.0",
3
+ "version": "1.122.0",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build && npm run package && node ./scripts/date.js",