@finema/finework-layer 0.0.17 → 0.1.2

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.
@@ -1,13 +1,7 @@
1
1
  <template>
2
- <LayoutAdmin
3
- label="Test Layout"
4
- :sidebar-items="sidebarItems"
5
- :is-sidebar-group="true"
6
- >
7
- <p>
8
- dasdasd
9
- </p>
10
- </LayoutAdmin>
2
+ <LayoutUser>
3
+ <p>dasdasd</p>
4
+ </LayoutUser>
11
5
  </template>
12
6
 
13
7
  <script lang="ts" setup>
@@ -39,7 +33,8 @@ auth.me.set({
39
33
  position: 'Technical Specialist',
40
34
  team_code: 'DEV',
41
35
  company: 'finema',
42
- avatar_url: 'https://avatars.slack-edge.com/2023-09-25/5968557597936_c750902e3ffc4f690d80_512.jpg',
36
+ avatar_url:
37
+ 'https://avatars.slack-edge.com/2023-09-25/5968557597936_c750902e3ffc4f690d80_512.jpg',
43
38
  slack_id: 'U0147KLKKH8',
44
39
  azure_id: 'fd7fbb55-a249-4b79-b439-2270981bd3ae',
45
40
  is_active: true,
package/CHANGELOG.md CHANGED
@@ -1,6 +1,17 @@
1
1
  # Changelog
2
2
 
3
- ## [0.0.17](https://gitlab.finema.co/finema/finework/finework-frontend-layer/compare/0.0.16...0.0.17) (2025-10-14)
3
+ ## [0.1.2](https://gitlab.finema.co/finema/finework/finework-frontend-layer/compare/0.1.1...0.1.2) (2025-10-14)
4
+
5
+ ### Features
6
+
7
+ * layout user ([6bf83a1](https://gitlab.finema.co/finema/finework/finework-frontend-layer/commit/6bf83a15db0747323e6fd02555eab0b0c4e3e64e))
8
+
9
+ ## [0.1.1](https://gitlab.finema.co/finema/finework/finework-frontend-layer/compare/0.0.16...0.1.1) (2025-10-14)
10
+
11
+ ### Bug Fixes
12
+
13
+ * lint version ([0b2ef1f](https://gitlab.finema.co/finema/finework/finework-frontend-layer/commit/0b2ef1f822b8db97be7fd55a24be42f0fc65357d))
14
+ * version ([742da07](https://gitlab.finema.co/finema/finework/finework-frontend-layer/commit/742da076e250a965d1a2684430d522d3e901c3b6))
4
15
 
5
16
  ## [0.0.16](https://gitlab.finema.co/finema/finework/finework-frontend-layer/compare/0.0.15...0.0.16) (2025-10-14)
6
17
 
@@ -1,15 +1,20 @@
1
1
  <template>
2
2
  <aside
3
- :class="[`
3
+ :class="[
4
+ `
4
5
  flex h-full flex-col overflow-y-auto bg-white
5
6
  transition-all duration-300
6
- `]"
7
+ `,
8
+ ]"
7
9
  >
8
10
  <div
9
- :class="['flex h-[72px] items-center max-sm:pr-5', {
10
- 'justify-center': isCollapsed,
11
- 'w-[260px] justify-between pl-5': !isCollapsed,
12
- }]"
11
+ :class="[
12
+ 'flex h-[72px] items-center max-sm:pr-5',
13
+ {
14
+ 'justify-center': isCollapsed,
15
+ 'w-[260px] justify-between pl-5': !isCollapsed,
16
+ },
17
+ ]"
13
18
  >
14
19
  <NuxtLink :to="routes.home.to">
15
20
  <img
@@ -22,8 +27,10 @@
22
27
 
23
28
  <Navbar />
24
29
  </div>
25
- <div class="bg-primary flex items-center justify-between px-7 py-4 font-bold text-white">
26
- {{ isCollapsed ? '' : label }}
30
+ <div
31
+ class="bg-primary flex items-center justify-between px-7 py-4 font-bold text-white"
32
+ >
33
+ {{ isCollapsed ? "" : label }}
27
34
 
28
35
  <Icon
29
36
  v-if="!isCollapsed"
@@ -40,15 +47,8 @@
40
47
  </div>
41
48
 
42
49
  <div class="flex-1 overflow-y-auto border-r border-gray-200 p-4">
43
- <div
44
- v-if="isGroup"
45
- class="space-y-4 divide-y-1 divide-[#d9d9d9]"
46
- >
47
- <div
48
- v-for="group in navigationItems"
49
- :key="group.label"
50
- class="pb-4"
51
- >
50
+ <div v-if="isGroup" class="space-y-4 divide-y-1 divide-[#d9d9d9]">
51
+ <div v-for="group in navigationItems" :key="group.label" class="pb-4">
52
52
  <div class="mt-2 mb-2 text-[10px] font-semibold text-gray-400">
53
53
  {{ group.label }}
54
54
  </div>
@@ -69,8 +69,10 @@
69
69
  'hover:text-primary',
70
70
  'data-active:before:bg-white data-active:before:rounded-lg data-active:text-primary font-semibold',
71
71
  ],
72
- linkLeadingIcon: 'group-data-[state=open]:text-current text-current size-[24px] group-hover:text-primary',
73
- childList: 'border-none ms-0 pl-8 bg-gray-100 mt-2 py-1 rounded-lg',
72
+ linkLeadingIcon:
73
+ 'group-data-[state=open]:text-current text-current size-[24px] group-hover:text-primary',
74
+ childList:
75
+ 'border-none ms-0 pl-8 bg-gray-100 mt-2 py-1 rounded-lg',
74
76
  childLink: 'ps-0',
75
77
  childItem: 'ps-0',
76
78
  }"
@@ -96,7 +98,8 @@
96
98
  'hover:text-primary',
97
99
  'data-active:before:bg-white data-active:before:rounded-lg data-active:text-primary font-semibold',
98
100
  ],
99
- linkLeadingIcon: 'group-data-[state=open]:text-current text-current size-[24px] group-hover:text-primary ',
101
+ linkLeadingIcon:
102
+ 'group-data-[state=open]:text-current text-current size-[24px] group-hover:text-primary ',
100
103
  childList: 'border-none ms-0 pl-8 bg-gray-100 mt-2 py-1 rounded-lg',
101
104
  childLink: 'ps-0',
102
105
  childItem: 'ps-0',
@@ -104,10 +107,7 @@
104
107
  class="w-full justify-center"
105
108
  />
106
109
  </div>
107
- <div
108
- v-if="isMobile"
109
- class="border-t border-gray-100 p-3"
110
- >
110
+ <div v-if="isMobile" class="border-t border-gray-100 p-3">
111
111
  <div class="flex items-center justify-between gap-2">
112
112
  <div class="flex min-w-0 flex-1 items-center gap-3">
113
113
  <Avatar
@@ -120,7 +120,7 @@
120
120
  {{ auth.me.value?.display_name || auth.me.value?.full_name }}
121
121
  </p>
122
122
  <p class="text-muted truncate text-xs">
123
- {{ auth.me.value?.email || '' }}
123
+ {{ auth.me.value?.email || "" }}
124
124
  </p>
125
125
  </div>
126
126
  </div>
@@ -149,7 +149,7 @@ import type { NavigationMenuItem } from '@nuxt/ui'
149
149
  import { computed } from 'vue'
150
150
  import { useRoute } from 'vue-router'
151
151
  import type { Permission, UserModule } from '#imports'
152
- import Navbar from './Apps.vue'
152
+ import Navbar from '../Apps.vue'
153
153
 
154
154
  defineEmits<{
155
155
  'toggle-collapsed': []
@@ -166,7 +166,6 @@ const props = defineProps<{
166
166
  const route = useRoute()
167
167
  const auth = useAuth()
168
168
  const userMenuItems = [
169
-
170
169
  {
171
170
  label: 'View profile',
172
171
  icon: 'i-lucide-user',
@@ -193,13 +192,16 @@ const mappedItems = (items: NavigationMenuItem[]): NavigationMenuItem[] => {
193
192
 
194
193
  return {
195
194
  active: isChildCurrentlyActive,
196
- class: 'hover:bg-transparent hover:text-gray-700 hover:font-bold py-2 data-active:before:bg-transparent data-active:text-gray-700 data-active:font-bold',
195
+ class:
196
+ 'hover:bg-transparent hover:text-gray-700 hover:font-bold py-2 data-active:before:bg-transparent data-active:text-gray-700 data-active:font-bold',
197
197
  icon: '',
198
198
  ...child,
199
199
  }
200
200
  })
201
201
 
202
- const selfIsActive = item.to ? route.path.startsWith(String(item.to)) : false
202
+ const selfIsActive = item.to
203
+ ? route.path.startsWith(String(item.to))
204
+ : false
203
205
 
204
206
  const itemIsActive = selfIsActive || isAnyChildActive // A root item is active if its own link matches OR if any child is active
205
207
 
@@ -221,46 +223,52 @@ const mappedItems = (items: NavigationMenuItem[]): NavigationMenuItem[] => {
221
223
 
222
224
  // filter items base on auth.hasPermission and nested children , permissions: ['pmo:USER', 'pmo:ADMIN', 'pmo:SUPER']
223
225
  const filterItems = (items: NavigationMenuItem[]): NavigationMenuItem[] => {
224
- return items.filter((item) => {
225
- if (item.permissions && Array.isArray(item.permissions)) {
226
- // permissions: ['pmo:USER', 'pmo:ADMIN', 'pmo:SUPER'] => module: 'pmo', permissions: ['USER', 'ADMIN', 'SUPER']
227
- const permissionStrings = item.permissions as string[]
226
+ return items
227
+ .filter((item) => {
228
+ if (item.permissions && Array.isArray(item.permissions)) {
229
+ // permissions: ['pmo:USER', 'pmo:ADMIN', 'pmo:SUPER'] => module: 'pmo', permissions: ['USER', 'ADMIN', 'SUPER']
230
+ const permissionStrings = item.permissions as string[]
228
231
 
229
- // Extract module from first permission (all should have same module)
230
- const firstPermission = permissionStrings[0]
232
+ // Extract module from first permission (all should have same module)
233
+ const firstPermission = permissionStrings[0]
231
234
 
232
- if (!firstPermission) {
233
- return true
234
- }
235
+ if (!firstPermission) {
236
+ return true
237
+ }
235
238
 
236
- const [moduleStr] = firstPermission.split(':')
239
+ const [moduleStr] = firstPermission.split(':')
237
240
 
238
- // Extract all permission levels
239
- const permissionLevels = permissionStrings.map((p) => p.split(':')[1]) as Permission[]
241
+ // Extract all permission levels
242
+ const permissionLevels = permissionStrings.map(
243
+ (p) => p.split(':')[1],
244
+ ) as Permission[]
240
245
 
241
- return auth.hasPermission(moduleStr as UserModule, ...permissionLevels)
242
- }
246
+ return auth.hasPermission(moduleStr as UserModule, ...permissionLevels)
247
+ }
243
248
 
244
- // Recursively filter children
245
- if (item.children) {
246
- const filteredChildren = filterItems(item.children as NavigationMenuItem[])
249
+ // Recursively filter children
250
+ if (item.children) {
251
+ const filteredChildren = filterItems(
252
+ item.children as NavigationMenuItem[],
253
+ )
247
254
 
248
- // Only include parent if it has visible children or no permission requirement
249
- return filteredChildren.length > 0
250
- }
255
+ // Only include parent if it has visible children or no permission requirement
256
+ return filteredChildren.length > 0
257
+ }
251
258
 
252
- return true
253
- }).map((item) => {
254
- // Apply filtering to children
255
- if (item.children) {
256
- return {
257
- ...item,
258
- children: filterItems(item.children as NavigationMenuItem[]),
259
+ return true
260
+ })
261
+ .map((item) => {
262
+ // Apply filtering to children
263
+ if (item.children) {
264
+ return {
265
+ ...item,
266
+ children: filterItems(item.children as NavigationMenuItem[]),
267
+ }
259
268
  }
260
- }
261
269
 
262
- return item
263
- })
270
+ return item
271
+ })
264
272
  }
265
273
 
266
274
  const navigationItems = computed<NavigationMenuItem[]>(() => {
@@ -1,13 +1,16 @@
1
1
  <template>
2
2
  <div class="relative flex min-h-screen flex-1">
3
3
  <div
4
- :class="[`
4
+ :class="[
5
+ `
5
6
  fixed inset-0 z-30 hidden w-auto
6
7
  lg:block
7
- `, {
8
- 'max-w-[88px]': isCollapsed,
9
- 'max-w-[260px]': !isCollapsed,
10
- }]"
8
+ `,
9
+ {
10
+ 'max-w-[88px]': isCollapsed,
11
+ 'max-w-[260px]': !isCollapsed,
12
+ },
13
+ ]"
11
14
  >
12
15
  <Sidebar
13
16
  :label="label"
@@ -18,18 +21,17 @@
18
21
  />
19
22
  </div>
20
23
  <div
21
- :class="['w-full bg-gray-50', {
22
- 'lg:pl-[88px]': isCollapsed,
23
- 'lg:pl-[260px]': !isCollapsed,
24
- }]"
24
+ :class="[
25
+ 'w-full bg-gray-50',
26
+ {
27
+ 'lg:pl-[88px]': isCollapsed,
28
+ 'lg:pl-[260px]': !isCollapsed,
29
+ },
30
+ ]"
25
31
  >
26
32
  <nav
27
- class="
28
- fixed top-0 left-0 z-20 flex min-h-[64px] w-screen items-center justify-between
29
- gap-4 bg-white px-5 lg:min-h-[72px]
30
- lg:justify-end
31
- "
32
- style="box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.04);"
33
+ class="fixed top-0 left-0 z-20 flex min-h-[64px] w-screen items-center justify-between gap-4 bg-white px-5 lg:min-h-[72px] lg:justify-end"
34
+ style="box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.04)"
33
35
  >
34
36
  <div class="flex items-center gap-4">
35
37
  <Slideover
@@ -41,10 +43,7 @@
41
43
  side="left"
42
44
  >
43
45
  <svg
44
- class="
45
- cursor-pointer
46
- lg:hidden
47
- "
46
+ class="cursor-pointer lg:hidden"
48
47
  width="19"
49
48
  height="18"
50
49
  viewBox="0 0 19 18"
@@ -74,10 +73,7 @@
74
73
  <img
75
74
  src="/logo-mini.png"
76
75
  alt="logo_mini_color"
77
- class="
78
- w-[126px] min-w-[126px] lg:hidden
79
- lg:w-[172px] lg:min-w-[172px]
80
- "
76
+ class="w-[126px] min-w-[126px] lg:hidden lg:w-[172px] lg:min-w-[172px]"
81
77
  />
82
78
  </NuxtLink>
83
79
  <Apps class="lg:hidden" />
@@ -96,14 +92,12 @@
96
92
  }"
97
93
  >
98
94
  <div class="relative flex cursor-pointer items-center gap-2">
99
- <div
100
- class="hidden flex-col justify-end text-right lg:flex"
101
- >
95
+ <div class="hidden flex-col justify-end text-right lg:flex">
102
96
  <p class="font-bold">
103
97
  {{ auth.me.value?.display_name || auth.me.value?.full_name }}
104
98
  </p>
105
99
  <p class="text-muted text-sm">
106
- {{ auth.me.value?.email || '' }}
100
+ {{ auth.me.value?.email || "" }}
107
101
  </p>
108
102
  </div>
109
103
  <Avatar
@@ -111,22 +105,17 @@
111
105
  icon="ri:user-line"
112
106
  :src="auth.me.value?.avatar_url || ''"
113
107
  />
114
- <Icon
115
- name="i-ph:caret-down-light"
116
- class="size-5"
117
- />
108
+ <Icon name="i-ph:caret-down-light" class="size-5" />
118
109
  </div>
119
110
  </DropdownMenu>
120
111
  </div>
121
112
  </nav>
122
113
  <div class="w-full bg-gray-50 pt-[64px] lg:pt-[72px]">
123
- <main
124
- class="
125
- mx-auto min-h-full w-full flex-1 px-6 py-10 lg:px-8
126
- "
127
- >
114
+ <main class="mx-auto min-h-full w-full flex-1 px-6 py-10 lg:px-8">
128
115
  <Breadcrumb
129
- v-if="!app.pageMeta.isHideBreadcrumbs && breadcrumbsItems.length > 1"
116
+ v-if="
117
+ !app.pageMeta.isHideBreadcrumbs && breadcrumbsItems.length > 1
118
+ "
130
119
  :items="breadcrumbsItems"
131
120
  class="mb-6"
132
121
  :ui="{
@@ -136,17 +125,11 @@
136
125
  />
137
126
  <div
138
127
  v-if="app.pageMeta.title"
139
- class="
140
- mb-4 flex flex-col justify-between gap-1 md:mb-6 md:gap-4
141
- lg:flex-row lg:items-start
142
- "
128
+ class="mb-4 flex flex-col justify-between gap-1 md:mb-6 md:gap-4 lg:flex-row lg:items-start"
143
129
  >
144
130
  <div class="flex flex-1 flex-col">
145
131
  <h1
146
- class="
147
- text-3xl font-bold wrap-break-word
148
- lg:max-w-2/3
149
- "
132
+ class="text-3xl font-bold wrap-break-word lg:max-w-2/3"
150
133
  :title="app.pageMeta.title"
151
134
  >
152
135
  {{ app.pageMeta.title }}
@@ -154,10 +137,7 @@
154
137
  </h1>
155
138
 
156
139
  <div id="page-subtitle" />
157
- <p
158
- v-if="app.pageMeta.sub_title"
159
- class="text-[#475467]"
160
- >
140
+ <p v-if="app.pageMeta.sub_title" class="text-[#475467]">
161
141
  {{ app.pageMeta.sub_title }}
162
142
  </p>
163
143
  </div>
@@ -174,7 +154,7 @@
174
154
  import type { DropdownMenuItem, NavigationMenuItem } from '@nuxt/ui'
175
155
  import { computed } from 'vue'
176
156
  import Sidebar from './Sidebar.vue'
177
- import Apps from './Apps.vue'
157
+ import Apps from '../Apps.vue'
178
158
 
179
159
  defineProps<{
180
160
  label: string
@@ -0,0 +1,99 @@
1
+ <template>
2
+ <div class="overflow-hidden pt-[80px]">
3
+ <div class="flex min-h-[calc(100vh-80px)] flex-col">
4
+ <nav
5
+ class="fixed top-0 left-0 z-20 flex min-h-[80px] w-screen items-center justify-center bg-white"
6
+ style="box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.04)"
7
+ >
8
+ <div class="mx-auto flex w-full px-4 md:px-8">
9
+ <div class="flex items-center gap-4">
10
+ <NuxtLink :to="routes.home.to">
11
+ <img
12
+ src="/logo-mini.png"
13
+ alt="logo_mini"
14
+ class="h-[27px] w-[172px] cursor-pointer"
15
+ />
16
+ </NuxtLink>
17
+ <Apps />
18
+ </div>
19
+
20
+ <div class="flex flex-1 items-center justify-end gap-2">
21
+ <DropdownMenu
22
+ :items="userMenuItems"
23
+ size="xl"
24
+ :content="{
25
+ align: 'end',
26
+ side: 'bottom',
27
+ }"
28
+ :ui="{
29
+ content: 'w-48',
30
+ }"
31
+ >
32
+ <div class="relative flex cursor-pointer items-center gap-2">
33
+ <div class="hidden flex-col justify-end text-right lg:flex">
34
+ <p class="text-sm font-bold">
35
+ {{
36
+ auth.me.value?.display_name || auth.me.value?.full_name
37
+ }}
38
+ </p>
39
+ <p class="text-muted text-xs">
40
+ {{ auth.me.value?.email }}
41
+ </p>
42
+ </div>
43
+ <Avatar
44
+ class="border-muted size-[36px] border text-2xl"
45
+ icon="ri:user-line"
46
+ :src="auth.me.value?.avatar_url"
47
+ />
48
+ <Icon name="i-ph:caret-down-light" class="size-5" />
49
+ </div>
50
+ </DropdownMenu>
51
+ </div>
52
+ </div>
53
+ </nav>
54
+ <main class="mx-auto w-full max-w-7xl flex-1 px-4 pb-20 2xl:max-w-7/10">
55
+ <div
56
+ v-if="app.pageMeta.title"
57
+ class="mb-4 flex flex-col justify-between gap-1 md:mb-6 md:gap-4 lg:flex-row lg:items-center"
58
+ >
59
+ <div class="flex flex-1 flex-col">
60
+ <h1
61
+ class="text-3xl font-bold wrap-break-word lg:max-w-2/3"
62
+ :title="app.pageMeta.title"
63
+ >
64
+ {{ app.pageMeta.title }}
65
+ <span id="page-title-extra" />
66
+ </h1>
67
+
68
+ <div id="page-subtitle" />
69
+ </div>
70
+ <div id="page-header" />
71
+ </div>
72
+ <slot />
73
+ </main>
74
+ <div id="page-footer" />
75
+ </div>
76
+ </div>
77
+ </template>
78
+
79
+ <script lang="ts" setup>
80
+ import type { DropdownMenuItem } from '@nuxt/ui'
81
+ import Apps from '../Apps.vue'
82
+
83
+ const app = useApp()
84
+ const auth = useAuth()
85
+ const userMenuItems: DropdownMenuItem[] = [
86
+ {
87
+ label: 'View profile',
88
+ icon: 'i-lucide-user',
89
+ to: routes.account.profile.to,
90
+ },
91
+
92
+ {
93
+ label: routes.logout.label,
94
+ icon: 'i-lucide-log-out',
95
+ to: routes.logout.to,
96
+ external: true,
97
+ },
98
+ ]
99
+ </script>
package/bun.lock CHANGED
@@ -7,7 +7,7 @@
7
7
  "@finema/core": "^2.43.2",
8
8
  },
9
9
  "devDependencies": {
10
- "@finema/eslint-config": "^2.0.2",
10
+ "@finema/eslint-config": "^2.0.3",
11
11
  "@nuxt/eslint": "latest",
12
12
  "@nuxt/test-utils": "^3.19.2",
13
13
  "@release-it/conventional-changelog": "^10.0.1",
@@ -176,6 +176,8 @@
176
176
 
177
177
  "@eslint/core": ["@eslint/core@0.16.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q=="],
178
178
 
179
+ "@eslint/css-tree": ["@eslint/css-tree@3.6.6", "", { "dependencies": { "mdn-data": "2.23.0", "source-map-js": "^1.0.1" } }, "sha512-C3YiJMY9OZyZ/3vEMFWJIesdGaRY6DmIYvmtyxMT934CbrOKqRs+Iw7NWSRlJQEaK4dPYy2lZ2y1zkaj8z0p5A=="],
180
+
179
181
  "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="],
180
182
 
181
183
  "@eslint/js": ["@eslint/js@9.37.0", "", {}, "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg=="],
@@ -186,7 +188,7 @@
186
188
 
187
189
  "@finema/core": ["@finema/core@2.43.2", "", { "dependencies": { "@iconify-json/heroicons": "^1.2.2", "@iconify-json/ph": "^1.2.2", "@iconify-json/svg-spinners": "^1.2.2", "@nuxt/kit": "^4.0.2", "@nuxt/ui": "^4.0.1", "@pinia/nuxt": "^0.11.0", "@tailwindcss/typography": "^0.5.0-alpha.3", "@tiptap/extension-image": "^3.0.7", "@tiptap/extension-link": "^3.0.7", "@tiptap/extension-text-align": "^3.0.7", "@tiptap/extension-text-style": "^3.0.7", "@tiptap/extension-underline": "^3.0.7", "@tiptap/extension-youtube": "^3.0.7", "@tiptap/pm": "^3.0.7", "@tiptap/starter-kit": "^3.0.7", "@tiptap/vue-3": "^3.0.7", "@vee-validate/nuxt": "^4.15.1", "@vee-validate/valibot": "^4.15.1", "@vuepic/vue-datepicker": "^11.0.2", "@vueuse/components": "^13.2.0", "@vueuse/core": "^13.4.0", "@wdns/vue-code-block": "^2.3.5", "axios": "^1.10.0", "date-fns": "^4.1.0", "date-fns-tz": "^3.2.0", "defu": "^6.1.4", "lodash-es": "^4.17.21", "maska": "^3.1.1", "url-join": "^5.0.0" } }, "sha512-/JrFnsj6zskoZyIEDUK4G21ariM/i/MweuZmVODhHOZ2A+5t779rEt4scR1u4nt7vNKDmeTY40NfmphNZxJjiQ=="],
188
190
 
189
- "@finema/eslint-config": ["@finema/eslint-config@2.0.2", "", { "dependencies": { "eslint-plugin-tailwindcss": "^3.18.2", "eslint-plugin-unused-imports": "^4.2.0" }, "peerDependencies": { "eslint": "^9.37.0" } }, "sha512-0UQoCuU8nIHG3/H0XgFmbNZfvuB5OX4OEIKgakIBfjkn8Dpq9xnzwLvH9S1Dt4PWmzT+bKdSLCJ7waefO/2nzQ=="],
191
+ "@finema/eslint-config": ["@finema/eslint-config@2.0.3", "", { "dependencies": { "eslint-plugin-better-tailwindcss": "^3.7.10", "eslint-plugin-tailwindcss": "^3.18.2", "eslint-plugin-unused-imports": "^4.2.0" }, "peerDependencies": { "eslint": "^9.37.0" } }, "sha512-cKayHHZLTp/cA1q9ohowBcNWqpMZcA3zYcw8W7JkB89B+cyT1hYUOIi046cUEW23mFTfsSKUVIeW/C+BKpXuXQ=="],
190
192
 
191
193
  "@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="],
192
194
 
@@ -478,6 +480,8 @@
478
480
 
479
481
  "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
480
482
 
483
+ "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="],
484
+
481
485
  "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="],
482
486
 
483
487
  "@poppinss/colors": ["@poppinss/colors@4.1.5", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw=="],
@@ -1206,6 +1210,8 @@
1206
1210
 
1207
1211
  "eslint-merge-processors": ["eslint-merge-processors@2.0.0", "", { "peerDependencies": { "eslint": "*" } }, "sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA=="],
1208
1212
 
1213
+ "eslint-plugin-better-tailwindcss": ["eslint-plugin-better-tailwindcss@3.7.10", "", { "dependencies": { "@eslint/css-tree": "^3.6.5", "enhanced-resolve": "^5.18.3", "jiti": "^2.5.1", "postcss": "^8.5.6", "postcss-import": "^16.1.1", "synckit": "^0.11.11", "tailwind-csstree": "^0.1.4", "tsconfig-paths-webpack-plugin": "^4.2.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", "tailwindcss": "^3.3.0 || ^4.1.6" } }, "sha512-a6Hif4A9lPJZwpoMir2WVs1ZL4IK6fzwbZvVhQQchoqqg3BycL+ZGLHGIuqKBqwnZgOC6olwmu0sDzM3uSkEFw=="],
1214
+
1209
1215
  "eslint-plugin-import-lite": ["eslint-plugin-import-lite@0.3.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/types": "^8.34.0" }, "peerDependencies": { "eslint": ">=9.0.0", "typescript": ">=4.5" }, "optionalPeers": ["typescript"] }, "sha512-dkNBAL6jcoCsXZsQ/Tt2yXmMDoNt5NaBh/U7yvccjiK8cai6Ay+MK77bMykmqQA2bTF6lngaLCDij6MTO3KkvA=="],
1210
1216
 
1211
1217
  "eslint-plugin-import-x": ["eslint-plugin-import-x@4.16.1", "", { "dependencies": { "@typescript-eslint/types": "^8.35.0", "comment-parser": "^1.4.1", "debug": "^4.4.1", "eslint-import-context": "^0.1.9", "is-glob": "^4.0.3", "minimatch": "^9.0.3 || ^10.0.1", "semver": "^7.7.2", "stable-hash-x": "^0.2.0", "unrs-resolver": "^1.9.2" }, "peerDependencies": { "@typescript-eslint/utils": "^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "eslint-import-resolver-node": "*" }, "optionalPeers": ["@typescript-eslint/utils", "eslint-import-resolver-node"] }, "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ=="],
@@ -1608,7 +1614,7 @@
1608
1614
 
1609
1615
  "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
1610
1616
 
1611
- "mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="],
1617
+ "mdn-data": ["mdn-data@2.23.0", "", {}, "sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ=="],
1612
1618
 
1613
1619
  "mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="],
1614
1620
 
@@ -1786,6 +1792,8 @@
1786
1792
 
1787
1793
  "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="],
1788
1794
 
1795
+ "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="],
1796
+
1789
1797
  "pinia": ["pinia@3.0.3", "", { "dependencies": { "@vue/devtools-api": "^7.7.2" }, "peerDependencies": { "typescript": ">=4.4.4", "vue": "^2.7.0 || ^3.5.11" }, "optionalPeers": ["typescript"] }, "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA=="],
1790
1798
 
1791
1799
  "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="],
@@ -1808,6 +1816,8 @@
1808
1816
 
1809
1817
  "postcss-discard-overridden": ["postcss-discard-overridden@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg=="],
1810
1818
 
1819
+ "postcss-import": ["postcss-import@16.1.1", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ=="],
1820
+
1811
1821
  "postcss-merge-longhand": ["postcss-merge-longhand@7.0.5", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^7.0.5" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw=="],
1812
1822
 
1813
1823
  "postcss-merge-rules": ["postcss-merge-rules@7.0.6", "", { "dependencies": { "browserslist": "^4.25.1", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.1", "postcss-selector-parser": "^7.1.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ=="],
@@ -1924,6 +1934,8 @@
1924
1934
 
1925
1935
  "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="],
1926
1936
 
1937
+ "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="],
1938
+
1927
1939
  "read-package-up": ["read-package-up@11.0.0", "", { "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", "type-fest": "^4.6.0" } }, "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ=="],
1928
1940
 
1929
1941
  "read-pkg": ["read-pkg@9.0.1", "", { "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", "parse-json": "^8.0.0", "type-fest": "^4.6.0", "unicorn-magic": "^0.1.0" } }, "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA=="],
@@ -2072,6 +2084,8 @@
2072
2084
 
2073
2085
  "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
2074
2086
 
2087
+ "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
2088
+
2075
2089
  "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="],
2076
2090
 
2077
2091
  "strip-indent": ["strip-indent@4.1.1", "", {}, "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA=="],
@@ -2094,10 +2108,14 @@
2094
2108
 
2095
2109
  "swrv": ["swrv@1.1.0", "", { "peerDependencies": { "vue": ">=3.2.26 < 4" } }, "sha512-pjllRDr2s0iTwiE5Isvip51dZGR7GjLH1gCSVyE8bQnbAx6xackXsFdojau+1O5u98yHF5V73HQGOFxKUXO9gQ=="],
2096
2110
 
2111
+ "synckit": ["synckit@0.11.11", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw=="],
2112
+
2097
2113
  "system-architecture": ["system-architecture@0.1.0", "", {}, "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA=="],
2098
2114
 
2099
2115
  "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="],
2100
2116
 
2117
+ "tailwind-csstree": ["tailwind-csstree@0.1.4", "", {}, "sha512-FzD187HuFIZEyeR7Xy6sJbJll2d4SybS90satC8SKIuaNRC05CxMvdzN7BUsfDQffcnabckRM5OIcfArjsZ0mg=="],
2118
+
2101
2119
  "tailwind-merge": ["tailwind-merge@3.3.1", "", {}, "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g=="],
2102
2120
 
2103
2121
  "tailwind-variants": ["tailwind-variants@3.1.1", "", { "peerDependencies": { "tailwind-merge": ">=3.0.0", "tailwindcss": "*" }, "optionalPeers": ["tailwind-merge"] }, "sha512-ftLXe3krnqkMHsuBTEmaVUXYovXtPyTK7ckEfDRXS8PBZx0bAUas+A0jYxuKA5b8qg++wvQ3d2MQ7l/xeZxbZQ=="],
@@ -2132,6 +2150,10 @@
2132
2150
 
2133
2151
  "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="],
2134
2152
 
2153
+ "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="],
2154
+
2155
+ "tsconfig-paths-webpack-plugin": ["tsconfig-paths-webpack-plugin@4.2.0", "", { "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", "tapable": "^2.2.1", "tsconfig-paths": "^4.1.2" } }, "sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA=="],
2156
+
2135
2157
  "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
2136
2158
 
2137
2159
  "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
@@ -2434,6 +2456,8 @@
2434
2456
 
2435
2457
  "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
2436
2458
 
2459
+ "css-tree/mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="],
2460
+
2437
2461
  "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="],
2438
2462
 
2439
2463
  "dot-prop/type-fest": ["type-fest@5.1.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-wQ531tuWvB6oK+pchHIu5lHe5f5wpSCqB8Kf4dWQRbOYc9HTge7JL0G4Qd44bh6QuJCccIzL3bugb8GI0MwHrg=="],
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@finema/finework-layer",
3
3
  "type": "module",
4
- "version": "0.0.17",
4
+ "version": "0.1.2",
5
5
  "main": "./nuxt.config.ts",
6
6
  "scripts": {
7
7
  "dev": "nuxi dev .playground -o",
@@ -16,7 +16,7 @@
16
16
  "postinstall": "nuxt prepare .playground"
17
17
  },
18
18
  "devDependencies": {
19
- "@finema/eslint-config": "^2.0.2",
19
+ "@finema/eslint-config": "^2.0.3",
20
20
  "@nuxt/eslint": "latest",
21
21
  "@nuxt/test-utils": "^3.19.2",
22
22
  "@release-it/conventional-changelog": "^10.0.1",