viur-ui 0.0.1

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.
Files changed (114) hide show
  1. package/README.md +79 -0
  2. package/index.d.ts +351 -0
  3. package/index.js +46 -0
  4. package/package.json +84 -0
  5. package/src/components/Browser/Browser.vue +496 -0
  6. package/src/components/Browser/TreeNav.vue +408 -0
  7. package/src/components/Browser/ViurBrowser.d.vue.ts +64 -0
  8. package/src/components/Browser/ViurBrowser.vue +271 -0
  9. package/src/components/Browser/dragSession.ts +134 -0
  10. package/src/components/Browser/index.ts +14 -0
  11. package/src/components/Browser/types.ts +30 -0
  12. package/src/components/DataTable/ColumnFilterPanel.vue +225 -0
  13. package/src/components/DataTable/DataTable.vue +3155 -0
  14. package/src/components/DataTable/ViurDataTable.d.vue.ts +72 -0
  15. package/src/components/DataTable/ViurDataTable.vue +331 -0
  16. package/src/components/DataTable/columns.ts +400 -0
  17. package/src/components/DataTable/index.ts +60 -0
  18. package/src/components/DataTable/rows.ts +446 -0
  19. package/src/components/DataTable/types.ts +267 -0
  20. package/src/components/DataTable/useColumnLayout.ts +294 -0
  21. package/src/components/DataTable/useGridNavigation.ts +193 -0
  22. package/src/components/DataTable/useVirtualRows.ts +126 -0
  23. package/src/components/DataTable/viurColumns.ts +330 -0
  24. package/src/forms/ViForm.d.vue.ts +106 -0
  25. package/src/forms/ViForm.vue +592 -0
  26. package/src/forms/ViFormCategory.vue +57 -0
  27. package/src/forms/bones/Bone.vue +1023 -0
  28. package/src/forms/bones/BoneActions.vue +127 -0
  29. package/src/forms/bones/BoneLabel.vue +122 -0
  30. package/src/forms/bones/BoneMultipleList.vue +91 -0
  31. package/src/forms/bones/BoneMultipleWrapper.vue +105 -0
  32. package/src/forms/bones/BoneNestedWrapper.vue +155 -0
  33. package/src/forms/bones/BoneSingleEntry.vue +51 -0
  34. package/src/forms/bones/FilterBone.vue +694 -0
  35. package/src/forms/bones/actionbar/defaultBar.vue +98 -0
  36. package/src/forms/bones/actionbar/fileBar.vue +165 -0
  37. package/src/forms/bones/actionbar/relationalBar.vue +125 -0
  38. package/src/forms/bones/actions/ActionDialog.vue +70 -0
  39. package/src/forms/bones/actions/Debug.vue +106 -0
  40. package/src/forms/bones/actions/Delete.vue +13 -0
  41. package/src/forms/bones/actions/DescribeImage.vue +201 -0
  42. package/src/forms/bones/actions/Download.vue +27 -0
  43. package/src/forms/bones/actions/Placeholder.vue +14 -0
  44. package/src/forms/bones/actions/Translation.vue +238 -0
  45. package/src/forms/bones/actions/index.js +280 -0
  46. package/src/forms/bones/bone.d.ts +45 -0
  47. package/src/forms/bones/country_information.json +779 -0
  48. package/src/forms/bones/index.js +225 -0
  49. package/src/forms/bones/uploadAdapter.js +46 -0
  50. package/src/forms/bones/utils.js +284 -0
  51. package/src/forms/bones/view/base_item.vue +35 -0
  52. package/src/forms/bones/view/boneLogic.js +202 -0
  53. package/src/forms/bones/view/index.js +5 -0
  54. package/src/forms/bones/widgets/booleanBone.vue +83 -0
  55. package/src/forms/bones/widgets/booleanBoneChoose.vue +57 -0
  56. package/src/forms/bones/widgets/booleanBoneSelect.vue +58 -0
  57. package/src/forms/bones/widgets/codeBone.vue +214 -0
  58. package/src/forms/bones/widgets/colorBone.vue +75 -0
  59. package/src/forms/bones/widgets/dateBone.vue +114 -0
  60. package/src/forms/bones/widgets/emailBone.vue +100 -0
  61. package/src/forms/bones/widgets/fileBone.vue +273 -0
  62. package/src/forms/bones/widgets/jsonBone.vue +63 -0
  63. package/src/forms/bones/widgets/keyBone.vue +71 -0
  64. package/src/forms/bones/widgets/numericBone.vue +125 -0
  65. package/src/forms/bones/widgets/passwordBone.vue +215 -0
  66. package/src/forms/bones/widgets/phoneBone.vue +173 -0
  67. package/src/forms/bones/widgets/rawBone.vue +94 -0
  68. package/src/forms/bones/widgets/recordBone.vue +64 -0
  69. package/src/forms/bones/widgets/relationalBone.vue +164 -0
  70. package/src/forms/bones/widgets/relationalBoneSelect.vue +120 -0
  71. package/src/forms/bones/widgets/selectBone.vue +122 -0
  72. package/src/forms/bones/widgets/selectBoneChoose.vue +104 -0
  73. package/src/forms/bones/widgets/spatialBone.vue +111 -0
  74. package/src/forms/bones/widgets/stringBone.vue +139 -0
  75. package/src/forms/bones/widgets/textBone.vue +641 -0
  76. package/src/forms/install.d.ts +4 -0
  77. package/src/forms/install.js +43 -0
  78. package/src/forms/layouts/LayloutList2Columns.vue +57 -0
  79. package/src/forms/layouts/LayoutCategory.vue +38 -0
  80. package/src/forms/layouts/LayoutList.vue +31 -0
  81. package/src/forms/utils.js +601 -0
  82. package/src/public/assets/icons/fontawesome-manifest.json +8 -0
  83. package/src/public/assets/icons/regular/file.svg +1 -0
  84. package/src/public/assets/icons/solid/arrows-left-right.svg +1 -0
  85. package/src/public/assets/icons/solid/bug.svg +1 -0
  86. package/src/public/assets/icons/solid/check.svg +1 -0
  87. package/src/public/assets/icons/solid/circle-info.svg +1 -0
  88. package/src/public/assets/icons/solid/compress.svg +1 -0
  89. package/src/public/assets/icons/solid/download.svg +1 -0
  90. package/src/public/assets/icons/solid/expand.svg +1 -0
  91. package/src/public/assets/icons/solid/grip-vertical.svg +1 -0
  92. package/src/public/assets/icons/solid/plus.svg +1 -0
  93. package/src/public/assets/icons/solid/question.svg +1 -0
  94. package/src/public/assets/icons/solid/triangle-exclamation.svg +1 -0
  95. package/src/public/assets/icons/solid/upload.svg +1 -0
  96. package/src/public/assets/icons/solid/xmark.svg +1 -0
  97. package/src/request/cache.js +183 -0
  98. package/src/request/configStore.js +516 -0
  99. package/src/request/envelope.js +211 -0
  100. package/src/request/index.js +35 -0
  101. package/src/request/messageStore.js +201 -0
  102. package/src/request/request.js +752 -0
  103. package/src/request/skel.js +90 -0
  104. package/src/theme/colorStore.js +168 -0
  105. package/src/translations/de.js +178 -0
  106. package/src/translations/en.js +177 -0
  107. package/src/user/LoginScreen.d.vue.ts +54 -0
  108. package/src/user/LoginScreen.vue +627 -0
  109. package/src/user/google.js +75 -0
  110. package/src/user/index.js +3 -0
  111. package/src/user/store.d.ts +59 -0
  112. package/src/user/store.js +183 -0
  113. package/src/webawesomeCompat.css +72 -0
  114. package/src/webawesomeConfig.js +61 -0
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Werte des UserSkel, wie das Backend sie liefert. Nur die Felder, auf die sich
3
+ * der Store selbst stützt, sind benannt — der Rest bleibt offen, weil das Skel
4
+ * pro Projekt erweitert wird.
5
+ */
6
+ export interface UserSkelValues {
7
+ key?: string
8
+ name?: string
9
+ firstname?: string
10
+ lastname?: string
11
+ access?: string[]
12
+ status?: number | string
13
+ [field: string]: unknown
14
+ }
15
+
16
+ export type UserStatus = "unknown" | "loading" | "authenticated" | "anonymous"
17
+
18
+ export interface UserStoreState {
19
+ /** Angemeldeter Benutzer oder null. */
20
+ user: UserSkelValues | null
21
+ status: UserStatus
22
+ /** Renderer der Requests (Standard: VITE_DEFAULT_RENDERER oder "json"). */
23
+ renderer: string
24
+ googleClientId: string | null
25
+ }
26
+
27
+ /**
28
+ * Der Store, wie ihn `useUserStore()` liefert. Die Getter stehen als Werte da,
29
+ * weil Pinia die Refs eines Setup-Stores am Store-Objekt entpackt.
30
+ */
31
+ export interface UserStore {
32
+ state: UserStoreState
33
+ isLoggedIn: boolean
34
+ /** Rechte des Benutzers (leer, wenn keiner angemeldet ist). */
35
+ access: string[]
36
+ isRoot: boolean
37
+ isAdmin: boolean
38
+ /** Root gilt immer als berechtigt. */
39
+ hasAccess: (right: string) => boolean
40
+ /** Kurzform des Namens für Oberflächen, "-" ohne Benutzer. */
41
+ shortName: string
42
+ configure: (options?: { renderer?: string; googleClientId?: string | null }) => void
43
+ /** Session laden. Ergibt null, wenn niemand angemeldet ist (401). */
44
+ fetchSelf: () => Promise<UserSkelValues | null>
45
+ logout: () => Promise<void>
46
+ reset: () => void
47
+ /**
48
+ * Klassische Kette (viur-core 3.9): einen Schritt per GET rendern — Endpunkt
49
+ * unterhalb von `user` (Standard "login") oder eine Server-URL. Liefert die
50
+ * normalisierte Antwort; wirft bei einem Transportfehler.
51
+ */
52
+ loadLoginStep: (target?: string) => Promise<Record<string, any>>
53
+ /** Primären Provider ohne eigenes Widget wählen; `next_url` ist sein erster Schritt. */
54
+ selectAuthenticationProvider: (provider: string) => Promise<Record<string, any>>
55
+ /** Google-Identity-Token anmelden; liefert die normalisierte Antwort. */
56
+ loginWithGoogle: (token: string) => Promise<Record<string, any> | null>
57
+ }
58
+
59
+ export declare function useUserStore(): UserStore
@@ -0,0 +1,183 @@
1
+ import { defineStore } from "pinia"
2
+ import { reactive, computed } from "vue"
3
+ import { createControllerFetch, resetState } from "../request/index.js"
4
+
5
+ // --------------------------------------------------------------------------- //
6
+ // User / session store (ViUR core 3.9, envelope v2) //
7
+ // --------------------------------------------------------------------------- //
8
+ //
9
+ // The LOGIN FLOW itself is driven generically by the multistep form component
10
+ // — `<ViForm module="user" action="login" multistep>` — which walks the v2
11
+ // envelope's `status`/`step`/`follow` chain (chooser → userpassword → 2FA →
12
+ // success). This store owns what does NOT fit a generic form step:
13
+ // • the SESSION: the current user + access gating (`fetchSelf`, `logout`)
14
+ // • Google sign-in via the Identity SDK token (`loginWithGoogle`)
15
+ // • the requests of the CLASSIC chain (viur-core 3.9, v1 JSON) that are not a
16
+ // form submit (`loadLoginStep`, `selectAuthenticationProvider`)
17
+ // On a completed login the consumer calls `fetchSelf()` to load the user.
18
+
19
+ const DEFAULT_RENDERER = import.meta.env.VITE_DEFAULT_RENDERER || "json"
20
+
21
+ /** Split a ViUR url into the parts createControllerFetch needs. */
22
+ function specFromUrl(url) {
23
+ const parsed = new URL(url, window.location.origin)
24
+ const segments = parsed.pathname.split("/").filter(Boolean)
25
+ return {
26
+ renderer: segments[0],
27
+ controller: segments.slice(1, -1),
28
+ endpoint: segments.at(-1),
29
+ query: parsed.search ? parsed.search.slice(1) : "",
30
+ }
31
+ }
32
+
33
+ /** One request through the viur-ui request layer → normalized (v2) body.
34
+ * Rejection propagates to the caller. */
35
+ async function apiRequest(url, { method = "GET", data = {}, secure = false, messages = true } = {}) {
36
+ const spec = specFromUrl(url)
37
+ const request = createControllerFetch({ endpoint: spec.endpoint, method, secure })
38
+ const result = request(spec.controller, "/", data, {
39
+ renderer: spec.renderer,
40
+ query: spec.query,
41
+ immediate: false,
42
+ messages,
43
+ })
44
+ await result.execute()
45
+ return result.data.value
46
+ }
47
+
48
+ export const useUserStore = defineStore("viurUser", () => {
49
+ const state = reactive({
50
+ user: null, // UserSkel values, or null
51
+ status: "unknown", // "unknown" | "loading" | "authenticated" | "anonymous"
52
+ renderer: DEFAULT_RENDERER,
53
+ googleClientId: null,
54
+ })
55
+
56
+ const userUrl = (endpoint) => `/${state.renderer}/user/${endpoint}`
57
+
58
+ // ── getters ────────────────────────────────────────────────────────────────
59
+ const isLoggedIn = computed(() => state.status === "authenticated" && !!state.user)
60
+ const access = computed(() => (Array.isArray(state.user?.access) ? state.user.access : []))
61
+ const isRoot = computed(() => access.value.includes("root"))
62
+ const isAdmin = computed(() => isRoot.value || access.value.includes("admin"))
63
+ function hasAccess(right) {
64
+ return isRoot.value || access.value.includes(right)
65
+ }
66
+ const shortName = computed(() => {
67
+ const u = state.user
68
+ if (!u) return "-"
69
+ if (u.firstname && u.lastname) return `${u.firstname[0]}. ${u.lastname}`
70
+ return u.lastname || u.firstname || u.name || "-"
71
+ })
72
+
73
+ function configure({ renderer, googleClientId } = {}) {
74
+ if (renderer) state.renderer = renderer
75
+ if (googleClientId !== undefined) state.googleClientId = googleClientId
76
+ }
77
+
78
+ // ── session ──────────────────────────────────────────────────────────────────
79
+ async function fetchSelf() {
80
+ state.status = "loading"
81
+ try {
82
+ // a 401 here is the normal "not logged in" answer — no feedback message
83
+ const body = await apiRequest(userUrl("view/self"), { method: "GET", messages: false })
84
+ state.user = body?.data ?? null
85
+ state.status = state.user ? "authenticated" : "anonymous"
86
+ return state.user
87
+ } catch (error) {
88
+ // 401 → not logged in (the expected "anonymous" signal)
89
+ state.user = null
90
+ state.status = "anonymous"
91
+ return null
92
+ }
93
+ }
94
+
95
+ async function logout() {
96
+ let follow = null
97
+ try {
98
+ const body = await apiRequest(userUrl("logout"), { method: "POST", secure: true })
99
+ follow = body?.follow ?? null
100
+ state.user = null
101
+ state.status = "anonymous"
102
+ await resetState() // drop cached skeys + request cache
103
+ } catch (error) {
104
+ // clear the session locally regardless of a failed request
105
+ state.user = null
106
+ state.status = "anonymous"
107
+ }
108
+ if (typeof follow === "string" && /^https?:\/\//.test(follow)) {
109
+ window.location.href = follow
110
+ }
111
+ }
112
+
113
+ function reset() {
114
+ state.user = null
115
+ state.status = "unknown"
116
+ }
117
+
118
+ // ── classic login chain (viur-core 3.9) ─────────────────────────────────────
119
+ // viur-core 3.9 answers in the classic v1 shape: `/user/login` offers the
120
+ // providers, every further step is a form of its own whose url the server
121
+ // hands out (provider / second factor targets, `params.action_url`). The
122
+ // login screen reports failures itself, so these requests stay silent.
123
+
124
+ /** GET-render a step: an endpoint below `user` ("login") or a server url. */
125
+ async function loadLoginStep(target = "login") {
126
+ const url = /^(\/|https?:\/\/)/.test(target) ? target : userUrl(target)
127
+ return apiRequest(url, { method: "GET", messages: false })
128
+ }
129
+
130
+ /** Choose a primary provider without a widget of its own; the answer's
131
+ * `next_url` is its first step. */
132
+ async function selectAuthenticationProvider(provider) {
133
+ return apiRequest(userUrl("select_authentication_provider"), {
134
+ method: "POST",
135
+ secure: true,
136
+ data: { provider },
137
+ messages: false,
138
+ })
139
+ }
140
+
141
+ // ── Google sign-in ────────────────────────────────────────────────────────────
142
+ // POST the GSI id-token. Returns the normalized envelope so the caller can
143
+ // complete (status success → the session was loaded via fetchSelf) or hand a
144
+ // 2FA `follow` to the multistep ViForm to continue in the generic flow.
145
+ // Returns null on a transport error.
146
+ async function loginWithGoogle(token) {
147
+ try {
148
+ const body = await apiRequest(userUrl("auth_googleaccount/login"), {
149
+ method: "POST",
150
+ secure: true,
151
+ data: { token },
152
+ })
153
+ if (body?.status === "success" || body?.action === "login_success") {
154
+ await fetchSelf()
155
+ }
156
+ return body
157
+ } catch (error) {
158
+ return null
159
+ }
160
+ }
161
+
162
+ return {
163
+ state,
164
+ // getters
165
+ isLoggedIn,
166
+ access,
167
+ isRoot,
168
+ isAdmin,
169
+ hasAccess,
170
+ shortName,
171
+ // config
172
+ configure,
173
+ // session
174
+ fetchSelf,
175
+ logout,
176
+ reset,
177
+ // classic login chain
178
+ loadLoginStep,
179
+ selectAuthenticationProvider,
180
+ // google
181
+ loginWithGoogle,
182
+ }
183
+ })
@@ -0,0 +1,72 @@
1
+ :root {
2
+ --sl-spacing-x-small: var(--wa-space-xs);
3
+ --sl-spacing-small: var(--wa-space-s);
4
+ --sl-spacing-medium: var(--wa-space-m);
5
+ --sl-spacing-large: var(--wa-space-l);
6
+
7
+ --sl-border-radius-medium: var(--wa-border-radius-m);
8
+ --sl-input-border-radius-medium: var(--wa-form-control-border-radius);
9
+ --sl-input-height-medium: var(--wa-form-control-height);
10
+ --sl-input-font-size-medium: var(--wa-font-size-m);
11
+
12
+ --sl-color-neutral-0: var(--wa-color-surface-default);
13
+ --sl-color-neutral-50: var(--wa-color-neutral-95);
14
+ --sl-color-neutral-100: var(--wa-color-neutral-90);
15
+ --sl-color-neutral-200: var(--wa-color-neutral-fill-normal);
16
+ --sl-color-neutral-300: var(--wa-color-surface-border);
17
+ --sl-color-neutral-400: var(--wa-color-neutral-border-normal);
18
+ --sl-color-neutral-500: var(--wa-color-neutral-60);
19
+ --sl-color-neutral-600: var(--wa-color-neutral-50);
20
+ --sl-color-neutral-700: var(--wa-color-neutral-40);
21
+ --sl-color-neutral-800: var(--wa-color-neutral-20);
22
+ --sl-color-neutral-900: var(--wa-color-text-normal);
23
+
24
+ --sl-color-gray-200: var(--wa-color-neutral-95);
25
+ --sl-color-gray-400: var(--wa-color-neutral-60);
26
+ --sl-color-gray-500: var(--wa-color-neutral-border-normal);
27
+
28
+ --sl-color-primary-500: var(--wa-color-brand-50);
29
+ --sl-color-primary-600: var(--wa-color-brand-60);
30
+ --sl-color-success-500: var(--wa-color-success-50);
31
+ --sl-color-success-600: var(--wa-color-success-60);
32
+ --sl-color-danger-500: var(--wa-color-danger-50);
33
+ --sl-color-danger-700: var(--wa-color-danger-70);
34
+
35
+ --sl-color-info-50: var(--wa-color-brand-95);
36
+ --sl-color-info-300: var(--wa-color-brand-90);
37
+ --sl-color-info-500: var(--wa-color-brand-60);
38
+ --sl-color-info-900: var(--wa-color-brand-30);
39
+ }
40
+
41
+ wa-input,
42
+ wa-textarea,
43
+ wa-select,
44
+ wa-combobox,
45
+ wa-checkbox,
46
+ wa-switch,
47
+ wa-radio-group,
48
+ wa-date-picker,
49
+ wa-color-picker {
50
+ --wa-form-control-required-content: "";
51
+ }
52
+
53
+ wa-input::part(form-control-label),
54
+ wa-input::part(label),
55
+ wa-textarea::part(form-control-label),
56
+ wa-textarea::part(label),
57
+ wa-select::part(form-control-label),
58
+ wa-select::part(label),
59
+ wa-combobox::part(form-control-label),
60
+ wa-combobox::part(label),
61
+ wa-checkbox::part(form-control-label),
62
+ wa-checkbox::part(label),
63
+ wa-switch::part(form-control-label),
64
+ wa-switch::part(label),
65
+ wa-radio-group::part(form-control-label),
66
+ wa-radio-group::part(label),
67
+ wa-date-picker::part(form-control-label),
68
+ wa-date-picker::part(label),
69
+ wa-color-picker::part(form-control-label),
70
+ wa-color-picker::part(label) {
71
+ display: none;
72
+ }
@@ -0,0 +1,61 @@
1
+ // Theme & base styles
2
+ import "@viur/webawesome/dist/styles/themes/awesome.css"
3
+ import "@viur/webawesome/dist/styles/webawesome.css"
4
+ import "./webawesomeCompat.css"
5
+
6
+ // Components
7
+ import "@viur/webawesome/dist/components/accordion/accordion"
8
+ import "@viur/webawesome/dist/components/alert/alert"
9
+ import "@viur/webawesome/dist/components/animation/animation"
10
+ import "@viur/webawesome/dist/components/avatar/avatar"
11
+ import "@viur/webawesome/dist/components/badge/badge"
12
+ import "@viur/webawesome/dist/components/breadcrumb/breadcrumb"
13
+ import "@viur/webawesome/dist/components/breadcrumb-item/breadcrumb-item"
14
+ import "@viur/webawesome/dist/components/button/button"
15
+ import "@viur/webawesome/dist/components/button-group/button-group"
16
+ import "@viur/webawesome/dist/components/callout/callout"
17
+ import "@viur/webawesome/dist/components/card/card"
18
+ import "@viur/webawesome/dist/components/checkbox/checkbox"
19
+ import "@viur/webawesome/dist/components/color-picker/color-picker"
20
+ import "@viur/webawesome/dist/components/combobox/combobox"
21
+ import "@viur/webawesome/dist/components/copy-button/copy-button"
22
+ import "@viur/webawesome/dist/components/details/details"
23
+ import "@viur/webawesome/dist/components/dialog/dialog"
24
+ import "@viur/webawesome/dist/components/divider/divider"
25
+ import "@viur/webawesome/dist/components/drawer/drawer"
26
+ import "@viur/webawesome/dist/components/dropdown/dropdown"
27
+ import "@viur/webawesome/dist/components/dropdown-item/dropdown-item"
28
+ import "@viur/webawesome/dist/components/format-bytes/format-bytes"
29
+ import "@viur/webawesome/dist/components/format-date/format-date"
30
+ import "@viur/webawesome/dist/components/format-number/format-number"
31
+ import "@viur/webawesome/dist/components/icon/icon"
32
+ import "@viur/webawesome/dist/components/input/input"
33
+ import "@viur/webawesome/dist/components/number-input/number-input"
34
+ import "@viur/webawesome/dist/components/option/option"
35
+ import "@viur/webawesome/dist/components/popover/popover"
36
+ import "@viur/webawesome/dist/components/progress-bar/progress-bar"
37
+ import "@viur/webawesome/dist/components/progress-ring/progress-ring"
38
+ import "@viur/webawesome/dist/components/radio/radio"
39
+ import "@viur/webawesome/dist/components/radio-group/radio-group"
40
+ import "@viur/webawesome/dist/components/select/select"
41
+ import "@viur/webawesome/dist/components/skeleton/skeleton"
42
+ import "@viur/webawesome/dist/components/slider/slider"
43
+ import "@viur/webawesome/dist/components/spinner/spinner"
44
+ import "@viur/webawesome/dist/components/split-panel/split-panel"
45
+ import "@viur/webawesome/dist/components/switch/switch"
46
+ import "@viur/webawesome/dist/components/tab/tab"
47
+ import "@viur/webawesome/dist/components/tab-group/tab-group"
48
+ import "@viur/webawesome/dist/components/tab-panel/tab-panel"
49
+ import "@viur/webawesome/dist/components/tag/tag"
50
+ import "@viur/webawesome/dist/components/textarea/textarea"
51
+ import "@viur/webawesome/dist/components/tooltip/tooltip"
52
+ import "@viur/webawesome/dist/components/tree/tree"
53
+ import "@viur/webawesome/dist/components/tree-item/tree-item"
54
+
55
+ import { setBasePath } from "@viur/webawesome/dist/utilities/base-path"
56
+
57
+ if (import.meta.env.DEV) {
58
+ setBasePath("/webawesome")
59
+ } else {
60
+ setBasePath("webawesome")
61
+ }