@lavalogic/scoria 0.37.45 → 0.37.47

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.
@@ -2,16 +2,19 @@
2
2
 
3
3
  <!--
4
4
  @component
5
- Single toast rendering. Renders a horizontally-sliding pill near the
6
- bottom-right of the viewport via `ToastContainer`. The severity of the
7
- underlying toast drives both the colouring and the live-region
5
+ Single toast rendering. Renders a pill near the bottom-right of the
6
+ viewport via `ToastContainer`, sliding in vertically. The severity of
7
+ the underlying toast drives both the colouring and the live-region
8
8
  semantics:
9
9
 
10
10
  - `Validity.Invalid` -> `role="alert"`, `aria-live="assertive"`.
11
11
  - All other severities -> `role="status"`, `aria-live="polite"`.
12
12
 
13
- The slide transition honours `prefers-reduced-motion` through the
14
- shared `usePrefersReducedMotion` helper; when the user has opted in
13
+ The slide transition animates the pill's height (the `y` axis) so the
14
+ message keeps its final width for the whole animation animating the
15
+ `x` axis instead reflows the text from stacked-and-wrapped to a single
16
+ line as the pill widens. It honours `prefers-reduced-motion` through
17
+ the shared `usePrefersReducedMotion` helper; when the user has opted in
15
18
  the duration collapses to zero. The copy action is only shown when
16
19
  `navigator.clipboard` is present (HTTPS or `localhost`).
17
20
  -->
@@ -44,7 +47,7 @@ the duration collapses to zero. The copy action is only shown when
44
47
  class:success={toast.result == Validity.Valid}
45
48
  class:warning={toast.result == Validity.Warning}
46
49
  class:error={toast.result == Validity.Invalid}
47
- transition:slide={{ axis: 'x', duration: slideDuration }}
50
+ transition:slide={{ axis: 'y', duration: slideDuration }}
48
51
  >
49
52
  <div>
50
53
  <div class="noshrink">
@@ -1,15 +1,18 @@
1
1
  import type { ToastProps } from './ToastProps.js';
2
2
  /**
3
- * Single toast rendering. Renders a horizontally-sliding pill near the
4
- * bottom-right of the viewport via `ToastContainer`. The severity of the
5
- * underlying toast drives both the colouring and the live-region
3
+ * Single toast rendering. Renders a pill near the bottom-right of the
4
+ * viewport via `ToastContainer`, sliding in vertically. The severity of
5
+ * the underlying toast drives both the colouring and the live-region
6
6
  * semantics:
7
7
  *
8
8
  * - `Validity.Invalid` -> `role="alert"`, `aria-live="assertive"`.
9
9
  * - All other severities -> `role="status"`, `aria-live="polite"`.
10
10
  *
11
- * The slide transition honours `prefers-reduced-motion` through the
12
- * shared `usePrefersReducedMotion` helper; when the user has opted in
11
+ * The slide transition animates the pill's height (the `y` axis) so the
12
+ * message keeps its final width for the whole animation animating the
13
+ * `x` axis instead reflows the text from stacked-and-wrapped to a single
14
+ * line as the pill widens. It honours `prefers-reduced-motion` through
15
+ * the shared `usePrefersReducedMotion` helper; when the user has opted in
13
16
  * the duration collapses to zero. The copy action is only shown when
14
17
  * `navigator.clipboard` is present (HTTPS or `localhost`).
15
18
  */
