milk-lib 0.0.10 → 0.0.12

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.
@@ -0,0 +1,61 @@
1
+ <script lang="ts">
2
+ import type { IBadgeProps } from './Badge.types';
3
+
4
+ let {
5
+ variant="default",
6
+ shape="straight",
7
+ ref=$bindable(null),
8
+ children,
9
+ href,
10
+ ...restProps
11
+ } : IBadgeProps = $props();
12
+
13
+ </script>
14
+
15
+ <svelte:element
16
+ this={href ? 'a' : 'span'}
17
+ {href}
18
+ bind:this={ref}
19
+ class={`Badge Badge-${variant} Badge-${shape}`}
20
+ {...restProps}
21
+ >
22
+ {@render children()}
23
+ </svelte:element>
24
+
25
+ <style>.Badge {
26
+ font-size: 12px;
27
+ line-height: 100%;
28
+ padding: 4px 8px;
29
+ background: var(--bg-base-100);
30
+ display: inline-flex;
31
+ align-items: center;
32
+ border: 1px solid transparent;
33
+ text-decoration: none;
34
+ color: inherit;
35
+ }
36
+ .Badge.Badge-primary {
37
+ background-color: var(--bg-primary-emp-100);
38
+ color: var(--text-base-main);
39
+ }
40
+ .Badge.Badge-secondary {
41
+ background-color: var(--bg-base-emp-100);
42
+ color: var(--text-base-inv);
43
+ }
44
+ .Badge.Badge-outline {
45
+ background-color: white;
46
+ border-color: var(--line-base);
47
+ }
48
+ .Badge.Badge-danger {
49
+ background-color: var(--bg-danger-emp-100);
50
+ color: var(--text-base-inv);
51
+ }
52
+ .Badge.Badge-warning {
53
+ background-color: var(--bg-danger-100);
54
+ color: var(--text-danger-main);
55
+ }
56
+ .Badge.Badge-rounded {
57
+ border-radius: 6px;
58
+ }
59
+ .Badge.Badge-circled {
60
+ border-radius: 20px;
61
+ }</style>
@@ -0,0 +1,4 @@
1
+ import type { IBadgeProps } from './Badge.types';
2
+ declare const Badge: import("svelte").Component<IBadgeProps, {}, "ref">;
3
+ type Badge = ReturnType<typeof Badge>;
4
+ export default Badge;
@@ -0,0 +1,10 @@
1
+ import type { Snippet } from "svelte";
2
+ export type BadgeVariant = 'default' | 'primary' | 'secondary' | 'warning' | 'danger' | 'outline';
3
+ export type BadgeShape = 'rounded' | 'circled' | 'straight';
4
+ export interface IBadgeProps {
5
+ children: Snippet;
6
+ variant?: BadgeVariant;
7
+ shape?: BadgeShape;
8
+ href?: string;
9
+ ref?: HTMLAnchorElement | HTMLSpanElement | null;
10
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export { default as Badge } from './Badge.svelte';
@@ -0,0 +1 @@
1
+ export { default as Badge } from './Badge.svelte';
@@ -0,0 +1,21 @@
1
+ <script lang="ts">
2
+ import type { ILabelProps } from './Label.types';
3
+ let { forValue, children, ...rest }: ILabelProps = $props();
4
+ </script>
5
+
6
+ <label class="Label" for={forValue} {...rest}>
7
+ {@render children?.()}
8
+ </label>
9
+
10
+ <style>.Label {
11
+ --font-size: 14px;
12
+ --line-height: 20px;
13
+ --margin-bottom: .25rem;
14
+ }
15
+
16
+ .Label {
17
+ display: block;
18
+ font-size: var(--font-size);
19
+ line-height: var(--line-height);
20
+ margin-bottom: var(--margin-bottom);
21
+ }</style>
@@ -0,0 +1,4 @@
1
+ import type { ILabelProps } from './Label.types';
2
+ declare const Label: import("svelte").Component<ILabelProps, {}, "">;
3
+ type Label = ReturnType<typeof Label>;
4
+ export default Label;
@@ -0,0 +1,5 @@
1
+ import type { Snippet } from 'svelte';
2
+ export interface ILabelProps {
3
+ forValue?: string;
4
+ children?: Snippet;
5
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export { default as Label } from './Label.svelte';
2
+ export * from './Label.types';
@@ -0,0 +1,2 @@
1
+ export { default as Label } from './Label.svelte';
2
+ export * from './Label.types';
@@ -8,9 +8,11 @@
8
8
  <style>
9
9
  .SidebarGroupTitle {
10
10
  font-size: 14px;
11
+ line-height: 20px;
11
12
  color: var(--text-base-main);
12
13
  font-weight: 500;
13
- margin-top: 1.5rem;
14
14
  list-style: none;
15
+ margin-top: 1.5rem;
16
+ margin-bottom: .5rem;
15
17
  }
16
18
  </style>
@@ -17,7 +17,11 @@
17
17
 
18
18
  .SidebarLink {
19
19
  font-size: 14px;
20
- color: var(--text-base-muted);
20
+ line-height: 20px;
21
+ color: var(--text-base-placeholder);
22
+ text-decoration: none;
23
+ display: block;
24
+ margin-bottom: .5rem;
21
25
  }
22
26
 
23
27
  .SidebarLink:hover {
@@ -0,0 +1,166 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import type { ITextInputProps } from './TextInput.types';
4
+
5
+ let {
6
+ onKeyDown,
7
+ onKeyUp,
8
+ onFocus,
9
+ onBlur,
10
+ onChange,
11
+ onClick,
12
+ placeholder,
13
+ type = 'text',
14
+ disabled = false,
15
+ readonly = false,
16
+ name,
17
+ id,
18
+ value = $bindable(),
19
+ invalid,
20
+ style,
21
+ classNames='',
22
+ autoFocus,
23
+ ariaHasPopup,
24
+ ariaExpanded,
25
+ ariaControls,
26
+ ...rest
27
+ }: ITextInputProps = $props();
28
+
29
+ let inputEl: HTMLInputElement;
30
+ export const focus = () => inputEl?.focus();
31
+
32
+ onMount(() => {
33
+ if (autoFocus && inputEl) {
34
+ // Wrapped to setTimeout to correctly autoFocus in modal and conditional rendering
35
+ setTimeout(() => {
36
+ inputEl.focus();
37
+ });
38
+
39
+ }
40
+ })
41
+
42
+ </script>
43
+
44
+ <input
45
+ bind:this={inputEl}
46
+ bind:value
47
+ class={`TextInput ${invalid ? 'invalid' : ''} ${classNames}`}
48
+ onfocus={onFocus}
49
+ onblur={onBlur}
50
+ onkeydown={onKeyDown}
51
+ onkeyup={onKeyUp}
52
+ onchange={onChange}
53
+ onclick={onClick}
54
+ {type}
55
+ {placeholder}
56
+ {disabled}
57
+ {readonly}
58
+ {name}
59
+ {id}
60
+ {style}
61
+ aria-haspopup={ariaHasPopup}
62
+ aria-expanded={ariaExpanded}
63
+ aria-controls={ariaControls}
64
+ {...rest}
65
+ />
66
+
67
+ <style>.TextInput {
68
+ --transition: border-color .25s ease-in-out;
69
+ --padding-y: 7px;
70
+ --padding-x: 12px;
71
+ --font-size: 16px;
72
+ --line-height: 1.5;
73
+ --border-radius: 8px;
74
+ --border-style: solid;
75
+ --border-width: var(--stroke-base);
76
+ --border-top-width: var(--border-width);
77
+ --border-bottom-width: var(--border-width);
78
+ --border-left-width: var(--border-width);
79
+ --border-right-width: var(--border-width);
80
+ --focus-shadow: var(--line-base-emp);
81
+ --text-color: var(--text-base-main);
82
+ --background-color: var(--bg-base);
83
+ --border-color: var(--line-control-100);
84
+ --border-color-focus: var(--line-base-emp);
85
+ --background-disabled: var(--bg-base-100);
86
+ --border-color-disabled: var(--line-base);
87
+ --opacity-disabled: 0.8;
88
+ --border-style-disabled: var(--border-style);
89
+ --border-width-disabled: var(--border-width);
90
+ --border-top-width-disabled: var(--border-width-disabled);
91
+ --border-bottom-width-disabled: var(--border-width-disabled);
92
+ --border-left-width-disabled: var(--border-width-disabled);
93
+ --border-right-width-disabled: var(--border-width-disabled);
94
+ --background-readonly: var(--background-color);
95
+ --border-color-readonly: var(--border-color);
96
+ --opacity-readonly: 1;
97
+ --border-style-readonly: var(--border-style);
98
+ --border-width-readonly: var(--border-width);
99
+ --border-top-width-readonly: var(--border-width);
100
+ --border-bottom-width-readonly: var(--border-width);
101
+ --border-left-width-readonly: var(--border-width);
102
+ --border-right-width-readonly: var(--border-width);
103
+ --border-color-invalid: #EA6D60;
104
+ --background-invalid: var(--background-disabled);
105
+ --border-style-invalid: var(--border-style);
106
+ --border-width-invalid: var(--border-width);
107
+ --border-top-width-invalid: var(--border-width);
108
+ --border-bottom-width-invalid: var(--border-width);
109
+ --border-left-width-invalid: var(--border-width);
110
+ --border-right-width-invalid: var(--border-width);
111
+ }
112
+
113
+ .TextInput {
114
+ box-sizing: border-box;
115
+ background: var(--background-color);
116
+ border-radius: var(--border-radius);
117
+ font-size: var(--font-size);
118
+ line-height: var(--line-height);
119
+ padding: var(--padding-y) var(--padding-x);
120
+ width: 100%;
121
+ display: block;
122
+ position: relative;
123
+ border: var(--border-width) var(--border-style) var(--border-color);
124
+ border-top-width: var(--border-top-width);
125
+ border-bottom-width: var(--border-bottom-width);
126
+ border-right-width: var(--border-right-width);
127
+ border-left-width: var(--border-left-width);
128
+ transition: var(--transition);
129
+ }
130
+ .TextInput:focus {
131
+ border-color: var(--border-color-focus);
132
+ outline: none;
133
+ box-shadow: none;
134
+ }
135
+ .TextInput:focus:read-only {
136
+ border-color: var(--border-color-focus);
137
+ }
138
+ .TextInput::placeholder {
139
+ color: var(--text-base-placeholder);
140
+ }
141
+ .TextInput:read-only {
142
+ background: var(--background-readonly);
143
+ opacity: var(--opacity-readonly);
144
+ border: var(--border-width-readonly) var(--border-style-readonly) var(--border-color-readonly);
145
+ border-top-width: var(--border-top-width-readonly);
146
+ border-bottom-width: var(--border-bottom-width-readonly);
147
+ border-right-width: var(--border-right-width-readonly);
148
+ border-left-width: var(--border-left-width-readonly);
149
+ }
150
+ .TextInput:disabled {
151
+ background: var(--background-disabled);
152
+ opacity: var(--opacity-disabled);
153
+ border: var(--border-width-disabled) var(--border-style-disabled) var(--border-color-disabled);
154
+ border-top-width: var(--border-top-width-disabled);
155
+ border-bottom-width: var(--border-bottom-width-disabled);
156
+ border-right-width: var(--border-right-width-disabled);
157
+ border-left-width: var(--border-left-width-disabled);
158
+ }
159
+ .TextInput.invalid {
160
+ border-color: var(--border-color-invalid);
161
+ border: var(--border-width-invalid) var(--border-style-invalid) var(--border-color-invalid);
162
+ border-top-width: var(--border-top-width-invalid);
163
+ border-bottom-width: var(--border-bottom-width-invalid);
164
+ border-right-width: var(--border-right-width-invalid);
165
+ border-left-width: var(--border-left-width-invalid);
166
+ }</style>
@@ -0,0 +1,6 @@
1
+ import type { ITextInputProps } from './TextInput.types';
2
+ declare const TextInput: import("svelte").Component<ITextInputProps, {
3
+ focus: () => void;
4
+ }, "value">;
5
+ type TextInput = ReturnType<typeof TextInput>;
6
+ export default TextInput;
@@ -0,0 +1,33 @@
1
+ import type { Snippet } from "svelte";
2
+ import type { ChangeEventHandler, FocusEventHandler, KeyboardEventHandler, MouseEventHandler } from "svelte/elements";
3
+ export type TextInputType = "text" | "password";
4
+ export type TextInputInstance = {
5
+ focus: () => void;
6
+ };
7
+ export interface ITextInputProps {
8
+ value?: string;
9
+ onKeyDown?: KeyboardEventHandler<HTMLInputElement>;
10
+ onKeyUp?: KeyboardEventHandler<HTMLInputElement>;
11
+ onFocus?: FocusEventHandler<HTMLInputElement>;
12
+ onBlur?: FocusEventHandler<HTMLInputElement>;
13
+ onChange?: ChangeEventHandler<HTMLInputElement>;
14
+ onClick?: MouseEventHandler<HTMLInputElement>;
15
+ placeholder?: string;
16
+ type?: TextInputType;
17
+ disabled?: boolean;
18
+ readonly?: boolean;
19
+ name?: string;
20
+ id?: string;
21
+ invalid?: boolean;
22
+ style?: string;
23
+ classNames?: string;
24
+ autoFocus?: boolean;
25
+ ariaHasPopup?: "dialog" | "menu" | "listbox" | "tree" | "grid" | null | undefined;
26
+ ariaExpanded?: boolean;
27
+ ariaControls?: string;
28
+ }
29
+ export type ITextInputMessageVariant = 'default' | 'error';
30
+ export interface ITextInputMessageProps {
31
+ variant?: ITextInputMessageVariant;
32
+ children: Snippet;
33
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ <script lang="ts">
2
+ import { type ITextInputMessageProps } from './TextInput.types';
3
+ let { children, variant='default' } : ITextInputMessageProps = $props();
4
+ </script>
5
+
6
+ <div class={`TextInputMessage ${variant}`}>
7
+ {@render children()}
8
+ </div>
9
+
10
+ <style>.TextInputMessage {
11
+ padding-top: 0.5rem;
12
+ color: var(--text-base-muted);
13
+ }
14
+ .TextInputMessage.default {
15
+ color: var(--text-base-muted);
16
+ }
17
+ .TextInputMessage.error {
18
+ color: var(--text-danger-main);
19
+ }</style>
@@ -0,0 +1,4 @@
1
+ import { type ITextInputMessageProps } from './TextInput.types';
2
+ declare const TextInputMessage: import("svelte").Component<ITextInputMessageProps, {}, "">;
3
+ type TextInputMessage = ReturnType<typeof TextInputMessage>;
4
+ export default TextInputMessage;
@@ -0,0 +1,3 @@
1
+ export { default as TextInput } from './TextInput.svelte';
2
+ export { default as TextInputMessage } from './TextInputMessage.svelte';
3
+ export * from './TextInput.types';
@@ -0,0 +1,3 @@
1
+ export { default as TextInput } from './TextInput.svelte';
2
+ export { default as TextInputMessage } from './TextInputMessage.svelte';
3
+ export * from './TextInput.types';
@@ -68,7 +68,8 @@ export const themeDefault = {
68
68
  '--border-radius-button': '8',
69
69
  '--border-radius-panel': '12',
70
70
  '--border-radius-window': '20',
71
- '--stroke-button': '1',
71
+ '--stroke-base': '1px',
72
+ '--stroke-button': 'var(--stroke-base)',
72
73
  '--spacing-xs-1': '4',
73
74
  '--spacing-xs-1-5': '6',
74
75
  '--spacing-sm-2': '8',
@@ -68,6 +68,7 @@ export interface ITheme {
68
68
  '--border-radius-button': string;
69
69
  '--border-radius-panel': string;
70
70
  '--border-radius-window': string;
71
+ '--stroke-base': string;
71
72
  '--stroke-button': string;
72
73
  '--spacing-xs-1': string;
73
74
  '--spacing-xs-1-5': string;
@@ -5,3 +5,6 @@ export * from './Sidebar';
5
5
  export * from './ThemeProvider';
6
6
  export * from './Button';
7
7
  export * from './ButtonMilk';
8
+ export * from './Badge';
9
+ export * from './TextInput';
10
+ export * from './Label';
@@ -5,3 +5,6 @@ export * from './Sidebar';
5
5
  export * from './ThemeProvider';
6
6
  export * from './Button';
7
7
  export * from './ButtonMilk';
8
+ export * from './Badge';
9
+ export * from './TextInput';
10
+ export * from './Label';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "milk-lib",
3
3
  "license": "MIT",
4
- "version": "0.0.10",
4
+ "version": "0.0.12",
5
5
  "scripts": {
6
6
  "dev": "vite dev",
7
7
  "build": "vite build && npm run prepack",