@lavalogic/scoria 0.4.4 → 0.4.5

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.
@@ -9,6 +9,7 @@
9
9
  children?: Snippet;
10
10
  maxHeight?: number;
11
11
  grow?: boolean;
12
+ isCollapsed?: boolean;
12
13
  }
13
14
  </script>
14
15
 
@@ -17,9 +18,14 @@
17
18
  import { Size } from '../Types/Internal/Size.js';
18
19
  import { Colour } from '../scss/colours.js';
19
20
 
20
- let { title, subtitle, maxHeight: maxHeight, children, grow }: CollapsibleCard = $props();
21
-
22
- let isCollapsed = $state(false);
21
+ let {
22
+ title,
23
+ subtitle,
24
+ maxHeight: maxHeight,
25
+ children,
26
+ grow,
27
+ isCollapsed = $bindable(false)
28
+ }: CollapsibleCard = $props();
23
29
 
24
30
  let cardRef: HTMLDivElement | undefined = $state();
25
31
 
@@ -5,6 +5,7 @@ export interface CollapsibleCard {
5
5
  children?: Snippet;
6
6
  maxHeight?: number;
7
7
  grow?: boolean;
8
+ isCollapsed?: boolean;
8
9
  }
9
10
  declare const CollapsibleCard: any;
10
11
  type CollapsibleCard = ReturnType<typeof CollapsibleCard>;
@@ -57,7 +57,7 @@
57
57
 
58
58
  <style>article {
59
59
  font-weight: 700;
60
- font-size: 1.12rem;
60
+ font-size: 1.125rem;
61
61
  padding: 0.75rem;
62
62
  border-radius: 4px;
63
63
  }