@@ -12,8 +12,12 @@ import type { PartialIconProps } from './PartialIconProps.js';
12
12
  export interface DateOnlyInputProps {
13
13
  /** Discriminator. Must be the literal `'date'`. */
14
14
  type: 'date';
15
- /** Bindable date value. `''` represents "no date selected". */
16
- value?: InputDate | '';
15
+ /**
16
+ * Bindable date value. `''` or `null` represent "no date selected"
17
+ * — both are accepted because consumers commonly back the binding
18
+ * with a nullable field; the component treats them alike.
19
+ */
20
+ value?: InputDate | '' | null;
17
21
  /** Label rendered above the input. */
18
22
  label?: string;
19
23
  /** Native `placeholder` attribute. */
@@ -11,8 +11,12 @@ import type { PartialIconProps } from './PartialIconProps.js';
11
11
  export interface DateTimeInputProps {
12
12
  /** Discriminator. Must be the literal `'datetime-local'`. */
13
13
  type: 'datetime-local';
14
- /** Bindable datetime value. `''` represents "no value selected". */
15
- value?: InputDateWithTime | '';
14
+ /**
15
+ * Bindable datetime value. `''` or `null` represent "no value
16
+ * selected" — both are accepted because consumers commonly back the
17
+ * binding with a nullable field; the component treats them alike.
18
+ */
19
+ value?: InputDateWithTime | '' | null;
16
20
  /** Label rendered above the input. */
17
21
  label?: string;
18
22
  /** Native `placeholder` attribute. */
@@ -4,6 +4,7 @@
4
4
  lang="ts"
5
5
  generics="T"
6
6
  >
7
+ import { afterNavigate } from '$app/navigation';
7
8
  import { Size } from '../../Types/Internal/Size.js';
8
9
  import Icon from '../Icon.svelte';
9
10
  import type { NavProps } from './NavProps.js';
@@ -31,6 +32,16 @@
31
32
 
32
33
  let showServicesDialog = $state(false);
33
34
  let showUserDialog = $state(false);
35
+
36
+ // Close both nav popovers after any navigation. Selecting an item in
37
+ // the Services menu is a navigation, so the menu must dismiss itself —
38
+ // without this it only closed when the consumer happened to remount
39
+ // `<Nav>` (e.g. on a main-area change), leaving it open when the user
40
+ // picked a sibling item within the same area.
41
+ afterNavigate(() => {
42
+ showServicesDialog = false;
43
+ showUserDialog = false;
44
+ });
34
45
  </script>
35
46
 
36
47
  <nav class="main-navigation">
@@ -792,6 +792,10 @@ div.input-wrapper-parent div.input-wrapper.right {
792
792
  flex-grow: 2;
793
793
  --input-padding-right: 2.6rem;
794
794
  }
795
+ div.input-wrapper-parent > :global(.select-wrapper) {
796
+ flex: 1 1 auto;
797
+ min-width: 0;
798
+ }
795
799
 
796
800
  [role=cell] {
797
801
  --input-width: 100%;
@@ -11,7 +11,7 @@
11
11
  * `minSize`, …) via the `commonProps(...)` helper. `id` is passed explicitly
12
12
  * at each call site so its narrowed literal type survives the object spread.
13
13
  */
14
- import { generateUUID, syntheticColumnId } from '../../Helpers/Helpers.svelte.js';
14
+ import { formatDateTime, generateUUID, syntheticColumnId } from '../../Helpers/Helpers.svelte.js';
15
15
  import { CheckboxDef } from './Types/Columns/Definitions/Accessors/CheckboxDef.svelte.js';
16
16
  import { DateInputDef } from './Types/Columns/Definitions/Accessors/DateInputDef.svelte.js';
17
17
  import { NumberInputDef } from './Types/Columns/Definitions/Accessors/NumberInputDef.svelte.js';
@@ -172,28 +172,17 @@ function normaliseOptionsLoader(options) {
172
172
  * tests can exercise individual factory methods without round-tripping
173
173
  * through a full `createTable(...)` call.
174
174
  */
175
- /** Format a Date or ISO-8601 date string in the browser locale. Used by
175
+ /** Format a Date / ISO-8601 string / epoch number for display. Used by
176
176
  * `col.display` when the column declares `filterValueType: 'Date'`, so
177
- * raw backend timestamps render as localised date+time rather than the
178
- * ISO payload. Returns null / empty input unchanged. */
177
+ * raw backend timestamps render as a localised date+time rather than the
178
+ * ISO payload. Delegates to the exported `formatDateTime` helper so table
179
+ * cells and non-table date surfaces format identically. Anything that is
180
+ * not a date-like value (the column was mis-declared) yields `''`. */
179
181
  function formatLocaleDate(value) {
180
- if (value == null || value === '') {
181
- return value;
182
+ if (value instanceof Date || typeof value === 'string' || typeof value === 'number') {
183
+ return formatDateTime(value);
182
184
  }
183
- let d;
184
- if (value instanceof Date) {
185
- d = value;
186
- }
187
- else if (typeof value === 'string' || typeof value === 'number') {
188
- const parsed = new Date(value);
189
- if (!Number.isNaN(parsed.getTime())) {
190
- d = parsed;
191
- }
192
- }
193
- if (d == null) {
194
- return value;
195
- }
196
- return d.toLocaleString();
185
+ return '';
197
186
  }
198
187
  export function createColumnFactory() {
199
188
  const factory = {
@@ -338,14 +327,9 @@ export function createColumnFactory() {
338
327
  const dateDisplayValue = opts.filterValueType === 'Date'
339
328
  ? (row, index) => {
340
329
  const v = rawValue(row, index);
341
- if (v instanceof Promise) {
342
- return v.then((resolved) => {
343
- const formatted = formatLocaleDate(resolved);
344
- return formatted == null ? null : String(formatted);
345
- });
346
- }
347
- const formatted = formatLocaleDate(v);
348
- return formatted == null ? null : String(formatted);
330
+ return v instanceof Promise
331
+ ? v.then((resolved) => formatLocaleDate(resolved))
332
+ : formatLocaleDate(v);
349
333
  }
350
334
  : undefined;
351
335
  const def = new DisplayDef({
@@ -5,10 +5,10 @@
5
5
  generics="T extends object, IdType extends Primitive"
6
6
  >
7
7
  import Button from '../../Button.svelte';
8
+ import DesktopModal from '../../DesktopModal.svelte';
8
9
  import SingleSelect from '../../SingleSelect.svelte';
9
10
  import ColumnList from '../Body/Rows/ColumnList.svelte';
10
11
  import TextInput from '../../TextInput.svelte';
11
- import TouchModal from '../../Touch/TouchModal.svelte';
12
12
  import type { SelectOption } from '../../../Types/Internal/SelectOption.js';
13
13
  import { Size } from '../../../Types/Internal/Size.js';
14
14
  import { Variant } from '../../../Types/Internal/Variant.js';
@@ -53,8 +53,8 @@
53
53
  }
54
54
  </script>
55
55
 
56
- <TouchModal
57
- header="Modify Columns"
56
+ <DesktopModal
57
+ headerLabel="Modify Columns"
58
58
  onclose={() => onclose?.()}
59
59
  buttons={[{ label: 'Close', callback: () => onclose?.() }]}
60
60
  >
@@ -107,7 +107,7 @@
107
107
  >
108
108
  </div>
109
109
  </div>
110
- </TouchModal>
110
+ </DesktopModal>
111
111
 
112
112
  <style>.flex {
113
113
  display: flex;
@@ -4,7 +4,8 @@
4
4
  lang="ts"
5
5
  module
6
6
  >
7
- import TouchModal from '../../Touch/TouchModal.svelte';
7
+ import DesktopModal from '../../DesktopModal.svelte';
8
+ import { cssLength } from '../../../Helpers/Helpers.svelte.js';
8
9
  import FilterPanel from './FilterPanel.svelte';
9
10
 
10
11
  export interface FilterPanelModalProps {
@@ -16,16 +17,16 @@
16
17
  const { onclose }: FilterPanelModalProps = $props();
17
18
  </script>
18
19
 
19
- <TouchModal
20
- width="800px"
21
- header="Filter by"
20
+ <DesktopModal
21
+ width={cssLength('800px')}
22
+ headerLabel="Filter by"
22
23
  onclose={() => onclose?.()}
23
24
  buttons={[{ label: 'Close', callback: () => onclose?.() }]}
24
25
  >
25
26
  <div class="flex">
26
27
  <FilterPanel />
27
28
  </div>
28
- </TouchModal>
29
+ </DesktopModal>
29
30
 
30
31
  <style>.flex {
31
32
  display: flex;
@@ -133,6 +133,51 @@ export declare function SQLFriendlyWithLocalTime(date: InputDate | InputDateWith
133
133
  * timestamps consistently across scoria.
134
134
  */
135
135
  export declare const localTimeFormat: Intl.DateTimeFormat;
136
+ /**
137
+ * Default locale used by {@link formatDate} / {@link formatDateTime}
138
+ * when a caller does not pass one explicitly. UK English — a 24-hour
139
+ * clock and `DD/MM/YYYY` day-first ordering.
140
+ */
141
+ export declare const defaultDateLocale = "en-GB";
142
+ /**
143
+ * Canonical date + time display formatter. Use this anywhere a
144
+ * timestamp is shown to a user — table cells, cards, modals, headers —
145
+ * so every surface formats identically.
146
+ *
147
+ * The optional `locale` (a BCP-47 tag such as `'en-GB'`, `'en-US'`,
148
+ * `'de-DE'`) selects the display conventions: it drives the
149
+ * day/month/year ordering and separators — `en-GB` → `19/05/2026,
150
+ * 14:30`, `en-US` → `05/19/2026, 14:30`. It defaults to
151
+ * {@link defaultDateLocale}. The clock is always 24-hour and the
152
+ * timezone is the runtime-resolved one regardless of locale.
153
+ *
154
+ * - `Date` values format directly.
155
+ * - `string` / `number` values are parsed via `new Date(...)`. An
156
+ * unparseable string is returned unchanged (so a non-date value is
157
+ * not silently blanked); an unparseable number yields `''`.
158
+ * - `null` / `undefined` / empty string yield `''`.
159
+ *
160
+ * For a time-only render use {@link localTimeFormat}; for a date with
161
+ * no time use {@link formatDate}; for the SQL-backend serialisation
162
+ * shapes use {@link SQLFriendly} / {@link SQLFriendlyWithLocalTime}.
163
+ */
164
+ export declare function formatDateTime(value: Date | string | number | null | undefined, locale?: string): string;
165
+ /**
166
+ * Canonical date-only display formatter. Use this for values that carry
167
+ * no meaningful time component — due dates, expiry dates, pod-line date
168
+ * attributes — so every surface formats identically. When the value
169
+ * also has a time the user needs to see, use {@link formatDateTime}.
170
+ *
171
+ * The optional `locale` works exactly as in {@link formatDateTime} — it
172
+ * selects the day/month/year ordering and separators and defaults to
173
+ * {@link defaultDateLocale}.
174
+ *
175
+ * Parsing and null-handling match {@link formatDateTime}: a `Date`
176
+ * formats directly; `string` / `number` are parsed via `new Date(...)`;
177
+ * an unparseable string is returned unchanged; `null` / `undefined` /
178
+ * empty string yield `''`.
179
+ */
180
+ export declare function formatDate(value: Date | string | number | null | undefined, locale?: string): string;
136
181
  /**
137
182
  * Barcode-scanner helper. Wire as an `onkeydown` on **buttons and
138
183
  * other non-text focusable elements** that should yield focus when a
@@ -245,6 +245,101 @@ export const localTimeFormat = new Intl.DateTimeFormat('en-GB', {
245
245
  second: '2-digit',
246
246
  timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
247
247
  });
248
+ /**
249
+ * Default locale used by {@link formatDate} / {@link formatDateTime}
250
+ * when a caller does not pass one explicitly. UK English — a 24-hour
251
+ * clock and `DD/MM/YYYY` day-first ordering.
252
+ */
253
+ export const defaultDateLocale = 'en-GB';
254
+ /**
255
+ * Per-locale caches of `Intl.DateTimeFormat` instances. Constructing a
256
+ * formatter is comparatively expensive, so the first call for a given
257
+ * locale builds it and every later call for that locale reuses it. The
258
+ * caches only ever grow and hold immutable formatters, so they are safe
259
+ * to share across SSR requests.
260
+ */
261
+ const dateTimeFormatters = {};
262
+ const dateFormatters = {};
263
+ /** Build (and cache) a full date + time formatter for `locale`. */
264
+ function dateTimeFormatterFor(locale) {
265
+ return (dateTimeFormatters[locale] ??= new Intl.DateTimeFormat(locale, {
266
+ day: '2-digit',
267
+ month: '2-digit',
268
+ year: 'numeric',
269
+ hour: '2-digit',
270
+ hourCycle: 'h23',
271
+ minute: '2-digit',
272
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
273
+ }));
274
+ }
275
+ /** Build (and cache) a date-only formatter for `locale`. */
276
+ function dateFormatterFor(locale) {
277
+ return (dateFormatters[locale] ??= new Intl.DateTimeFormat(locale, {
278
+ day: '2-digit',
279
+ month: '2-digit',
280
+ year: 'numeric',
281
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
282
+ }));
283
+ }
284
+ /**
285
+ * Canonical date + time display formatter. Use this anywhere a
286
+ * timestamp is shown to a user — table cells, cards, modals, headers —
287
+ * so every surface formats identically.
288
+ *
289
+ * The optional `locale` (a BCP-47 tag such as `'en-GB'`, `'en-US'`,
290
+ * `'de-DE'`) selects the display conventions: it drives the
291
+ * day/month/year ordering and separators — `en-GB` → `19/05/2026,
292
+ * 14:30`, `en-US` → `05/19/2026, 14:30`. It defaults to
293
+ * {@link defaultDateLocale}. The clock is always 24-hour and the
294
+ * timezone is the runtime-resolved one regardless of locale.
295
+ *
296
+ * - `Date` values format directly.
297
+ * - `string` / `number` values are parsed via `new Date(...)`. An
298
+ * unparseable string is returned unchanged (so a non-date value is
299
+ * not silently blanked); an unparseable number yields `''`.
300
+ * - `null` / `undefined` / empty string yield `''`.
301
+ *
302
+ * For a time-only render use {@link localTimeFormat}; for a date with
303
+ * no time use {@link formatDate}; for the SQL-backend serialisation
304
+ * shapes use {@link SQLFriendly} / {@link SQLFriendlyWithLocalTime}.
305
+ */
306
+ export function formatDateTime(value, locale = defaultDateLocale) {
307
+ if (value == null || value === '') {
308
+ return '';
309
+ }
310
+ // eslint-disable-next-line svelte/prefer-svelte-reactivity
311
+ const date = value instanceof Date ? value : new Date(value);
312
+ if (Number.isNaN(date.getTime())) {
313
+ return typeof value === 'string' ? value : '';
314
+ }
315
+ return dateTimeFormatterFor(locale).format(date);
316
+ }
317
+ /**
318
+ * Canonical date-only display formatter. Use this for values that carry
319
+ * no meaningful time component — due dates, expiry dates, pod-line date
320
+ * attributes — so every surface formats identically. When the value
321
+ * also has a time the user needs to see, use {@link formatDateTime}.
322
+ *
323
+ * The optional `locale` works exactly as in {@link formatDateTime} — it
324
+ * selects the day/month/year ordering and separators and defaults to
325
+ * {@link defaultDateLocale}.
326
+ *
327
+ * Parsing and null-handling match {@link formatDateTime}: a `Date`
328
+ * formats directly; `string` / `number` are parsed via `new Date(...)`;
329
+ * an unparseable string is returned unchanged; `null` / `undefined` /
330
+ * empty string yield `''`.
331
+ */
332
+ export function formatDate(value, locale = defaultDateLocale) {
333
+ if (value == null || value === '') {
334
+ return '';
335
+ }
336
+ // eslint-disable-next-line svelte/prefer-svelte-reactivity
337
+ const date = value instanceof Date ? value : new Date(value);
338
+ if (Number.isNaN(date.getTime())) {
339
+ return typeof value === 'string' ? value : '';
340
+ }
341
+ return dateFormatterFor(locale).format(date);
342
+ }
248
343
  /**
249
344
  * Barcode-scanner helper. Wire as an `onkeydown` on **buttons and
250
345
  * other non-text focusable elements** that should yield focus when a
package/dist/index.d.ts CHANGED
@@ -167,7 +167,7 @@ export { TooltipContext } from './Contexts/TooltipContext.svelte.js';
167
167
  export { UntypedInputContext } from './Contexts/UntypedInputContext.svelte.js';
168
168
  export { Delay } from './Delay/Delay.js';
169
169
  export { DATAMatrix } from './Helpers/Datamatrix.js';
170
- export { asyncAll, asyncEvery, asyncFilter, asyncFilterIndices, asyncFlatMap, asyncForEach, asyncMap, asyncSleep, asyncSome, autoPluralise, cssLength, devCatch, ellipses, generateShortUUID, generateUUID, generateWeakId, getCanvasContext, getErrorMessage, gridItem, isDateTuple, isNumericArray, isValidEmailAddress, loadingText, localTimeFormat, passthrough, refWrapper, scoriaStorageKey, SQLFriendly, SQLFriendlyWithLocalTime, vowels, } from './Helpers/Helpers.svelte.js';
170
+ export { asyncAll, asyncEvery, asyncFilter, asyncFilterIndices, asyncFlatMap, asyncForEach, asyncMap, asyncSleep, asyncSome, autoPluralise, cssLength, defaultDateLocale, devCatch, ellipses, formatDate, formatDateTime, generateShortUUID, generateUUID, generateWeakId, getCanvasContext, getErrorMessage, gridItem, isDateTuple, isNumericArray, isValidEmailAddress, loadingText, localTimeFormat, passthrough, refWrapper, scoriaStorageKey, SQLFriendly, SQLFriendlyWithLocalTime, vowels, } from './Helpers/Helpers.svelte.js';
171
171
  export { type INamed } from './Helpers/INamed.js';
172
172
  export { type PrefersReducedMotionResult, usePrefersReducedMotion, } from './Helpers/prefersReducedMotion.svelte.js';
173
173
  export { readJSON, readVersionedJSON, writeJSON } from './Helpers/Storage.js';
package/dist/index.js CHANGED
@@ -124,7 +124,7 @@ export { TooltipContext } from './Contexts/TooltipContext.svelte.js';
124
124
  export { UntypedInputContext } from './Contexts/UntypedInputContext.svelte.js';
125
125
  export { Delay } from './Delay/Delay.js';
126
126
  export { DATAMatrix } from './Helpers/Datamatrix.js';
127
- export { asyncAll, asyncEvery, asyncFilter, asyncFilterIndices, asyncFlatMap, asyncForEach, asyncMap, asyncSleep, asyncSome, autoPluralise, cssLength, devCatch, ellipses,
127
+ export { asyncAll, asyncEvery, asyncFilter, asyncFilterIndices, asyncFlatMap, asyncForEach, asyncMap, asyncSleep, asyncSome, autoPluralise, cssLength, defaultDateLocale, devCatch, ellipses, formatDate, formatDateTime,
128
128
  // eslint-disable-next-line @typescript-eslint/no-deprecated
129
129
  generateShortUUID, generateUUID, generateWeakId, getCanvasContext, getErrorMessage, gridItem, isDateTuple, isNumericArray, isValidEmailAddress, loadingText, localTimeFormat, passthrough, refWrapper, scoriaStorageKey, SQLFriendly, SQLFriendlyWithLocalTime, vowels, } from './Helpers/Helpers.svelte.js';
130
130
  export {} from './Helpers/INamed.js';
@@ -1981,6 +1981,16 @@
1981
1981
  --input-padding-right: 2.6rem;
1982
1982
  }
1983
1983
  }
1984
+
1985
+ // Select-type quick filters (MultiSelect / QuerySelect) render
1986
+ // their `.select-wrapper` root directly as a flex child here.
1987
+ // With no explicit grow it sizes to its content and leaves the
1988
+ // cell's grey background showing alongside it; stretch it to
1989
+ // fill the column the way the text / number filter inputs do.
1990
+ > :global(.select-wrapper) {
1991
+ flex: 1 1 auto;
1992
+ min-width: 0;
1993
+ }
1984
1994
  }
1985
1995
  }
1986
1996
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lavalogic/scoria",
3
3
  "description": "Svelte components used for the FloWMS Web Frontend",
4
- "version": "0.37.45",
4
+ "version": "0.37.47",
5
5
  "publishConfig": {
6
6
  "access": "restricted"
7
7
  },
@@ -22,11 +22,12 @@
22
22
  "types": "./dist/index.d.ts",
23
23
  "svelte": "./dist/index.js"
24
24
  },
25
- "./scss/*": {
26
- "sass": "./dist/scss/_*.scss",
27
- "style": "./dist/scss/_*.scss",
28
- "default": "./dist/scss/_*.scss"
29
- }
25
+ "./scss/colours": "./dist/scss/_colours.scss",
26
+ "./scss/sizing": "./dist/scss/_sizing.scss",
27
+ "./scss/mixins": "./dist/scss/_mixins.scss",
28
+ "./scss/basics": "./dist/scss/_basics.scss",
29
+ "./scss/motion": "./dist/scss/_motion.scss",
30
+ "./scss/transitions": "./dist/scss/_transitions.scss"
30
31
  },
31
32
  "peerDependencies": {
32
33
  "@sveltejs/kit": "^2.57.1",