@skalfa/skalfa-component 1.0.8 → 1.0.9
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/accordion/Accordion.component.js +2 -3
- package/dist/breadcrumb/Breadcrumb.component.js +2 -3
- package/dist/button/Button.component.d.ts +2 -1
- package/dist/button/Button.component.js +2 -2
- package/dist/carousel/Carousel.component.js +2 -3
- package/dist/chip/Chip.component.js +2 -3
- package/dist/contexts-mock.d.ts +2 -0
- package/dist/contexts-mock.js +10 -0
- package/dist/input/Checkbox.component.js +2 -3
- package/dist/input/Input.component.d.ts +3 -2
- package/dist/input/Input.component.js +3 -3
- package/dist/input/InputCheckbox.component.js +1 -1
- package/dist/input/InputCurrency.component.d.ts +3 -2
- package/dist/input/InputCurrency.component.js +3 -3
- package/dist/input/InputDate.component.js +4 -5
- package/dist/input/InputDatetime.component.d.ts +3 -2
- package/dist/input/InputDatetime.component.js +3 -3
- package/dist/input/InputDocument.component.js +7 -8
- package/dist/input/InputImage.component.js +3 -4
- package/dist/input/InputNumber.component.js +3 -4
- package/dist/input/InputPassword.component.js +3 -3
- package/dist/input/InputRadio.component.js +1 -1
- package/dist/input/InputTime.component.js +3 -3
- package/dist/input/InputValues.component.js +3 -4
- package/dist/input/Select.component.js +6 -7
- package/dist/modal/FloatingPage.component.d.ts +3 -1
- package/dist/modal/FloatingPage.component.js +7 -3
- package/dist/modal/Modal.component.js +1 -2
- package/dist/modal/ModalConfirm.component.d.ts +2 -2
- package/dist/modal/ModalConfirm.component.js +14 -12
- package/dist/modal/Toast.component.js +1 -2
- package/dist/nav/Bottombar.component.d.ts +2 -2
- package/dist/nav/Bottombar.component.js +7 -8
- package/dist/nav/Footer.component.d.ts +2 -2
- package/dist/nav/Footer.component.js +6 -7
- package/dist/nav/Headbar.component.js +2 -3
- package/dist/nav/Navbar.component.d.ts +2 -2
- package/dist/nav/Navbar.component.js +3 -4
- package/dist/nav/Sidebar.component.d.ts +3 -7
- package/dist/nav/Sidebar.component.js +14 -17
- package/dist/supervision/FormSupervision.component.d.ts +4 -29
- package/dist/supervision/FormSupervision.component.js +84 -136
- package/dist/supervision/TableSupervision.component.d.ts +17 -26
- package/dist/supervision/TableSupervision.component.js +207 -193
- package/dist/table/ControlBar.component.js +15 -16
- package/dist/table/FilterComponent.js +4 -6
- package/dist/table/Pagination.component.js +2 -3
- package/dist/table/Table.component.js +3 -4
- package/dist/wrap/Swipe.component.js +2 -2
- package/package.json +18 -10
- package/src/accordion/Accordion.component.tsx +3 -3
- package/src/breadcrumb/Breadcrumb.component.tsx +4 -4
- package/src/button/Button.component.tsx +3 -3
- package/src/carousel/Carousel.component.tsx +4 -4
- package/src/chip/Chip.component.tsx +3 -4
- package/src/contexts-mock.ts +6 -0
- package/src/input/Checkbox.component.tsx +3 -3
- package/src/input/Input.component.tsx +6 -6
- package/src/input/InputCheckbox.component.tsx +1 -1
- package/src/input/InputCurrency.component.tsx +6 -6
- package/src/input/InputDate.component.tsx +6 -7
- package/src/input/InputDatetime.component.tsx +6 -6
- package/src/input/InputDocument.component.tsx +9 -9
- package/src/input/InputImage.component.tsx +4 -5
- package/src/input/InputNumber.component.tsx +7 -8
- package/src/input/InputPassword.component.tsx +4 -4
- package/src/input/InputRadio.component.tsx +1 -1
- package/src/input/InputTime.component.tsx +4 -4
- package/src/input/InputValues.component.tsx +5 -6
- package/src/input/Select.component.tsx +10 -10
- package/src/modal/FloatingPage.component.tsx +33 -3
- package/src/modal/Modal.component.tsx +1 -2
- package/src/modal/ModalConfirm.component.tsx +34 -49
- package/src/modal/Toast.component.tsx +1 -2
- package/src/nav/Bottombar.component.tsx +9 -10
- package/src/nav/Footer.component.tsx +8 -9
- package/src/nav/Headbar.component.tsx +3 -3
- package/src/nav/Navbar.component.tsx +9 -10
- package/src/nav/Sidebar.component.tsx +55 -46
- package/src/supervision/FormSupervision.component.tsx +203 -224
- package/src/supervision/TableSupervision.component.tsx +420 -455
- package/src/table/ControlBar.component.tsx +16 -16
- package/src/table/FilterComponent.tsx +9 -11
- package/src/table/Pagination.component.tsx +6 -6
- package/src/table/Table.component.tsx +5 -5
- package/src/wrap/Swipe.component.tsx +3 -3
- package/src/types.d.ts +0 -7
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client"
|
|
2
|
+
import { Icon, type IconName } from "@skalfa/skalfa-icon";
|
|
3
|
+
|
|
2
4
|
|
|
3
5
|
import { ReactNode, useEffect, useRef } from 'react'
|
|
4
|
-
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
5
|
-
import { faArrowDownZA, faArrowUpAZ, faEllipsisV, faEyeLowVision, faMagnifyingGlass, faPlus, faRefresh, faSearch, faSliders, faSort } from '@fortawesome/free-solid-svg-icons';
|
|
6
6
|
import { ApiFilterType, cn, conversion, shortcut, useResponsive } from '@utils';
|
|
7
7
|
import { useToggleContext } from '@contexts';
|
|
8
8
|
import { InputCheckboxComponent } from "../input/InputCheckbox.component";
|
|
@@ -121,7 +121,7 @@ export function ControlBarComponent({
|
|
|
121
121
|
<>
|
|
122
122
|
<div className={cn("control-bar", className)}>
|
|
123
123
|
{(isSm ? [
|
|
124
|
-
...(options?.filter((op
|
|
124
|
+
...(options?.filter((op) => op == "SEARCH" || op == "REFRESH") || []),
|
|
125
125
|
...(options && options?.length > 1 ? ['MOBILE_OPTION'] : [])
|
|
126
126
|
] : options)?.map((option: ControlBarOptionType, key: number) => {
|
|
127
127
|
{
|
|
@@ -133,7 +133,7 @@ export function ControlBarComponent({
|
|
|
133
133
|
return (
|
|
134
134
|
<div className="control-bar-create-wrapper" key="button-add">
|
|
135
135
|
<ButtonComponent
|
|
136
|
-
icon=
|
|
136
|
+
icon="solid/plus"
|
|
137
137
|
label="Tambah Data"
|
|
138
138
|
size="sm"
|
|
139
139
|
onClick={() => setToggle(`MODAL_FORM_${conversion.strSnake(id).toUpperCase()}`)}
|
|
@@ -156,7 +156,7 @@ export function ControlBarComponent({
|
|
|
156
156
|
ref={searchRef}
|
|
157
157
|
name="search"
|
|
158
158
|
placeholder="Cari disini..."
|
|
159
|
-
rightIcon=
|
|
159
|
+
rightIcon="solid/magnifying-glass"
|
|
160
160
|
value={search}
|
|
161
161
|
onChange={(e) => onSearch?.(e)}
|
|
162
162
|
className={cn("control-bar-search-input", searchable && "control-bar-search-input-searchable")}
|
|
@@ -175,7 +175,7 @@ export function ControlBarComponent({
|
|
|
175
175
|
<div className="control-bar-searchable-wrapper" key={key}>
|
|
176
176
|
<SelectComponent
|
|
177
177
|
name="searchableColumn"
|
|
178
|
-
leftIcon=
|
|
178
|
+
leftIcon="solid/search"
|
|
179
179
|
options={searchableOptions?.map((column) => {
|
|
180
180
|
return {
|
|
181
181
|
label: column.label,
|
|
@@ -200,7 +200,7 @@ export function ControlBarComponent({
|
|
|
200
200
|
return (
|
|
201
201
|
<div className="control-bar-button-wrapper" key={key}>
|
|
202
202
|
<ButtonComponent
|
|
203
|
-
icon=
|
|
203
|
+
icon="solid/eye-low-vision"
|
|
204
204
|
variant="outline"
|
|
205
205
|
className="control-bar-icon-button"
|
|
206
206
|
onClick={() => setToggle("SELECTABLE")}
|
|
@@ -243,7 +243,7 @@ export function ControlBarComponent({
|
|
|
243
243
|
return sortableOptions?.length ? (
|
|
244
244
|
<div className="control-bar-button-wrapper" key={key}>
|
|
245
245
|
<ButtonComponent
|
|
246
|
-
icon=
|
|
246
|
+
icon="solid/sort"
|
|
247
247
|
variant="outline"
|
|
248
248
|
className="control-bar-icon-button"
|
|
249
249
|
onClick={() => setToggle("SORT")}
|
|
@@ -270,7 +270,7 @@ export function ControlBarComponent({
|
|
|
270
270
|
|
|
271
271
|
{sortBy && (
|
|
272
272
|
<div className='control-bar-sort-active-icon'>
|
|
273
|
-
<
|
|
273
|
+
<Icon icon={sortBy == "desc" ? "solid/arrow-down-z-a" : "solid/arrow-up-a-z"} className='control-bar-sort-icon' />
|
|
274
274
|
{sort?.length && sort?.length > 1 && <span className='control-bar-sort-badge'>{sort.findIndex((s) => s.split(" ")?.at(0) == option?.selector) + 1}</span>}
|
|
275
275
|
</div>
|
|
276
276
|
)}
|
|
@@ -293,7 +293,7 @@ export function ControlBarComponent({
|
|
|
293
293
|
return (
|
|
294
294
|
<div className="control-bar-button-wrapper-refresh" key={key}>
|
|
295
295
|
<ButtonComponent
|
|
296
|
-
icon=
|
|
296
|
+
icon="solid/refresh"
|
|
297
297
|
variant="outline"
|
|
298
298
|
className="control-bar-icon-button"
|
|
299
299
|
onClick={() => onRefresh?.()}
|
|
@@ -312,7 +312,7 @@ export function ControlBarComponent({
|
|
|
312
312
|
return (
|
|
313
313
|
<div className="control-bar-button-wrapper" key={key}>
|
|
314
314
|
<ButtonComponent
|
|
315
|
-
icon=
|
|
315
|
+
icon="solid/sliders"
|
|
316
316
|
label="Filter"
|
|
317
317
|
variant="outline"
|
|
318
318
|
className="control-bar-filter-button"
|
|
@@ -332,7 +332,7 @@ export function ControlBarComponent({
|
|
|
332
332
|
return (
|
|
333
333
|
<div className="control-bar-button-wrapper" key={key}>
|
|
334
334
|
<ButtonComponent
|
|
335
|
-
icon=
|
|
335
|
+
icon="solid/ellipsis-v"
|
|
336
336
|
variant="outline"
|
|
337
337
|
className="control-bar-icon-button"
|
|
338
338
|
onClick={() => setToggle("MOBILE_OPTION")}
|
|
@@ -365,7 +365,7 @@ export function ControlBarComponent({
|
|
|
365
365
|
maxSize="98vh"
|
|
366
366
|
>
|
|
367
367
|
<div className='control-bar-mobile-container'>
|
|
368
|
-
{options?.filter((op, iop) => (iop != 0 && op != "CREATE" && op != "REFRESH"))?.map((option: ControlBarOptionType, key: number) => {
|
|
368
|
+
{options?.filter((op, iop) => (iop != 0 && op != "CREATE" && op != "SEARCH" && op != "REFRESH"))?.map((option: ControlBarOptionType, key: number) => {
|
|
369
369
|
{
|
|
370
370
|
// =========================>
|
|
371
371
|
// ## Search Field
|
|
@@ -377,7 +377,7 @@ export function ControlBarComponent({
|
|
|
377
377
|
<InputComponent
|
|
378
378
|
name="search"
|
|
379
379
|
placeholder="Cari disini..."
|
|
380
|
-
rightIcon=
|
|
380
|
+
rightIcon="solid/magnifying-glass"
|
|
381
381
|
value={search}
|
|
382
382
|
onChange={(e) => onSearch?.(e)}
|
|
383
383
|
/>
|
|
@@ -395,7 +395,7 @@ export function ControlBarComponent({
|
|
|
395
395
|
<div key={key}>
|
|
396
396
|
<SelectComponent
|
|
397
397
|
name="searchableColumn"
|
|
398
|
-
leftIcon=
|
|
398
|
+
leftIcon="solid/search"
|
|
399
399
|
options={searchableOptions?.map((column) => {
|
|
400
400
|
return {
|
|
401
401
|
label: column.label,
|
|
@@ -459,7 +459,7 @@ export function ControlBarComponent({
|
|
|
459
459
|
|
|
460
460
|
{sortBy && (
|
|
461
461
|
<div className='text-primary'>
|
|
462
|
-
<
|
|
462
|
+
<Icon icon={sortBy == "desc" ? "solid/arrow-down-z-a" : "solid/arrow-up-a-z"} className='text-xs' />
|
|
463
463
|
{sort?.length && sort?.length > 1 && <span className='text-[9px] ml-1'>{sort.findIndex((s) => s.split(" ")?.at(0) == option?.selector) + 1}</span>}
|
|
464
464
|
</div>
|
|
465
465
|
)}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
|
|
3
3
|
import { useState, useEffect } from "react";
|
|
4
|
-
import { faChevronUp, faEllipsisH, faPlus, faRotate, faTimes } from "@fortawesome/free-solid-svg-icons";
|
|
5
4
|
import { ApiFilterType, cn, pcn, useResponsive } from "@utils";
|
|
6
5
|
import { ButtonComponent } from "../button/Button.component";
|
|
7
6
|
import { ChipComponent } from "../chip/Chip.component";
|
|
@@ -12,7 +11,6 @@ import { InputNumberComponent } from "../input/InputNumber.component";
|
|
|
12
11
|
import { ModalComponent } from "../modal/Modal.component";
|
|
13
12
|
import { SelectComponent } from "../input/Select.component";
|
|
14
13
|
import { useToggleContext } from "@contexts";
|
|
15
|
-
import { faBookmark } from "@fortawesome/free-regular-svg-icons";
|
|
16
14
|
|
|
17
15
|
type CT = "base" | "title";
|
|
18
16
|
|
|
@@ -122,7 +120,7 @@ export function FilterComponent({
|
|
|
122
120
|
<div className="filter-panel-controls">
|
|
123
121
|
<div className="filter-panel-bookmarks-wrapper">
|
|
124
122
|
<ButtonComponent
|
|
125
|
-
icon=
|
|
123
|
+
icon="solid/bookmark"
|
|
126
124
|
variant="outline"
|
|
127
125
|
paint="primary"
|
|
128
126
|
className="filter-panel-bookmark-btn icon::text-slate-400"
|
|
@@ -140,7 +138,7 @@ export function FilterComponent({
|
|
|
140
138
|
|
|
141
139
|
{bookmarks?.length > 5 && (
|
|
142
140
|
<ButtonComponent
|
|
143
|
-
icon=
|
|
141
|
+
icon="solid/ellipsis-h"
|
|
144
142
|
variant="outline"
|
|
145
143
|
paint="primary"
|
|
146
144
|
className="filter-panel-bookmark-btn icon::text-slate-400"
|
|
@@ -151,7 +149,7 @@ export function FilterComponent({
|
|
|
151
149
|
</div>
|
|
152
150
|
|
|
153
151
|
<ButtonComponent
|
|
154
|
-
icon=
|
|
152
|
+
icon="solid/rotate"
|
|
155
153
|
label="Bersihkan"
|
|
156
154
|
variant="outline"
|
|
157
155
|
paint="primary"
|
|
@@ -162,7 +160,7 @@ export function FilterComponent({
|
|
|
162
160
|
|
|
163
161
|
{onMinimize && (
|
|
164
162
|
<ButtonComponent
|
|
165
|
-
icon=
|
|
163
|
+
icon="solid/chevron-up"
|
|
166
164
|
variant="outline"
|
|
167
165
|
paint="primary"
|
|
168
166
|
className="filter-panel-bookmark-btn icon::text-slate-400"
|
|
@@ -218,7 +216,7 @@ export function FilterComponent({
|
|
|
218
216
|
|
|
219
217
|
{isSm && (
|
|
220
218
|
<ButtonComponent
|
|
221
|
-
icon=
|
|
219
|
+
icon="solid/times"
|
|
222
220
|
paint="danger"
|
|
223
221
|
variant="outline"
|
|
224
222
|
onClick={() => removeFilter(i)}
|
|
@@ -244,7 +242,7 @@ export function FilterComponent({
|
|
|
244
242
|
|
|
245
243
|
{!isSm && (
|
|
246
244
|
<ButtonComponent
|
|
247
|
-
icon=
|
|
245
|
+
icon="solid/times"
|
|
248
246
|
paint="danger"
|
|
249
247
|
variant="outline"
|
|
250
248
|
onClick={() => removeFilter(i)}
|
|
@@ -257,7 +255,7 @@ export function FilterComponent({
|
|
|
257
255
|
|
|
258
256
|
<ButtonComponent
|
|
259
257
|
label="Tambahkan"
|
|
260
|
-
icon=
|
|
258
|
+
icon="solid/plus"
|
|
261
259
|
variant="outline"
|
|
262
260
|
paint="primary"
|
|
263
261
|
size={isSm ? "xs" : "sm"}
|
|
@@ -277,7 +275,7 @@ export function FilterComponent({
|
|
|
277
275
|
<p className="filter-bookmark-name">{b.name}</p>
|
|
278
276
|
<div className="flex gap-2">
|
|
279
277
|
<ButtonComponent
|
|
280
|
-
icon=
|
|
278
|
+
icon="solid/plus"
|
|
281
279
|
variant="outline"
|
|
282
280
|
paint="primary"
|
|
283
281
|
className=""
|
|
@@ -288,7 +286,7 @@ export function FilterComponent({
|
|
|
288
286
|
}}
|
|
289
287
|
/>
|
|
290
288
|
<ButtonComponent
|
|
291
|
-
icon=
|
|
289
|
+
icon="solid/times"
|
|
292
290
|
variant="outline"
|
|
293
291
|
paint="danger"
|
|
294
292
|
className=""
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client"
|
|
2
|
+
import { Icon, type IconName } from "@skalfa/skalfa-icon";
|
|
3
|
+
|
|
2
4
|
|
|
3
5
|
import { useEffect, useState } from "react";
|
|
4
|
-
import { faChevronLeft, faChevronRight } from "@fortawesome/free-solid-svg-icons";
|
|
5
|
-
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
6
6
|
import { cn, pcn } from "@utils";
|
|
7
7
|
import { ButtonComponent } from "../button/Button.component";
|
|
8
8
|
import { InputRadioComponent } from "../input/InputRadio.component";
|
|
@@ -62,7 +62,7 @@ export function PaginationComponent({
|
|
|
62
62
|
className="pagination-overflow"
|
|
63
63
|
onClick={() => onChange?.(totalRow, paginate, page - 1)}
|
|
64
64
|
>
|
|
65
|
-
<
|
|
65
|
+
<Icon icon="solid/chevron-left" />
|
|
66
66
|
</button>
|
|
67
67
|
)}
|
|
68
68
|
|
|
@@ -111,7 +111,7 @@ export function PaginationComponent({
|
|
|
111
111
|
className="pagination-overflow"
|
|
112
112
|
onClick={() => onChange?.(totalRow, paginate, page + 1)}
|
|
113
113
|
>
|
|
114
|
-
<
|
|
114
|
+
<Icon icon="solid/chevron-right" />
|
|
115
115
|
</button>
|
|
116
116
|
)}
|
|
117
117
|
</div>
|
|
@@ -132,14 +132,14 @@ export function PaginationComponent({
|
|
|
132
132
|
<div className="pagination-mobile-controls">
|
|
133
133
|
{page > 1 && (
|
|
134
134
|
<ButtonComponent
|
|
135
|
-
icon=
|
|
135
|
+
icon="solid/chevron-left"
|
|
136
136
|
onClick={() => onChange?.(totalRow, paginate, page - 1)}
|
|
137
137
|
size="sm"
|
|
138
138
|
/>
|
|
139
139
|
)}
|
|
140
140
|
{page < lastPage && (
|
|
141
141
|
<ButtonComponent
|
|
142
|
-
icon=
|
|
142
|
+
icon="solid/chevron-right"
|
|
143
143
|
onClick={() => onChange?.(totalRow, paginate, page + 1)}
|
|
144
144
|
size="sm"
|
|
145
145
|
/>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client"
|
|
2
|
+
import { Icon, type IconName } from "@skalfa/skalfa-icon";
|
|
3
|
+
|
|
2
4
|
|
|
3
5
|
import { isValidElement, ReactNode, useEffect, useMemo, useRef, useState } from "react";
|
|
4
|
-
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
5
|
-
import { faArrowDownZA, faArrowUpAZ, faChevronLeft, faChevronRight } from "@fortawesome/free-solid-svg-icons";
|
|
6
6
|
import { ApiFilterType, cn, pcn, useLazySearch, useResponsive, conversion } from "@utils";
|
|
7
7
|
import { ControlBarComponent, ControlBarOptionType } from "./ControlBar.component";
|
|
8
8
|
import { PaginationComponent, PaginationProps } from "./Pagination.component";
|
|
@@ -158,8 +158,8 @@ export function TableComponent({
|
|
|
158
158
|
{column.label}
|
|
159
159
|
|
|
160
160
|
{!!sortColumn && (
|
|
161
|
-
<
|
|
162
|
-
icon={sortDirection == "desc" ?
|
|
161
|
+
<Icon
|
|
162
|
+
icon={sortDirection == "desc" ? "solid/arrow-down-z-a" : "solid/arrow-up-a-z"}
|
|
163
163
|
className="text-light-foreground/70"
|
|
164
164
|
/>
|
|
165
165
|
)}
|
|
@@ -379,7 +379,7 @@ export function TableComponent({
|
|
|
379
379
|
}
|
|
380
380
|
>
|
|
381
381
|
<div className="table-floating-action-icon-wrapper">
|
|
382
|
-
<
|
|
382
|
+
<Icon icon={floatingActionActive === false || floatingActionActive != key ? "solid/chevron-left" : "solid/chevron-right"}/>
|
|
383
383
|
</div>
|
|
384
384
|
|
|
385
385
|
<div className={cn("table-floating-action-content", floatingActionActive === key && "table-floating-action-content-active")}>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { ReactNode, useRef, useState } from 'react'
|
|
4
4
|
import { cn } from '@utils';
|
|
5
|
-
import {
|
|
5
|
+
import { Icon } from '@skalfa/skalfa-icon';
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
export type SwipeActionType = {
|
|
@@ -84,7 +84,7 @@ export function SwipeComponent({
|
|
|
84
84
|
offset > 0 ? "opacity-100" : "opacity-0"
|
|
85
85
|
)}
|
|
86
86
|
>
|
|
87
|
-
{leftActionControl?.icon && <
|
|
87
|
+
{leftActionControl?.icon && <Icon icon={leftActionControl?.icon} />} {leftActionControl?.label}
|
|
88
88
|
</div>
|
|
89
89
|
|
|
90
90
|
<div
|
|
@@ -95,7 +95,7 @@ export function SwipeComponent({
|
|
|
95
95
|
offset < 0 ? "opacity-100" : "opacity-0"
|
|
96
96
|
)}
|
|
97
97
|
>
|
|
98
|
-
{rightActionControl?.icon && <
|
|
98
|
+
{rightActionControl?.icon && <Icon icon={rightActionControl?.icon} />} {rightActionControl?.label}
|
|
99
99
|
</div>
|
|
100
100
|
|
|
101
101
|
<div
|