@@ -1,5 +1,5 @@
1
- export interface ColumnFilter {
1
+ export interface ColumnFilter<T = unknown> {
2
2
  id: string;
3
- value: unknown;
3
+ value: T;
4
4
  }
5
5
  export type ColumnFiltersState = ColumnFilter[];
@@ -174,7 +174,7 @@ button.card .value {
174
174
  padding: 0.375rem;
175
175
  }
176
176
  button.card .value.small {
177
- font-size: 1.16rem;
177
+ font-size: 1.1875rem;
178
178
  font-weight: 600;
179
179
  padding: 0;
180
180
  }</style>
@@ -284,7 +284,7 @@ button.summary-card h3 {
284
284
  }
285
285
 
286
286
  .card-detail {
287
- font-size: 1.12rem;
287
+ font-size: 1.125rem;
288
288
  font-weight: 600;
289
289
  background-color: #f4f7f9;
290
290
  color: #3a4952;
@@ -301,7 +301,7 @@ button.summary-card h3 {
301
301
  cursor: unset;
302
302
  }
303
303
  .card-detail.uom {
304
- font-size: 1.08rem;
304
+ font-size: 1.0625rem;
305
305
  color: #647d8e;
306
306
  --colour: #8096a5;
307
307
  text-transform: uppercase;
@@ -336,7 +336,7 @@ button.summary-card h3 {
336
336
  }
337
337
  .card-detail.optional {
338
338
  justify-content: end;
339
- font-size: 1.08rem;
339
+ font-size: 1.0625rem;
340
340
  display: none;
341
341
  line-height: 1.5;
342
342
  }
@@ -120,7 +120,7 @@
120
120
  display: flex;
121
121
  align-items: center;
122
122
  position: relative;
123
- font-size: 1.12rem;
123
+ font-size: 1.125rem;
124
124
  font-weight: 600;
125
125
  }
126
126
  button.left, button.right {
@@ -25,4 +25,5 @@ interface IErrorResponse {
25
25
  export declare function isErrorResponse(error: unknown): error is IErrorResponse;
26
26
  export declare function getErrorMessage(error: unknown, includeUUID?: boolean): string;
27
27
  export declare function isValidEmailAddress(emailAddress: string): RegExpMatchArray | null;
28
+ export declare function gridItem(element: HTMLElement): (() => void) | undefined;
28
29
  export {};
@@ -1,3 +1,4 @@
1
+ import { Sizing } from '../scss/sizing.js';
1
2
  export function autoPluralise(text, quantity = 2, { capitalise = false } = {}) {
2
3
  if (quantity === 1) {
3
4
  return text;
@@ -146,3 +147,22 @@ export function isValidEmailAddress(emailAddress) {
146
147
  .toLowerCase()
147
148
  .match(/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/);
148
149
  }
150
+ export function gridItem(element) {
151
+ const firstChild = element.firstElementChild;
152
+ if (!firstChild) {
153
+ return;
154
+ }
155
+ let height = $state(0);
156
+ let spanHeight = $derived.by(() => {
157
+ element.classList.values().filter((it) => it.startsWith('col-'));
158
+ return Math.ceil((height + Sizing['$regular-gap']) / 4);
159
+ });
160
+ $effect(() => {
161
+ element.style.gridRow = spanHeight ? `span ${spanHeight}` : '';
162
+ });
163
+ const observer = new ResizeObserver((entries) => {
164
+ height = entries[0].borderBoxSize[0].blockSize;
165
+ });
166
+ observer.observe(firstChild);
167
+ return () => observer.unobserve(firstChild);
168
+ }
@@ -2781,3 +2781,231 @@
2781
2781
  background-color: rgba(0, 0, 0, 0.2);
2782
2782
  }
2783
2783
  }
2784
+
2785
+ @mixin grid {
2786
+ //taken from https://medium.com/@genildocs/the-12-column-grid-system-why-it-still-matters-in-the-css-grid-era-855eb835e038
2787
+ //adapted with https://css-tricks.com/piecing-together-approaches-for-a-css-masonry-layout/#aa-is-vertical-order-with-ragged-bottoms-ok
2788
+
2789
+ .grid {
2790
+ display: grid;
2791
+ grid-template-columns: repeat(12, 1fr);
2792
+ grid-auto-rows: 4px;
2793
+ width: 100%;
2794
+
2795
+ column-gap: sizing.$regular-gap;
2796
+ padding: sizing.$regular-padding;
2797
+ box-sizing: border-box;
2798
+ }
2799
+
2800
+ .nested-grid {
2801
+ display: grid;
2802
+ grid-template-columns: repeat(12, 1fr);
2803
+ gap: sizing.$regular-gap;
2804
+ }
2805
+
2806
+ /* Responsive adjustments */
2807
+ @media (max-width: 768px) {
2808
+ .grid {
2809
+ grid-template-columns: 1fr;
2810
+ gap: sizing.$two-thirds-gap;
2811
+ padding: sizing.$two-thirds-padding;
2812
+ }
2813
+ }
2814
+
2815
+ @media (max-width: 480px) {
2816
+ .grid {
2817
+ padding: sizing.$half-gap;
2818
+ gap: sizing.$half-padding;
2819
+ }
2820
+ }
2821
+
2822
+ /* Column spanning utilities */
2823
+ .col-1 {
2824
+ grid-column: span 1;
2825
+ }
2826
+ .col-2 {
2827
+ grid-column: span 2;
2828
+ }
2829
+ .col-3 {
2830
+ grid-column: span 3;
2831
+ }
2832
+ .col-4 {
2833
+ grid-column: span 4;
2834
+ }
2835
+ .col-5 {
2836
+ grid-column: span 5;
2837
+ }
2838
+ .col-6 {
2839
+ grid-column: span 6;
2840
+ }
2841
+ .col-7 {
2842
+ grid-column: span 7;
2843
+ }
2844
+ .col-8 {
2845
+ grid-column: span 8;
2846
+ }
2847
+ .col-9 {
2848
+ grid-column: span 9;
2849
+ }
2850
+ .col-10 {
2851
+ grid-column: span 10;
2852
+ }
2853
+ .col-11 {
2854
+ grid-column: span 11;
2855
+ }
2856
+ .col-12 {
2857
+ grid-column: span 12;
2858
+ }
2859
+
2860
+ /* Mobile-first responsive utilities */
2861
+ @media (min-width: 769px) {
2862
+ .md-col-1 {
2863
+ grid-column: span 1;
2864
+ }
2865
+ .md-col-2 {
2866
+ grid-column: span 2;
2867
+ }
2868
+ .md-col-3 {
2869
+ grid-column: span 3;
2870
+ }
2871
+ .md-col-4 {
2872
+ grid-column: span 4;
2873
+ }
2874
+ .md-col-5 {
2875
+ grid-column: span 5;
2876
+ }
2877
+ .md-col-6 {
2878
+ grid-column: span 6;
2879
+ }
2880
+ .md-col-7 {
2881
+ grid-column: span 7;
2882
+ }
2883
+ .md-col-8 {
2884
+ grid-column: span 8;
2885
+ }
2886
+ .md-col-9 {
2887
+ grid-column: span 9;
2888
+ }
2889
+ .md-col-10 {
2890
+ grid-column: span 10;
2891
+ }
2892
+ .md-col-11 {
2893
+ grid-column: span 11;
2894
+ }
2895
+ .md-col-12 {
2896
+ grid-column: span 12;
2897
+ }
2898
+ }
2899
+
2900
+ @media (min-width: 1024px) {
2901
+ .lg-col-1 {
2902
+ grid-column: span 1;
2903
+ }
2904
+ .lg-col-2 {
2905
+ grid-column: span 2;
2906
+ }
2907
+ .lg-col-3 {
2908
+ grid-column: span 3;
2909
+ }
2910
+ .lg-col-4 {
2911
+ grid-column: span 4;
2912
+ }
2913
+ .lg-col-5 {
2914
+ grid-column: span 5;
2915
+ }
2916
+ .lg-col-6 {
2917
+ grid-column: span 6;
2918
+ }
2919
+ .lg-col-7 {
2920
+ grid-column: span 7;
2921
+ }
2922
+ .lg-col-8 {
2923
+ grid-column: span 8;
2924
+ }
2925
+ .lg-col-9 {
2926
+ grid-column: span 9;
2927
+ }
2928
+ .lg-col-10 {
2929
+ grid-column: span 10;
2930
+ }
2931
+ .lg-col-11 {
2932
+ grid-column: span 11;
2933
+ }
2934
+ .lg-col-12 {
2935
+ grid-column: span 12;
2936
+ }
2937
+ }
2938
+
2939
+ /* Column start utilities */
2940
+ .col-start-1 {
2941
+ grid-column-start: 1;
2942
+ }
2943
+ .col-start-2 {
2944
+ grid-column-start: 2;
2945
+ }
2946
+ .col-start-3 {
2947
+ grid-column-start: 3;
2948
+ }
2949
+ .col-start-4 {
2950
+ grid-column-start: 4;
2951
+ }
2952
+ .col-start-5 {
2953
+ grid-column-start: 5;
2954
+ }
2955
+ .col-start-6 {
2956
+ grid-column-start: 6;
2957
+ }
2958
+ .col-start-7 {
2959
+ grid-column-start: 7;
2960
+ }
2961
+ .col-start-8 {
2962
+ grid-column-start: 8;
2963
+ }
2964
+ .col-start-9 {
2965
+ grid-column-start: 9;
2966
+ }
2967
+ .col-start-10 {
2968
+ grid-column-start: 10;
2969
+ }
2970
+ .col-start-11 {
2971
+ grid-column-start: 11;
2972
+ }
2973
+ .col-start-12 {
2974
+ grid-column-start: 12;
2975
+ }
2976
+
2977
+ /* Offset utilities (alternative approach) */
2978
+ .offset-1 {
2979
+ grid-column-start: 2;
2980
+ }
2981
+ .offset-2 {
2982
+ grid-column-start: 3;
2983
+ }
2984
+ .offset-3 {
2985
+ grid-column-start: 4;
2986
+ }
2987
+ .offset-4 {
2988
+ grid-column-start: 5;
2989
+ }
2990
+ .offset-5 {
2991
+ grid-column-start: 6;
2992
+ }
2993
+ .offset-6 {
2994
+ grid-column-start: 7;
2995
+ }
2996
+ .offset-7 {
2997
+ grid-column-start: 8;
2998
+ }
2999
+ .offset-8 {
3000
+ grid-column-start: 9;
3001
+ }
3002
+ .offset-9 {
3003
+ grid-column-start: 10;
3004
+ }
3005
+ .offset-10 {
3006
+ grid-column-start: 11;
3007
+ }
3008
+ .offset-11 {
3009
+ grid-column-start: 12;
3010
+ }
3011
+ }
@@ -1,25 +1,22 @@
1
1
  $input-height: 3rem;
2
2
  $input-width: 12rem;
3
- // $input-width: 18.75rem;
4
- // $input-width: 26rem;
5
3
 
6
4
  $text-xx-large: 2rem;
7
5
  $text-x-large: 1.75rem;
8
6
  $text-large: 1.5rem;
9
7
  $text-medium-large: 1.25rem;
10
- $text-medium: 1.16rem;
11
- $text-small-medium: 1.12rem;
12
- $text-medium-small-medium: 1.08rem;
8
+ $text-medium: 1.1875rem; //19 px. not ideal
9
+ $text-small-medium: 1.125rem;
10
+ $text-medium-small-medium: 1.0625rem;
13
11
  $text-regular: 1rem;
14
12
  $text-small-small-medium: 0.875rem;
15
- // $text-small: 0.84rem;
16
13
  $text-small: 0.8125rem;
17
14
  $text-extra-small: 0.75rem;
18
15
 
19
16
  $font-weight-touch: 600;
20
17
 
21
- $text-table: 0.95rem;
22
- $text-table-footer: 0.8rem;
18
+ $text-table: 0.9375rem;
19
+ $text-table-footer: 0.8125rem;
23
20
 
24
21
  $border-width-double: 2px;
25
22
  $border-width: 1px;
@@ -0,0 +1,46 @@
1
+ export declare const Sizing: {
2
+ '$input-height': number;
3
+ '$input-width': number;
4
+ '$text-xx-large': number;
5
+ '$text-x-large': number;
6
+ '$text-large': number;
7
+ '$text-medium-large': number;
8
+ '$text-medium': number;
9
+ '$text-small-medium': number;
10
+ '$text-medium-small-medium': number;
11
+ '$text-regular': number;
12
+ '$text-small-small-medium': number;
13
+ '$text-small': number;
14
+ '$text-extra-small': number;
15
+ '$text-table': number;
16
+ '$text-table-footer': number;
17
+ '$border-width-double': number;
18
+ '$border-width': number;
19
+ '$button-padding-xl': number;
20
+ '$button-padding-lg': number;
21
+ '$column-1-width': number;
22
+ '$column-3-width': number;
23
+ '$row-1-width': number;
24
+ '$double-padding': number;
25
+ '$double-gap': number;
26
+ '$five-quarters-padding': number;
27
+ '$five-quarters-gap': number;
28
+ '$regular-padding': number;
29
+ '$regular-gap': number;
30
+ '$two-thirds-gap': number;
31
+ '$two-thirds-padding': number;
32
+ '$half-gap': number;
33
+ '$half-padding': number;
34
+ '$third-gap': number;
35
+ '$third-padding': number;
36
+ '$quarter-gap': number;
37
+ '$quarter-padding': number;
38
+ '$button-card-inner-gap': number;
39
+ '$border-radius': number;
40
+ '$thick-border-radius': number;
41
+ '$min-modal-width': number;
42
+ '$max-modal-width': number;
43
+ '$table-header-height': number;
44
+ '$nav-height': number;
45
+ };
46
+ export type Sizing = (typeof Sizing)[keyof typeof Sizing];
@@ -0,0 +1,62 @@
1
+ //HACK manually created copy of the scss values IN PIXELS
2
+ // assumed font size is 16 for rem-px conversions
3
+ // If the values get updated on one side
4
+ // they MUST be manually updated on the other side too
5
+ export const Sizing = {
6
+ '$input-height': 48,
7
+ '$input-width': 192,
8
+ '$text-xx-large': 32,
9
+ '$text-x-large': 28,
10
+ '$text-large': 24,
11
+ '$text-medium-large': 20,
12
+ '$text-medium': 19,
13
+ '$text-small-medium': 18,
14
+ '$text-medium-small-medium': 17,
15
+ '$text-regular': 16,
16
+ '$text-small-small-medium': 14,
17
+ '$text-small': 13,
18
+ '$text-extra-small': 12,
19
+ // '$font-weight-touch': '600', //unrepresentable
20
+ '$text-table': 15,
21
+ '$text-table-footer': 13,
22
+ '$border-width-double': 2,
23
+ '$border-width': 1,
24
+ '$button-padding-xl': 32,
25
+ // '$button-padding-lg-wide': '1rem 2rem', //unrepresentable
26
+ '$button-padding-lg': 16,
27
+ '$column-1-width': 400,
28
+ // '$column-2-width': '1fr', //unrepresentable
29
+ '$column-3-width': 400,
30
+ '$row-1-width': 64,
31
+ // '$row-2-width': '1fr',//unrepresentable
32
+ '$double-padding': 48,
33
+ '$double-gap': 48,
34
+ '$five-quarters-padding': 30,
35
+ '$five-quarters-gap': 30,
36
+ '$regular-padding': 24,
37
+ '$regular-gap': 24,
38
+ '$two-thirds-gap': 20,
39
+ '$two-thirds-padding': 20,
40
+ '$half-gap': 12,
41
+ '$half-padding': 12,
42
+ '$third-gap': 8,
43
+ '$third-padding': 8,
44
+ '$quarter-gap': 6,
45
+ '$quarter-padding': 6,
46
+ // '$circular-button-padding': '0.52rem',
47
+ // '$card-half-padding': '0.38rem',
48
+ // '$card-padding': '0.76rem',
49
+ // '$card-gap': '0.76rem',
50
+ // '$card-gap-half': '0.38rem',
51
+ // '$card-detail-padding': '4px 12px',
52
+ // '$card-title': '$text-large',
53
+ // '$card-inner-gap': '0.25rem',
54
+ '$button-card-inner-gap': 8,
55
+ '$border-radius': 4,
56
+ '$thick-border-radius': 5,
57
+ '$min-modal-width': 644,
58
+ '$max-modal-width': 1728,
59
+ '$table-header-height': 48,
60
+ '$nav-height': 52
61
+ };
62
+ Object.freeze(Sizing);
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.4.4",
4
+ "version": "0.4.5",
5
5
  "publishConfig": {
6
6
  "access": "restricted"
7
7
  },