fuma 0.5.0 → 1.0.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.
- package/dist/private/Meta.svelte +32 -27
- package/dist/private/Meta.svelte.d.ts +1 -0
- package/dist/private/api.d.ts +1 -1
- package/dist/ui/badge/Badge.svelte +4 -3
- package/dist/ui/button/ButtonCopy.svelte +32 -26
- package/dist/ui/button/ButtonDelete.svelte +23 -21
- package/dist/ui/button/ButtonDelete.svelte.d.ts +1 -0
- package/dist/ui/card/Card.svelte +13 -10
- package/dist/ui/card/Card.svelte.d.ts +1 -0
- package/dist/ui/card/CardBasic.svelte +5 -4
- package/dist/ui/card/CardBasic.svelte.d.ts +1 -0
- package/dist/ui/card/CardCollapse.svelte +35 -31
- package/dist/ui/card/CardCollapse.svelte.d.ts +1 -0
- package/dist/ui/card/CardFullScreen.svelte +8 -6
- package/dist/ui/card/CardFullScreen.svelte.d.ts +3 -0
- package/dist/ui/card/CardLink.svelte +5 -4
- package/dist/ui/card/CardLink.svelte.d.ts +1 -0
- package/dist/ui/dialog/Dialog.svelte +41 -34
- package/dist/ui/dialog/Dialog.svelte.d.ts +1 -0
- package/dist/ui/dialog/DialogConfirm.svelte +6 -4
- package/dist/ui/dialog/DialogConfirm.svelte.d.ts +1 -0
- package/dist/ui/drawer/Drawer.svelte +47 -38
- package/dist/ui/drawer/Drawer.svelte.d.ts +16 -0
- package/dist/ui/form/Form.svelte +101 -83
- package/dist/ui/form/Form.svelte.d.ts +1 -0
- package/dist/ui/form/FormInput.svelte +12 -6
- package/dist/ui/form/FormInput.svelte.d.ts +30 -8
- package/dist/ui/form/FormSection.svelte +24 -17
- package/dist/ui/form/formInput.d.ts +7 -4
- package/dist/ui/icon/Icon.svelte +35 -32
- package/dist/ui/index.d.ts +0 -1
- package/dist/ui/index.js +0 -1
- package/dist/ui/input/FormControl.svelte +48 -36
- package/dist/ui/input/FormControl.svelte.d.ts +7 -9
- package/dist/ui/input/InputBoolean.svelte +29 -22
- package/dist/ui/input/InputBoolean.svelte.d.ts +5 -1
- package/dist/ui/input/InputCheckboxs.svelte +37 -34
- package/dist/ui/input/InputCheckboxs.svelte.d.ts +5 -1
- package/dist/ui/input/InputCheckboxsMenu.svelte +64 -47
- package/dist/ui/input/InputCheckboxsMenu.svelte.d.ts +5 -1
- package/dist/ui/input/InputCheckboxsTree.svelte +9 -6
- package/dist/ui/input/InputCheckboxsTreeNodes.svelte +36 -28
- package/dist/ui/input/InputCombo.svelte +76 -65
- package/dist/ui/input/InputCombo.svelte.d.ts +5 -1
- package/dist/ui/input/InputDate.svelte +36 -29
- package/dist/ui/input/InputDateTime.svelte +37 -30
- package/dist/ui/input/InputImage.svelte +52 -45
- package/dist/ui/input/InputImage.svelte.d.ts +1 -0
- package/dist/ui/input/InputImagePreview.svelte +24 -20
- package/dist/ui/input/InputNumber.svelte +28 -22
- package/dist/ui/input/InputNumber.svelte.d.ts +1 -5
- package/dist/ui/input/InputOptionInParam.svelte +12 -10
- package/dist/ui/input/InputOptions.svelte +40 -34
- package/dist/ui/input/InputPassword.svelte +22 -18
- package/dist/ui/input/InputPassword.svelte.d.ts +5 -1
- package/dist/ui/input/InputRadio.svelte +51 -46
- package/dist/ui/input/InputRadio.svelte.d.ts +5 -1
- package/dist/ui/input/InputRelation.svelte +119 -111
- package/dist/ui/input/InputRelation.svelte.d.ts +6 -12
- package/dist/ui/input/InputRelations.svelte +94 -90
- package/dist/ui/input/InputRelations.svelte.d.ts +5 -12
- package/dist/ui/input/InputSearch.svelte +13 -10
- package/dist/ui/input/InputSelect.svelte +59 -46
- package/dist/ui/input/InputText.svelte +29 -28
- package/dist/ui/input/InputText.svelte.d.ts +0 -3
- package/dist/ui/input/InputTextarea.svelte +20 -19
- package/dist/ui/input/InputTextarea.svelte.d.ts +1 -5
- package/dist/ui/input/InputTime.svelte +43 -35
- package/dist/ui/input/RelationAfter.svelte +13 -9
- package/dist/ui/input/SelectorList.svelte +16 -12
- package/dist/ui/input/SelectorList.svelte.d.ts +4 -0
- package/dist/ui/input/textRich/InputTextRich.svelte +63 -54
- package/dist/ui/input/textRich/InputTextRich.svelte.d.ts +5 -1
- package/dist/ui/input/textRich/SuggesionList.svelte +13 -9
- package/dist/ui/input/textRich/ToolMark.svelte +12 -9
- package/dist/ui/input/textRich/ToolMarkColor.svelte +16 -12
- package/dist/ui/input/textRich/ToolMarkLink.svelte +46 -38
- package/dist/ui/input/textRich/ToolMenu.svelte +34 -19
- package/dist/ui/input/textRich/ToolMenuAlign.svelte +13 -9
- package/dist/ui/input/textRich/ToolMenuInsert.svelte +12 -7
- package/dist/ui/input/textRich/ToolMenuNode.svelte +14 -10
- package/dist/ui/input/textRich/ToolsBar.svelte +17 -13
- package/dist/ui/login/Login.svelte +37 -31
- package/dist/ui/menu/ContextMenu.svelte +37 -31
- package/dist/ui/menu/ContextMenu.svelte.d.ts +1 -0
- package/dist/ui/menu/DropDown.svelte +92 -83
- package/dist/ui/menu/DropDown.svelte.d.ts +1 -0
- package/dist/ui/menu/DropDownMenu.svelte +25 -18
- package/dist/ui/menu/DropDownMenu.svelte.d.ts +1 -0
- package/dist/ui/mode/ToggleMode.svelte +15 -14
- package/dist/ui/mode/ToggleMode.svelte.d.ts +6 -1
- package/dist/ui/pagination/Pagination.svelte +9 -8
- package/dist/ui/placeholder/Placeholder.svelte +4 -3
- package/dist/ui/placeholder/Placeholder.svelte.d.ts +1 -0
- package/dist/ui/placeholder/PlaceholderImage.svelte +6 -4
- package/dist/ui/placeholder/PlaceholderImage.svelte.d.ts +1 -0
- package/dist/ui/range/RangePicker.svelte +76 -63
- package/dist/ui/range/RangePickerButton.svelte +43 -35
- package/dist/ui/table/Table.svelte +35 -28
- package/dist/ui/table/TableBody.svelte +18 -12
- package/dist/ui/table/TableCell.svelte +13 -10
- package/dist/ui/table/TableFieldsEdition.svelte +57 -51
- package/dist/ui/table/TableHead.svelte +19 -20
- package/dist/ui/table/TableViewSelect.svelte +50 -37
- package/dist/ui/table/cell/TableCellArray.svelte +5 -3
- package/dist/ui/table/cell/TableCellBoolean.svelte +4 -3
- package/dist/ui/table/cell/TableCellNumber.svelte +2 -1
- package/dist/ui/table/cell/TableCellString.svelte +5 -2
- package/dist/ui/table/head/TableHeadBoolean.svelte +6 -3
- package/dist/ui/table/head/TableHeadDate.svelte +54 -47
- package/dist/ui/table/head/TableHeadDefault.svelte +5 -2
- package/dist/ui/table/head/TableHeadNumber.svelte +65 -53
- package/dist/ui/table/head/TableHeadSelect.svelte +47 -41
- package/dist/ui/table/head/TableHeadString.svelte +14 -8
- package/dist/ui/tabs/Tabs.svelte +8 -5
- package/dist/ui/tabs/TabsIcon.svelte +31 -28
- package/dist/validation/zod.d.ts +1 -1
- package/dist/validation/zod.js +1 -1
- package/package.json +32 -33
- package/dist/ui/slot/Slot.svelte +0 -35
- package/dist/ui/slot/Slot.svelte.d.ts +0 -22
- package/dist/ui/slot/Span.svelte +0 -4
- package/dist/ui/slot/Span.svelte.d.ts +0 -16
- package/dist/ui/slot/index.d.ts +0 -1
- package/dist/ui/slot/index.js +0 -1
|
@@ -1,41 +1,49 @@
|
|
|
1
|
-
<script
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Editor } from '@tiptap/core'
|
|
3
|
+
import { mdiLinkVariant } from '@mdi/js'
|
|
4
|
+
|
|
5
|
+
import { Dialog } from '../../dialog/index.js'
|
|
6
|
+
import { InputText } from '../index.js'
|
|
7
|
+
import { z } from '../../../validation/zod.js'
|
|
8
|
+
import ToolMark from './ToolMark.svelte'
|
|
9
|
+
|
|
10
|
+
export let editor: Editor
|
|
11
|
+
let dialogLink: HTMLDialogElement
|
|
12
|
+
let linkHref = ''
|
|
13
|
+
let linkError = ''
|
|
14
|
+
|
|
15
|
+
async function handleNewLink() {
|
|
16
|
+
if (!linkHref) {
|
|
17
|
+
linkError = 'URL requis'
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const isEmail = z.string().email().safeParse(linkHref)
|
|
22
|
+
if (isEmail.success) linkHref = 'mailto:' + linkHref
|
|
23
|
+
else if (!linkHref.match(/^http(s)?:\/\//)) {
|
|
24
|
+
linkHref = 'https://' + linkHref
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const isUrl = z.string().url().safeParse(linkHref)
|
|
28
|
+
if (!isUrl.success) {
|
|
29
|
+
linkError = 'URL invalide'
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
editor.chain().focus().setLink({ href: linkHref }).run()
|
|
34
|
+
dialogLink.close()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function handleRemoveLink() {
|
|
38
|
+
editor.chain().focus().unsetLink().run()
|
|
39
|
+
dialogLink.close()
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function handleKeyDown(event: KeyboardEvent) {
|
|
43
|
+
if (event.key !== 'Enter') return
|
|
44
|
+
event.preventDefault()
|
|
45
|
+
handleNewLink()
|
|
46
|
+
}
|
|
39
47
|
</script>
|
|
40
48
|
|
|
41
49
|
<ToolMark
|
|
@@ -1,22 +1,37 @@
|
|
|
1
|
-
<script
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Editor } from '@tiptap/core'
|
|
3
|
+
import { mdiChevronDown } from '@mdi/js'
|
|
4
|
+
|
|
5
|
+
import { Icon } from '../../icon/index.js'
|
|
6
|
+
import { DropDown } from '../../menu/index.js'
|
|
7
|
+
|
|
8
|
+
type Tool = {
|
|
9
|
+
key?: string
|
|
10
|
+
attributes?: {}
|
|
11
|
+
label: string
|
|
12
|
+
icon: string
|
|
13
|
+
action: () => unknown
|
|
14
|
+
newSection?: true
|
|
15
|
+
disable?: boolean
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export let editor: Editor
|
|
19
|
+
export let tools: Tool[]
|
|
20
|
+
export let hideLabel = false
|
|
21
|
+
|
|
22
|
+
let dropdown: DropDown
|
|
23
|
+
|
|
24
|
+
function handleClick(tool: Tool) {
|
|
25
|
+
tool.action()
|
|
26
|
+
dropdown.hide()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
$: toolSelected =
|
|
30
|
+
tools.find((t) => {
|
|
31
|
+
if (t.key) return editor.isActive(t.key, t.attributes)
|
|
32
|
+
if (t.attributes) return editor.isActive(t.attributes)
|
|
33
|
+
return false
|
|
34
|
+
}) || tools[0]
|
|
20
35
|
</script>
|
|
21
36
|
|
|
22
37
|
<DropDown hideOnBlur bind:this={dropdown}>
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Editor } from '@tiptap/core'
|
|
3
|
+
import {
|
|
4
|
+
mdiAlignHorizontalLeft,
|
|
5
|
+
mdiAlignHorizontalCenter,
|
|
6
|
+
mdiAlignHorizontalRight,
|
|
7
|
+
mdiFormatIndentIncrease,
|
|
8
|
+
mdiFormatIndentDecrease,
|
|
9
|
+
} from '@mdi/js'
|
|
10
|
+
|
|
11
|
+
import ToolMenu from './ToolMenu.svelte'
|
|
12
|
+
|
|
13
|
+
export let editor: Editor
|
|
10
14
|
</script>
|
|
11
15
|
|
|
12
16
|
<ToolMenu
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
<script
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { createEventDispatcher } from 'svelte'
|
|
3
|
+
import type { Editor } from '@tiptap/core'
|
|
4
|
+
import { mdiPlus, mdiMinus, mdiImageOutline, mdiYoutube, mdiAt } from '@mdi/js'
|
|
5
|
+
|
|
6
|
+
import { Icon } from '../../icon/index.js'
|
|
7
|
+
import ToolMenu from './ToolMenu.svelte'
|
|
8
|
+
import { suggestionItems } from './suggestion.js'
|
|
9
|
+
|
|
10
|
+
export let editor: Editor
|
|
11
|
+
|
|
12
|
+
const dispatch = createEventDispatcher<{ insertMedia: void }>()
|
|
8
13
|
</script>
|
|
9
14
|
|
|
10
15
|
<ToolMenu
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Editor } from '@tiptap/core'
|
|
3
|
+
import {
|
|
4
|
+
mdiText,
|
|
5
|
+
mdiFormatListBulleted,
|
|
6
|
+
mdiFormatListNumbered,
|
|
7
|
+
mdiFormatHeader1,
|
|
8
|
+
mdiFormatHeader3,
|
|
9
|
+
mdiFormatHeader2,
|
|
10
|
+
} from '@mdi/js'
|
|
11
|
+
|
|
12
|
+
import ToolMenu from './ToolMenu.svelte'
|
|
13
|
+
|
|
14
|
+
export let editor: Editor
|
|
11
15
|
</script>
|
|
12
16
|
|
|
13
17
|
<ToolMenu
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
<script
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Editor } from '@tiptap/core'
|
|
3
|
+
import { mdiFormatBold, mdiFormatColorFill, mdiFormatColorText, mdiFormatItalic } from '@mdi/js'
|
|
4
|
+
import { toast } from 'svelte-sonner'
|
|
5
|
+
|
|
6
|
+
import ToolMenuNode from './ToolMenuNode.svelte'
|
|
7
|
+
import ToolMark from './ToolMark.svelte'
|
|
8
|
+
import ToolMarkColor from './ToolMarkColor.svelte'
|
|
9
|
+
import ToolMarkLink from './ToolMarkLink.svelte'
|
|
10
|
+
import ToolMenuAlign from './ToolMenuAlign.svelte'
|
|
11
|
+
import ToolMenuInsert from './ToolMenuInsert.svelte'
|
|
12
|
+
|
|
13
|
+
export let editor: Editor
|
|
14
|
+
let klass = ''
|
|
15
|
+
export { klass as class }
|
|
12
16
|
</script>
|
|
13
17
|
|
|
14
18
|
<div
|
|
@@ -20,7 +24,7 @@ export { klass as class };
|
|
|
20
24
|
<div class="flex overflow-x-auto p-2">
|
|
21
25
|
<ToolMenuNode {editor} />
|
|
22
26
|
<ToolMenuAlign {editor} />
|
|
23
|
-
<div class="mx-1 my-auto h-6 border border-y-0 border-l-0"
|
|
27
|
+
<div class="mx-1 my-auto h-6 border border-y-0 border-l-0"></div>
|
|
24
28
|
|
|
25
29
|
<ToolMark
|
|
26
30
|
{editor}
|
|
@@ -50,7 +54,7 @@ export { klass as class };
|
|
|
50
54
|
setColor={(color) => editor.commands.setHighlight({ color })}
|
|
51
55
|
/>
|
|
52
56
|
|
|
53
|
-
<div class="mx-1 my-auto h-6 border border-y-0 border-l-0"
|
|
57
|
+
<div class="mx-1 my-auto h-6 border border-y-0 border-l-0"></div>
|
|
54
58
|
|
|
55
59
|
<ToolMenuInsert
|
|
56
60
|
{editor}
|
|
@@ -1,33 +1,39 @@
|
|
|
1
|
-
<script
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { slide } from 'svelte/transition'
|
|
3
|
+
import { page } from '$app/stores'
|
|
4
|
+
import { InputText, InputPassword } from '../input/index.js'
|
|
5
|
+
import { useForm } from '../../validation/form.js'
|
|
6
|
+
|
|
7
|
+
export let onSuccess:
|
|
8
|
+
| ((action: URL, data?: Record<string, unknown> | undefined) => any)
|
|
9
|
+
| undefined = undefined
|
|
10
|
+
|
|
11
|
+
const { enhance } = useForm({
|
|
12
|
+
onSuccess,
|
|
13
|
+
successMessage(action) {
|
|
14
|
+
if (action.search === '?/reset_password') {
|
|
15
|
+
recorverDialog.close()
|
|
16
|
+
state = 'login'
|
|
17
|
+
return "Un lien de récupération t'a été envoyé par email"
|
|
18
|
+
}
|
|
19
|
+
return 'Bienvenue'
|
|
20
|
+
},
|
|
21
|
+
onError(err) {
|
|
22
|
+
if (err === 'This account already exists') {
|
|
23
|
+
state = 'login'
|
|
24
|
+
return
|
|
25
|
+
}
|
|
26
|
+
if (err === 'This account already created from an invitation') {
|
|
27
|
+
recorverDialog.showModal()
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
let state: 'login' | 'register' = 'login'
|
|
33
|
+
|
|
34
|
+
$: redirectTo = $page.url.searchParams.get('redirectTo')
|
|
35
|
+
|
|
36
|
+
let recorverDialog: HTMLDialogElement
|
|
31
37
|
</script>
|
|
32
38
|
|
|
33
39
|
<div class="grid place-content-center p-10">
|
|
@@ -82,7 +88,7 @@ let recorverDialog;
|
|
|
82
88
|
<button class="btn" formaction="/auth?/{state}">
|
|
83
89
|
{state === 'login' ? 'Connexion' : 'Valider'}
|
|
84
90
|
</button>
|
|
85
|
-
<div class="grow"
|
|
91
|
+
<div class="grow"></div>
|
|
86
92
|
|
|
87
93
|
<button class="link-hover link" formaction="/auth?/reset_password">
|
|
88
94
|
Mot de passe oublié
|
|
@@ -1,34 +1,40 @@
|
|
|
1
|
-
<script
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
let
|
|
10
|
-
let
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { createEventDispatcher } from 'svelte'
|
|
3
|
+
import type { TippyProps } from '../../utils/tippy.js'
|
|
4
|
+
|
|
5
|
+
import { Dialog } from '../dialog/index.js'
|
|
6
|
+
import { DropDown } from './index.js'
|
|
7
|
+
import { isSmallScreen } from '../../store/index.js'
|
|
8
|
+
|
|
9
|
+
export let tippyProps: Partial<TippyProps> = {}
|
|
10
|
+
let klass = ''
|
|
11
|
+
export { klass as class }
|
|
12
|
+
|
|
13
|
+
const dispatch = createEventDispatcher<{ show: void; hide: void }>()
|
|
14
|
+
|
|
15
|
+
let dropdown: DropDown
|
|
16
|
+
let dialog: HTMLDialogElement
|
|
17
|
+
|
|
18
|
+
export function show(event: MouseEvent) {
|
|
19
|
+
if ($isSmallScreen) {
|
|
20
|
+
dialog?.showModal()
|
|
21
|
+
} else {
|
|
22
|
+
const target = event.target as HTMLElement
|
|
23
|
+
if (!target || !(target instanceof HTMLElement)) return
|
|
24
|
+
dropdown?.setTippyProps({
|
|
25
|
+
getReferenceClientRect: () => new DOMRect(event.clientX, event.clientY)
|
|
26
|
+
})
|
|
27
|
+
dropdown?.show()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
dispatch('show')
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function hide() {
|
|
34
|
+
if ($isSmallScreen) dialog?.close()
|
|
35
|
+
else dropdown?.hide()
|
|
36
|
+
dispatch('hide')
|
|
37
|
+
}
|
|
32
38
|
</script>
|
|
33
39
|
|
|
34
40
|
{#if $isSmallScreen}
|
|
@@ -1,88 +1,97 @@
|
|
|
1
|
-
<script context="module">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
<script lang="ts" context="module">
|
|
2
|
+
import { createSingleton, type TippyInstance } from '../../utils/tippy.js'
|
|
3
|
+
|
|
4
|
+
const sigleton = browser
|
|
5
|
+
? createSingleton([], {
|
|
6
|
+
theme: 'dropdown',
|
|
7
|
+
arrow: false,
|
|
8
|
+
moveTransition: 'transform 0.1s ease-out',
|
|
9
|
+
interactive: true,
|
|
10
|
+
interactiveDebounce: 50
|
|
11
|
+
})
|
|
12
|
+
: null
|
|
13
|
+
|
|
14
|
+
const tips: TippyInstance[] = []
|
|
10
15
|
</script>
|
|
11
16
|
|
|
12
|
-
<script
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export
|
|
20
|
-
|
|
21
|
-
export
|
|
22
|
-
export let
|
|
23
|
-
export let
|
|
24
|
-
export let
|
|
25
|
-
export let
|
|
26
|
-
export let
|
|
27
|
-
export let
|
|
28
|
-
export let
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
17
|
+
<script lang="ts">
|
|
18
|
+
import { tippy, type TippyProps } from '../../utils/tippy.js'
|
|
19
|
+
import { onMount } from 'svelte'
|
|
20
|
+
import { browser } from '$app/environment'
|
|
21
|
+
import { beforeNavigate } from '$app/navigation'
|
|
22
|
+
import './dropdown.css'
|
|
23
|
+
|
|
24
|
+
export let tippyProps: Partial<TippyProps> = {}
|
|
25
|
+
let klass = ''
|
|
26
|
+
export { klass as class }
|
|
27
|
+
export let classWrapper = ''
|
|
28
|
+
export let classActivator = ''
|
|
29
|
+
export let useSingleton = false
|
|
30
|
+
export let autofocus = false
|
|
31
|
+
export let hideOnBlur = false
|
|
32
|
+
export let hideOnNav = true
|
|
33
|
+
export let tip: TippyInstance | undefined = undefined
|
|
34
|
+
// By pass dropdown for use in flat mode
|
|
35
|
+
export let disable = false
|
|
36
|
+
export let content: HTMLDivElement | undefined = undefined
|
|
37
|
+
let activator: HTMLDivElement
|
|
38
|
+
|
|
39
|
+
beforeNavigate(() => hideOnNav && hide())
|
|
40
|
+
|
|
41
|
+
onMount(() => {
|
|
42
|
+
if (disable) return
|
|
43
|
+
|
|
44
|
+
const triggerTarget = activator.querySelector('button, input') || activator
|
|
45
|
+
const focusables = Array.from(
|
|
46
|
+
content!.querySelectorAll<HTMLInputElement>(
|
|
47
|
+
'a[href], button, input, textarea, select, details, [tabindex]'
|
|
48
|
+
)
|
|
49
|
+
)
|
|
50
|
+
tip = tippy(activator, {
|
|
51
|
+
content,
|
|
52
|
+
placement: 'bottom-start',
|
|
53
|
+
theme: 'dropdown',
|
|
54
|
+
arrow: false,
|
|
55
|
+
triggerTarget,
|
|
56
|
+
trigger: 'click focus',
|
|
57
|
+
interactive: true,
|
|
58
|
+
interactiveDebounce: 50,
|
|
59
|
+
appendTo: 'parent',
|
|
60
|
+
onShown() {
|
|
61
|
+
if (autofocus) focusables[0]?.select()
|
|
62
|
+
},
|
|
63
|
+
...tippyProps
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
if (useSingleton && tip) {
|
|
67
|
+
tips.push(tip)
|
|
68
|
+
sigleton?.setInstances(tips)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const lastFocusable = focusables.at(-1)
|
|
72
|
+
if (hideOnBlur) lastFocusable?.addEventListener('blur', hide)
|
|
73
|
+
|
|
74
|
+
return () => {
|
|
75
|
+
if (hideOnBlur) lastFocusable?.removeEventListener('blur', hide)
|
|
76
|
+
if (useSingleton && tip) {
|
|
77
|
+
tips.splice(tips.indexOf(tip), 1)
|
|
78
|
+
tip.destroy()
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
export function hide() {
|
|
84
|
+
if (!tip) return
|
|
85
|
+
if (useSingleton) sigleton?.hide()
|
|
86
|
+
else tip.hide()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function show() {
|
|
90
|
+
tip?.show()
|
|
91
|
+
}
|
|
92
|
+
export function setTippyProps(props: Partial<TippyProps>) {
|
|
93
|
+
tip?.setProps(props)
|
|
94
|
+
}
|
|
86
95
|
</script>
|
|
87
96
|
|
|
88
97
|
{#if !disable}
|
|
@@ -18,6 +18,7 @@ declare const __propDef: {
|
|
|
18
18
|
hide?: (() => void) | undefined;
|
|
19
19
|
show?: (() => void) | undefined;
|
|
20
20
|
setTippyProps?: ((props: Partial<TippyProps>) => void) | undefined;
|
|
21
|
+
children?: import("svelte").Snippet<[]> | undefined;
|
|
21
22
|
};
|
|
22
23
|
events: {
|
|
23
24
|
[evt: string]: CustomEvent<any>;
|