@humandialog/forms.svelte 0.4.12 → 0.4.13

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,16 @@
1
+
2
+ <script>
3
+ export let href = "/";
4
+ export let img = "";
5
+
6
+ </script>
7
+
8
+ <a href={href} class="flex items-center pl-2.5 mb-5">
9
+ {#if img}
10
+ <img src={img} class="h-6 mr-3 sm:h-7" alt="" />
11
+ {/if}
12
+
13
+ <span class="self-center text-2xl font-semibold whitespace-nowrap dark:text-white">
14
+ <slot/>
15
+ </span>
16
+ </a>
@@ -0,0 +1,29 @@
1
+ /** @typedef {typeof __propDef.props} SidebarProps */
2
+ /** @typedef {typeof __propDef.events} SidebarEvents */
3
+ /** @typedef {typeof __propDef.slots} SidebarSlots */
4
+ export default class Sidebar extends SvelteComponentTyped<{
5
+ img?: string | undefined;
6
+ href?: string | undefined;
7
+ }, {
8
+ [evt: string]: CustomEvent<any>;
9
+ }, {
10
+ default: {};
11
+ }> {
12
+ }
13
+ export type SidebarProps = typeof __propDef.props;
14
+ export type SidebarEvents = typeof __propDef.events;
15
+ export type SidebarSlots = typeof __propDef.slots;
16
+ import { SvelteComponentTyped } from "svelte";
17
+ declare const __propDef: {
18
+ props: {
19
+ img?: string | undefined;
20
+ href?: string | undefined;
21
+ };
22
+ events: {
23
+ [evt: string]: CustomEvent<any>;
24
+ };
25
+ slots: {
26
+ default: {};
27
+ };
28
+ };
29
+ export {};
@@ -0,0 +1,21 @@
1
+ <script>
2
+ import Icon from '../icon.svelte'
3
+ import Edit from '../edit.field.svelte'
4
+ import {FaPlus} from 'svelte-icons/fa'
5
+
6
+ export let border = false;
7
+ export let inserter = undefined;
8
+ export let inserter_placeholder = 'New'
9
+
10
+ let border_class = border ? " pt-4 mt-4 border-t border-gray-200 dark:border-gray-700" : ""
11
+ </script>
12
+
13
+ <ul class="space-y-2 {border_class}">
14
+ <slot/>
15
+
16
+ {#if inserter}
17
+ <Edit class="p-2 text-base font-normal text-gray-500 rounded-lg dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700" on_enter={inserter} placeholder={inserter_placeholder} inserter={true}>
18
+ <Icon size={5} component={FaPlus} class="mr-3"/>
19
+ </Edit>
20
+ {/if}
21
+ </ul>
@@ -0,0 +1,31 @@
1
+ /** @typedef {typeof __propDef.props} SidebarProps */
2
+ /** @typedef {typeof __propDef.events} SidebarEvents */
3
+ /** @typedef {typeof __propDef.slots} SidebarSlots */
4
+ export default class Sidebar extends SvelteComponentTyped<{
5
+ inserter?: any;
6
+ border?: boolean | undefined;
7
+ inserter_placeholder?: string | undefined;
8
+ }, {
9
+ [evt: string]: CustomEvent<any>;
10
+ }, {
11
+ default: {};
12
+ }> {
13
+ }
14
+ export type SidebarProps = typeof __propDef.props;
15
+ export type SidebarEvents = typeof __propDef.events;
16
+ export type SidebarSlots = typeof __propDef.slots;
17
+ import { SvelteComponentTyped } from "svelte";
18
+ declare const __propDef: {
19
+ props: {
20
+ inserter?: any;
21
+ border?: boolean | undefined;
22
+ inserter_placeholder?: string | undefined;
23
+ };
24
+ events: {
25
+ [evt: string]: CustomEvent<any>;
26
+ };
27
+ slots: {
28
+ default: {};
29
+ };
30
+ };
31
+ export {};
@@ -0,0 +1,60 @@
1
+ <script>import Icon from "../icon.svelte";
2
+ import { context_items_store, auto_hide_sidebar } from "../../stores";
3
+ import {
4
+ selectable as _selectable,
5
+ is_selected,
6
+ editable as _editable
7
+ } from "../../utils";
8
+ export let href;
9
+ export let icon = void 0;
10
+ export let active = false;
11
+ export let selectable = void 0;
12
+ export let editable = void 0;
13
+ $:
14
+ context_data = $context_items_store;
15
+ let user_class = $$props.class ?? "";
16
+ function selectable_if_needed(node, selectable2) {
17
+ if (selectable2)
18
+ _selectable(node, selectable2);
19
+ }
20
+ function selected(itm, context_data2) {
21
+ if (is_selected(itm))
22
+ return true;
23
+ else
24
+ return false;
25
+ }
26
+ function editable_if_needed(node, editable2) {
27
+ if (editable2)
28
+ _editable(node, editable2);
29
+ }
30
+ </script>
31
+
32
+ <li>
33
+ <a
34
+ href={href}
35
+ on:click={ (e) => auto_hide_sidebar() }
36
+ on:contextmenu
37
+ class="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700 border-2 border-transparent {user_class}"
38
+ class:bg-gray-200={active}
39
+ class:dark:bg-gray-700={active}
40
+ use:selectable_if_needed={selectable}
41
+ class:selected={selected(selectable, context_data)}
42
+ >
43
+ {#if icon}
44
+ <Icon size={5} component={icon}/>
45
+ {/if}
46
+ <span class="ml-3"
47
+ use:editable_if_needed={editable}>
48
+ <slot/>
49
+ </span>
50
+ </a>
51
+ </li>
52
+
53
+
54
+ <style>
55
+ .selected {
56
+ border-width: 2px;
57
+ --tw-border-opacity: 1 !important;
58
+ border-color: rgb(147 197 253 / var(--tw-border-opacity)) !important
59
+ }
60
+ </style>
@@ -0,0 +1,25 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ [x: string]: any;
5
+ href: string;
6
+ icon?: any | undefined;
7
+ active?: boolean | undefined;
8
+ selectable?: any | undefined;
9
+ editable?: any | undefined;
10
+ };
11
+ events: {
12
+ contextmenu: MouseEvent;
13
+ } & {
14
+ [evt: string]: CustomEvent<any>;
15
+ };
16
+ slots: {
17
+ default: {};
18
+ };
19
+ };
20
+ export type SidebarProps = typeof __propDef.props;
21
+ export type SidebarEvents = typeof __propDef.events;
22
+ export type SidebarSlots = typeof __propDef.slots;
23
+ export default class Sidebar extends SvelteComponentTyped<SidebarProps, SidebarEvents, SidebarSlots> {
24
+ }
25
+ export {};
@@ -0,0 +1,9 @@
1
+ <script>
2
+
3
+ </script>
4
+
5
+ <aside class="w-full" aria-label="Sidebar">
6
+ <div class="overflow-y-auto py-4 px-3 bg-gray-50 rounded dark:bg-gray-800">
7
+ <slot/>
8
+ </div>
9
+ </aside>
@@ -0,0 +1,27 @@
1
+ /** @typedef {typeof __propDef.props} SidebarProps */
2
+ /** @typedef {typeof __propDef.events} SidebarEvents */
3
+ /** @typedef {typeof __propDef.slots} SidebarSlots */
4
+ export default class Sidebar extends SvelteComponentTyped<{
5
+ [x: string]: never;
6
+ }, {
7
+ [evt: string]: CustomEvent<any>;
8
+ }, {
9
+ default: {};
10
+ }> {
11
+ }
12
+ export type SidebarProps = typeof __propDef.props;
13
+ export type SidebarEvents = typeof __propDef.events;
14
+ export type SidebarSlots = typeof __propDef.slots;
15
+ import { SvelteComponentTyped } from "svelte";
16
+ declare const __propDef: {
17
+ props: {
18
+ [x: string]: never;
19
+ };
20
+ events: {
21
+ [evt: string]: CustomEvent<any>;
22
+ };
23
+ slots: {
24
+ default: {};
25
+ };
26
+ };
27
+ export {};
@@ -2,8 +2,8 @@
2
2
  /** @typedef {typeof __propDef.events} SimpleEvents */
3
3
  /** @typedef {typeof __propDef.slots} SimpleSlots */
4
4
  export default class Simple extends SvelteComponentTyped<{
5
- focus?: boolean | undefined;
6
5
  select?: string | undefined;
6
+ focus?: boolean | undefined;
7
7
  context?: string | undefined;
8
8
  self?: null | undefined;
9
9
  nav?: boolean | undefined;
@@ -22,8 +22,8 @@ export type SimpleSlots = typeof __propDef.slots;
22
22
  import { SvelteComponentTyped } from "svelte";
23
23
  declare const __propDef: {
24
24
  props: {
25
- focus?: boolean | undefined;
26
25
  select?: string | undefined;
26
+ focus?: boolean | undefined;
27
27
  context?: string | undefined;
28
28
  self?: null | undefined;
29
29
  nav?: boolean | undefined;
@@ -2,8 +2,8 @@
2
2
  /** @typedef {typeof __propDef.events} TemplateEvents */
3
3
  /** @typedef {typeof __propDef.slots} TemplateSlots */
4
4
  export default class Template extends SvelteComponentTyped<{
5
- focus?: boolean | undefined;
6
5
  select?: string | undefined;
6
+ focus?: boolean | undefined;
7
7
  context?: string | undefined;
8
8
  self?: null | undefined;
9
9
  nav?: boolean | undefined;
@@ -30,8 +30,8 @@ export type TemplateSlots = typeof __propDef.slots;
30
30
  import { SvelteComponentTyped } from "svelte";
31
31
  declare const __propDef: {
32
32
  props: {
33
- focus?: boolean | undefined;
34
33
  select?: string | undefined;
34
+ focus?: boolean | undefined;
35
35
  context?: string | undefined;
36
36
  self?: null | undefined;
37
37
  nav?: boolean | undefined;
package/desk.svelte CHANGED
@@ -16,8 +16,8 @@
16
16
  set_dark_mode_default } from './stores.js'
17
17
 
18
18
  import {session, AuthorizedView, Authorized, NotAuthorized, Auth} from '@humandialog/auth.svelte'
19
-
20
-
19
+ import { handle_select } from './utils'
20
+
21
21
  export let layout;
22
22
 
23
23
 
@@ -133,7 +133,11 @@
133
133
  <svelte:window bind:innerWidth bind:outerWidth bind:innerHeight bind:outerHeight />
134
134
 
135
135
  <AuthorizedView>
136
- <div id="__hd_svelte_layout_root" class="{$dark_mode_store}">
136
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
137
+ <div id="__hd_svelte_layout_root" class="{$dark_mode_store}"
138
+ on:click={handle_select}
139
+ on:contextmenu={handle_select}>
140
+
137
141
  <div class="bg-white dark:bg-gray-900 dark:text-white min-h-screen h-screen">
138
142
  <!--###########################################################-->
139
143
  <!--## HORIZONTAL TOOLBAR (FOR PHONES) ######################-->
package/index.d.ts CHANGED
@@ -24,5 +24,10 @@ export { default as RichEdit } from './components/document/rich.edit.svelte';
24
24
  export { default as Spinner } from './components/delayed.spinner.svelte';
25
25
  export { show_menu, show_grid_menu, show_floating_toolbar } from './components/menu';
26
26
  export { default as Fab } from './components/Fab.svelte';
27
+ export { default as Sidebar } from './components/sidebar/sidebar.svelte';
28
+ export { default as SidebarBrand } from './components/sidebar/sidebar.brand.svelte';
29
+ export { default as SidebarGroup } from './components/sidebar/sidebar.group.svelte';
30
+ export { default as SidebarItem } from './components/sidebar/sidebar.item.svelte';
31
+ export { select_item, activate_item, clear_active_item, is_active, is_selected, editable, start_editing, selectable, handle_select } from './utils';
27
32
  export { data_tick_store, has_selected_item, has_data_item } from "./stores";
28
33
  export { context_toolbar_operations, page_toolbar_operations, context_items_store } from './stores';
package/index.js CHANGED
@@ -29,5 +29,10 @@ export { default as Spinner } from './components/delayed.spinner.svelte';
29
29
  //export { default as Menu } from './components/contextmenu.svelte'
30
30
  export { show_menu, show_grid_menu, show_floating_toolbar } from './components/menu';
31
31
  export { default as Fab } from './components/Fab.svelte';
32
+ export { default as Sidebar } from './components/sidebar/sidebar.svelte';
33
+ export { default as SidebarBrand } from './components/sidebar/sidebar.brand.svelte';
34
+ export { default as SidebarGroup } from './components/sidebar/sidebar.group.svelte';
35
+ export { default as SidebarItem } from './components/sidebar/sidebar.item.svelte';
36
+ export { select_item, activate_item, clear_active_item, is_active, is_selected, editable, start_editing, selectable, handle_select } from './utils';
32
37
  export { data_tick_store, has_selected_item, has_data_item } from "./stores";
33
38
  export { context_toolbar_operations, page_toolbar_operations, context_items_store } from './stores'; // tmp
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@humandialog/forms.svelte",
3
- "version": "0.4.12",
3
+ "version": "0.4.13",
4
4
  "description": "Basic Svelte UI components for Object Reef applications",
5
5
  "devDependencies": {
6
6
  "@playwright/test": "^1.28.1",
@@ -76,6 +76,10 @@
76
76
  "./components/inputbox.ltop.svelte": "./components/inputbox.ltop.svelte",
77
77
  "./components/menu": "./components/menu.js",
78
78
  "./components/radio.svelte": "./components/radio.svelte",
79
+ "./components/sidebar/sidebar.brand.svelte": "./components/sidebar/sidebar.brand.svelte",
80
+ "./components/sidebar/sidebar.group.svelte": "./components/sidebar/sidebar.group.svelte",
81
+ "./components/sidebar/sidebar.item.svelte": "./components/sidebar/sidebar.item.svelte",
82
+ "./components/sidebar/sidebar.svelte": "./components/sidebar/sidebar.svelte",
79
83
  "./components/simple.table.svelte": "./components/simple.table.svelte",
80
84
  "./components/table/column.svelte": "./components/table/column.svelte",
81
85
  "./components/table/item.svelte": "./components/table/item.svelte",
package/utils.d.ts CHANGED
@@ -1,3 +1,16 @@
1
+ export function select_item(itm: any): void;
2
+ export function activate_item(context_level: any, itm: any, operations?: null): void;
3
+ export function clear_active_item(context_level: any): void;
4
+ export function is_selected(itm: any): boolean;
5
+ export function is_active(context_level: any, itm: any): boolean;
6
+ export function editable(node: any, action: any): {
7
+ destroy(): void;
8
+ };
9
+ export function start_editing(element: any, finish_callback: any): void;
10
+ export function selectable(node: any, itm: any): {
11
+ destroy(): void;
12
+ };
13
+ export function handle_select(e: any): void;
1
14
  export function parse_width_directive(c: any): string;
2
15
  export function should_be_comapact(): boolean;
3
16
  export namespace icons {
package/utils.js CHANGED
@@ -1,7 +1,219 @@
1
- import { getContext } from "svelte";
1
+ import { getContext, tick } from "svelte";
2
+ import {get} from 'svelte/store'
3
+ import { context_items_store, context_toolbar_operations } from "./stores";
2
4
 
3
5
  export let icons = {symbols :null}
4
6
 
7
+ export function select_item(itm)
8
+ {
9
+ let data_context = get(context_items_store);
10
+ data_context['sel'] = itm;
11
+ data_context.focused = 'sel';
12
+ context_items_store.set( {...data_context} )
13
+ }
14
+
15
+ export function activate_item(context_level, itm, operations=null)
16
+ {
17
+ let data_context = get(context_items_store);
18
+ data_context['sel'] = itm; //null;
19
+ data_context[context_level] = itm;
20
+ data_context.focused = context_level;
21
+ context_items_store.set( {...data_context} )
22
+
23
+ if(operations && Array.isArray(operations))
24
+ context_toolbar_operations.set( [...operations] )
25
+ }
26
+
27
+ export function clear_active_item(context_level)
28
+ {
29
+ let data_context = get(context_items_store);
30
+ data_context[context_level] = null;
31
+ data_context.focused = context_level;
32
+ context_items_store.set( {...data_context} )
33
+
34
+ context_toolbar_operations.set( [] )
35
+ }
36
+
37
+ export function is_selected(itm)
38
+ {
39
+ let data_context = get(context_items_store);
40
+ if(!!data_context && !!data_context['sel'] && data_context['sel'] == itm)
41
+ return true;
42
+ else
43
+ return false;
44
+ }
45
+
46
+
47
+ export function is_active(context_level, itm)
48
+ {
49
+ let data_context = get(context_items_store);
50
+ if(data_context != undefined && data_context[context_level] != undefined && data_context[context_level] == itm)
51
+ return true;
52
+ else
53
+ return false;
54
+ }
55
+
56
+
57
+ export function editable(node, action)
58
+ {
59
+ const org_text = node.textContent;
60
+ const blur_listener = async (e) =>
61
+ {
62
+ await finish_editing(true);
63
+ }
64
+
65
+ const key_listener = async (e) =>
66
+ {
67
+ switch(e.key)
68
+ {
69
+ case 'Esc':
70
+ case 'Escape':
71
+ await finish_editing(true);
72
+ e.stopPropagation();
73
+ e.preventDefault();
74
+ break;
75
+
76
+ case 'Enter':
77
+ await finish_editing(false);
78
+ e.stopPropagation();
79
+ e.preventDefault();
80
+ break;
81
+ }
82
+ }
83
+
84
+ const finish_editing = async (cancel) =>
85
+ {
86
+ node.removeEventListener("blur", blur_listener);
87
+ node.removeEventListener("keydown", key_listener);
88
+ node.contentEditable = "false"
89
+
90
+ let sel = window.getSelection();
91
+ sel.removeAllRanges();
92
+
93
+ if(cancel)
94
+ {
95
+ node.innerHTML = org_text;
96
+ }
97
+ else if(action)
98
+ {
99
+ await action(node.textContent)
100
+ }
101
+
102
+ node.dispatchEvent(new Event("finish"))
103
+ node.removeEventListener("finish", (e) => {});
104
+ }
105
+
106
+ const edit_listener = async (e) =>
107
+ {
108
+ //console.log('Edit event fired:', itm, "node", node)
109
+ node.contentEditable = "true"
110
+ node.addEventListener("blur", blur_listener);
111
+ node.addEventListener("keydown", key_listener);
112
+
113
+ node.focus();
114
+
115
+ await tick();
116
+ let range = document.createRange();
117
+ range.selectNodeContents(node);
118
+ let sel = window.getSelection();
119
+ sel.removeAllRanges();
120
+ sel.addRange(range);
121
+
122
+ }
123
+
124
+ node.addEventListener("edit", edit_listener);
125
+ node.classList.add("editable")
126
+ node.classList.add("focus:outline-none")
127
+ return {
128
+ destroy() {
129
+ node.removeEventListener("edit", edit_listener)
130
+ node.classList.remove("editable")
131
+ node.contentEditable = "false"
132
+ }};
133
+ }
134
+
135
+ export function start_editing(element, finish_callback)
136
+ {
137
+ let editable_node = null;
138
+
139
+ if(element.classList.contains("editable"))
140
+ editable_node = element;
141
+ else
142
+ {
143
+ let editables = element.getElementsByClassName("editable");
144
+ if(editables && editables.length > 0)
145
+ editable_node = editables[0];
146
+ }
147
+
148
+ if(editable_node)
149
+ {
150
+ if(editable_node.contentEditable == "true")
151
+ return;
152
+
153
+ if(finish_callback)
154
+ {
155
+ editable_node.addEventListener("finish", (e) => {finish_callback()})
156
+ }
157
+
158
+ const edit_event = new Event("edit")
159
+ editable_node.dispatchEvent(edit_event)
160
+ }
161
+ }
162
+
163
+ export function selectable(node, itm)
164
+ {
165
+ const select_listener = (e) =>
166
+ {
167
+ select_item(itm);
168
+ }
169
+
170
+ node.setAttribute("selectable", "true")
171
+ node.addEventListener("select", select_listener);
172
+
173
+ return {
174
+ destroy() {
175
+ node.removeEventListener("select", select_listener)
176
+ try{
177
+ node.removeAttribute("selectable")
178
+ }
179
+ catch(err)
180
+ {
181
+ console.error(err);
182
+ console.log(node);
183
+ }
184
+ }};
185
+ }
186
+
187
+ export function handle_select(e)
188
+ {
189
+ let node = e.target;
190
+ if(!node)
191
+ {
192
+ select_item(null);
193
+ return;
194
+ }
195
+
196
+ let selection_node = null;
197
+
198
+ while(!!node)
199
+ {
200
+ if(node.hasAttribute("selectable"))
201
+ {
202
+ selection_node = node;
203
+ break;
204
+ }
205
+
206
+ node = node.parentElement;
207
+ }
208
+
209
+ if(selection_node)
210
+ selection_node.dispatchEvent(new Event("select"))
211
+ else
212
+ select_item(null);
213
+ }
214
+
215
+
216
+
5
217
  export function parse_width_directive(c)
6
218
  {
7
219
  let cs = '';