gnui 1.2.17 → 1.2.18

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 (78) hide show
  1. package/dist/js/gnui.esm.js +724 -92
  2. package/dist/js/gnui.js +724 -92
  3. package/dist/js/gnui.min.js +6 -6
  4. package/dist/styles/default.css +1019 -108
  5. package/dist/styles/gpi.css +1019 -108
  6. package/dist/styles/green24.css +1230 -289
  7. package/dist/styles/insights.css +1019 -108
  8. package/dist/styles/nac.css +969 -58
  9. package/dist/styles/ztnac.css +1206 -265
  10. package/package.json +1 -1
  11. package/styleguide/assets/components.js +216 -9
  12. package/styleguide/assets/js/gnui.js +724 -92
  13. package/styleguide/assets/js/gnui.min.js +6 -6
  14. package/styleguide/assets/styles/default.css +1019 -108
  15. package/styleguide/assets/styles/gpi.css +1019 -108
  16. package/styleguide/assets/styles/green24.css +1230 -289
  17. package/styleguide/assets/styles/insights.css +1019 -108
  18. package/styleguide/assets/styles/nac.css +969 -58
  19. package/styleguide/assets/styles/ztnac.css +1206 -265
  20. package/styleguide/category/COLOR/index.html +2 -2
  21. package/styleguide/category/COMPONENT/Alert(js)/index.html +2 -2
  22. package/styleguide/category/COMPONENT/Bignumber/index.html +2 -2
  23. package/styleguide/category/COMPONENT/Breadcrumb/index.html +2 -2
  24. package/styleguide/category/COMPONENT/Calendar(js)/index.html +2 -2
  25. package/styleguide/category/COMPONENT/Card/index.html +2 -2
  26. package/styleguide/category/COMPONENT/Chart(js)/index.html +2 -2
  27. package/styleguide/category/COMPONENT/Datagrid(js)/index.html +136 -9
  28. package/styleguide/category/COMPONENT/Datalist(js)/index.html +2 -2
  29. package/styleguide/category/COMPONENT/Growl(js)/index.html +2 -2
  30. package/styleguide/category/COMPONENT/JsonView(js)/index.html +2 -2
  31. package/styleguide/category/COMPONENT/Loader(js)/index.html +21 -4
  32. package/styleguide/category/COMPONENT/MenuButton(js)/index.html +74 -6
  33. package/styleguide/category/COMPONENT/Message(js)/index.html +2 -2
  34. package/styleguide/category/COMPONENT/Modal(js)/index.html +2 -2
  35. package/styleguide/category/COMPONENT/Pagination(js)/index.html +2 -2
  36. package/styleguide/category/COMPONENT/Panel/index.html +2 -2
  37. package/styleguide/category/COMPONENT/Progressbar(js)/index.html +2 -2
  38. package/styleguide/category/COMPONENT/Tab(js)/index.html +2 -2
  39. package/styleguide/category/COMPONENT/Tagcloud(js)/index.html +2 -2
  40. package/styleguide/category/COMPONENT/Tooltip(js)/index.html +2 -2
  41. package/styleguide/category/COMPONENT/Tree(js)/index.html +2 -2
  42. package/styleguide/category/CONTROLS/Button(js)/index.html +2 -2
  43. package/styleguide/category/CONTROLS/Checkbox/index.html +2 -2
  44. package/styleguide/category/CONTROLS/Colorpicker(js)/index.html +2 -2
  45. package/styleguide/category/CONTROLS/Datepicker(js)/index.html +2 -2
  46. package/styleguide/category/CONTROLS/Dropdown(js)/index.html +2 -2
  47. package/styleguide/category/CONTROLS/File/index.html +2 -2
  48. package/styleguide/category/CONTROLS/Form/Control/index.html +2 -2
  49. package/styleguide/category/CONTROLS/Form/Field/index.html +2 -2
  50. package/styleguide/category/CONTROLS/Form/Plain/index.html +2 -2
  51. package/styleguide/category/CONTROLS/Input/index.html +2 -2
  52. package/styleguide/category/CONTROLS/MultiText(js)/index.html +2 -2
  53. package/styleguide/category/CONTROLS/Picklist(js)/index.html +28 -18
  54. package/styleguide/category/CONTROLS/Radio/index.html +2 -2
  55. package/styleguide/category/CONTROLS/Select/index.html +2 -2
  56. package/styleguide/category/CONTROLS/SelectButton(js)/index.html +2 -2
  57. package/styleguide/category/CONTROLS/Slider/index.html +2 -2
  58. package/styleguide/category/CONTROLS/SortableList(js)/index.html +487 -0
  59. package/styleguide/category/CONTROLS/Switch(js)/index.html +2 -2
  60. package/styleguide/category/CONTROLS/SyntaxInput(js)/index.html +2 -2
  61. package/styleguide/category/CONTROLS/Textarea/index.html +2 -2
  62. package/styleguide/category/CONTROLS/Time(js)/index.html +2 -2
  63. package/styleguide/category/ELEMENTS/Box/index.html +2 -2
  64. package/styleguide/category/ELEMENTS/Icon/index.html +2 -2
  65. package/styleguide/category/ELEMENTS/Image/index.html +2 -2
  66. package/styleguide/category/ELEMENTS/List/index.html +2 -2
  67. package/styleguide/category/ELEMENTS/Table/index.html +2 -2
  68. package/styleguide/category/ELEMENTS/Tag/index.html +2 -2
  69. package/styleguide/category/ELEMENTS/Title/index.html +2 -2
  70. package/styleguide/category/LAYOUT/Container/index.html +2 -2
  71. package/styleguide/category/LAYOUT/Grid/index.html +2 -2
  72. package/styleguide/category/LAYOUT/Splitter(js)/index.html +2 -2
  73. package/styleguide/category/UTILITY/index.html +2 -2
  74. package/styleguide/category/Utils/index.html +2 -2
  75. package/styleguide/color.html +2 -2
  76. package/styleguide/index.html +2 -2
  77. package/styleguide/tag/javascript/index.html +608 -31
  78. package/styleguide/tag/v.0.1.0/index.html +608 -31
@@ -18,7 +18,7 @@
18
18
  transform: translateX(100%);
19
19
  }
20
20
  }
21
- .gn-container:not(:last-child), .gn-tagcloud:not(:last-child), .gn-tab:not(:last-child), .gn-progressbar:not(:last-child), .gn-picklist:not(:last-child), .gn-panel-3:not(:last-child), .gn-panel-2:not(:last-child), .gn-pagination:not(:last-child), .gn-message:not(:last-child), .gn-jsonview .jsonview-header:not(:last-child), .gn-growl:not(:last-child), .gn-gcolor:not(:last-child), .gn-card:not(:last-child), .gn-breadcrumb:not(:last-child), .gn-bignumber:not(:last-child), .gn-alert:not(:last-child), .gn-slider:not(:last-child), .gn-multitext:not(:last-child), .gn-field:not(:last-child), .gn-title:not(:last-child),
21
+ .gn-container:not(:last-child), .gn-tagcloud:not(:last-child), .gn-tab:not(:last-child), .gn-progressbar:not(:last-child), .gn-sortablelist:not(:last-child), .gn-picklist:not(:last-child), .gn-panel-3:not(:last-child), .gn-panel-2:not(:last-child), .gn-pagination:not(:last-child), .gn-message:not(:last-child), .gn-jsonview .jsonview-header:not(:last-child), .gn-growl:not(:last-child), .gn-gcolor:not(:last-child), .gn-card:not(:last-child), .gn-breadcrumb:not(:last-child), .gn-bignumber:not(:last-child), .gn-alert:not(:last-child), .gn-slider:not(:last-child), .gn-multitext:not(:last-child), .gn-field:not(:last-child), .gn-title:not(:last-child),
22
22
  .gn-sub-title:not(:last-child), .gn-table:not(:last-child), .gn-list:not(:last-child), .gn-box-no-line:not(:last-child), .gn-box:not(:last-child) {
23
23
  margin-bottom: 1rem;
24
24
  }
@@ -2708,7 +2708,7 @@ tag:
2708
2708
  }
2709
2709
  .gn-icon-ext::before {
2710
2710
  content: "\f15b";
2711
- font-family: "Font Awesome 6 Pro", "Font Awesome 5 Free";
2711
+ font-family: "Font Awesome 7 Pro", "Font Awesome 6 Pro", "Font Awesome 5 Free", "FontAwesome";
2712
2712
  font-weight: 300;
2713
2713
  font-size: 1.6rem;
2714
2714
  }
@@ -4217,10 +4217,6 @@ tag:
4217
4217
  display: block;
4218
4218
  word-break: break-word;
4219
4219
  }
4220
- .gn-title:not(:last-child),
4221
- .gn-sub-title:not(:last-child) {
4222
- margin-bottom: 1rem;
4223
- }
4224
4220
 
4225
4221
  .gn-title {
4226
4222
  color: #535353;
@@ -5490,6 +5486,7 @@ compile: true
5490
5486
  ```ejs
5491
5487
  <button name="new-button"></button>
5492
5488
  <button name="new-button2"></button>
5489
+ <button name="new-button-submenu">편집 메뉴</button>
5493
5490
  ```
5494
5491
 
5495
5492
  ````
@@ -5529,6 +5526,51 @@ compile: true
5529
5526
  value: 'menu2'
5530
5527
  }]
5531
5528
  });
5529
+ // 서브메뉴 예시
5530
+ Gn.create('menubutton', {
5531
+ target: 'button[name=new-button-submenu]',
5532
+ size: 'normal',
5533
+ textSets: {
5534
+ buttonText: '편집 메뉴'
5535
+ },
5536
+ onSelect: function (value, text, menu, e) {
5537
+ console.log('선택된 메뉴:', { value: value, text: text, menu: menu });
5538
+ },
5539
+ data: [
5540
+ {
5541
+ text: '파일',
5542
+ value: 'file',
5543
+ child: [
5544
+ { text: '새 파일', value: 'file-new' },
5545
+ { text: '열기', value: 'file-open' },
5546
+ {
5547
+ text: '최근 파일',
5548
+ value: 'file-recent',
5549
+ child: [
5550
+ { text: 'document.txt', value: 'file-recent-1' },
5551
+ { text: 'image.png', value: 'file-recent-2' }
5552
+ ]
5553
+ },
5554
+ { text: '저장', value: 'file-save', disabled: true },
5555
+ { text: '다른 이름으로 저장', value: 'file-saveas' }
5556
+ ]
5557
+ },
5558
+ {
5559
+ text: '편집',
5560
+ value: 'edit',
5561
+ actived: true,
5562
+ child: [
5563
+ { text: '실행 취소', value: 'edit-undo' },
5564
+ { text: '다시 실행', value: 'edit-redo' }
5565
+ ]
5566
+ },
5567
+ {
5568
+ text: '도움말',
5569
+ value: 'help',
5570
+ disabled: true
5571
+ }
5572
+ ]
5573
+ });
5532
5574
  ````
5533
5575
 
5534
5576
 
@@ -5585,15 +5627,21 @@ compile: true
5585
5627
  </tr>
5586
5628
  <tr>
5587
5629
  <td colspan="2">data</td>
5588
- <td>Array[{value, text, _html_}]</td>
5630
+ <td>Array[{value, text, html, child, disabled, actived}]</td>
5589
5631
  <td></td>
5590
- <td>메뉴 목록에 출력할 목록</td>
5632
+ <td>메뉴 목록에 출력할 목록<br/>- value: 메뉴 값<br/>- text: 메뉴 텍스트<br/>- html: HTML로 렌더링할 내용<br/>- child: 하위 메뉴 배열 (최대 2단계)<br/>- disabled: 비활성화 여부 (boolean)<br/>- actived: 활성화 상태 표시 여부</td>
5633
+ </tr>
5634
+ <tr>
5635
+ <td colspan="2">disabled</td>
5636
+ <td>boolean</td>
5637
+ <td>false</td>
5638
+ <td>버튼 비활성화 여부</td>
5591
5639
  </tr>
5592
5640
  <tr>
5593
5641
  <td colspan="2">onSelect</td>
5594
- <td>function(value, text)</td>
5642
+ <td>function(value, text, menu, e)</td>
5595
5643
  <td></td>
5596
- <td>메뉴 선택 시 수행될 이벤트</td>
5644
+ <td>메뉴 선택 시 수행될 이벤트<br/>- value: 선택된 메뉴의 값<br/>- text: 선택된 메뉴의 텍스트<br/>- menu: 선택된 메뉴 객체<br/>- e: MouseEvent 객체</td>
5597
5645
  </tr>
5598
5646
  </tbody>
5599
5647
  </table>
@@ -5612,6 +5660,21 @@ compile: true
5612
5660
  <td>void</td>
5613
5661
  <td>버튼명을 변경한다.</td>
5614
5662
  </tr>
5663
+ <tr>
5664
+ <td>reRender(data: Array)</td>
5665
+ <td>void</td>
5666
+ <td>메뉴 데이터를 전달받아 DOM을 다시 생성한다.</td>
5667
+ </tr>
5668
+ <tr>
5669
+ <td>disabled()</td>
5670
+ <td>void</td>
5671
+ <td>버튼을 비활성화한다.</td>
5672
+ </tr>
5673
+ <tr>
5674
+ <td>enabled()</td>
5675
+ <td>void</td>
5676
+ <td>버튼을 활성화한다.</td>
5677
+ </tr>
5615
5678
  </tbody>
5616
5679
  </table>
5617
5680
  */
@@ -5699,6 +5762,47 @@ compile: true
5699
5762
  color: #fff;
5700
5763
  background-color: #88b50f;
5701
5764
  }
5765
+ .gn-menuButton .menuButton-menu.is-disabled {
5766
+ pointer-events: none;
5767
+ opacity: 0.5;
5768
+ }
5769
+ .gn-menuButton .menuButton-menu.is-actived {
5770
+ background-color: hsl(0, 0%, 100%);
5771
+ }
5772
+ .gn-menuButton .menuButton-menu.has-submenu .menuButton-menu-content {
5773
+ display: flex;
5774
+ align-items: center;
5775
+ justify-content: space-between;
5776
+ width: 100%;
5777
+ }
5778
+ .gn-menuButton .menuButton-menu.has-submenu .menuButton-menu-arrow {
5779
+ margin-left: 10px;
5780
+ display: inline-flex;
5781
+ align-items: center;
5782
+ }
5783
+ .gn-menuButton .menuButton-menu .menuButton-submenu {
5784
+ display: none;
5785
+ position: absolute;
5786
+ left: 100%;
5787
+ top: 0;
5788
+ min-width: 150px;
5789
+ background-color: hsl(0, 0%, 100%);
5790
+ border: 1px solid #bebebe;
5791
+ border-radius: 2px;
5792
+ z-index: 21;
5793
+ padding: 0.35rem;
5794
+ }
5795
+ .gn-menuButton .menuButton-menu .menuButton-submenu .menuButton-menu {
5796
+ color: hsl(0, 0%, 29%);
5797
+ cursor: pointer;
5798
+ }
5799
+ .gn-menuButton .menuButton-menu .menuButton-submenu .menuButton-menu:hover {
5800
+ color: #fff;
5801
+ background-color: #88b50f;
5802
+ }
5803
+ .gn-menuButton .menuButton-menu:hover > .menuButton-submenu {
5804
+ display: block;
5805
+ }
5702
5806
  .gn-menuButton.is-white button {
5703
5807
  color: hsl(0, 0%, 100%);
5704
5808
  border-color: hsl(0, 0%, 100%);
@@ -9484,7 +9588,7 @@ tag:
9484
9588
  }
9485
9589
  .gn-select::after {
9486
9590
  content: "\f107";
9487
- font-family: "Font Awesome 6 Pro", "Font Awesome 5 Free", "FontAwesome";
9591
+ font-family: "Font Awesome 7 Pro", "Font Awesome 6 Pro", "Font Awesome 5 Free", "FontAwesome";
9488
9592
  font-weight: 900;
9489
9593
  position: absolute;
9490
9594
  right: 0.5rem;
@@ -12646,9 +12750,13 @@ tag:
12646
12750
  ```ejs
12647
12751
  <div class="new-grid"></div>
12648
12752
 
12649
- <div style="width: 100%; height: 350px; overflow-x: auto; margin-top: 20px;">
12753
+ <div style="width: 100%; height: 100px; overflow-x: auto; margin-top: 20px;">
12650
12754
  <div class="new-grid2"></div>
12651
12755
  </div>
12756
+
12757
+ <div style="width: 100%; height: 350px; overflow-x: auto; margin-top: 20px;">
12758
+ <div class="new-grid3"></div>
12759
+ </div>
12652
12760
  ```
12653
12761
  ````
12654
12762
  Gn.create('datagrid', {
@@ -12761,19 +12869,122 @@ Gn.create('datagrid', {
12761
12869
  })
12762
12870
  Gn.create('datagrid', {
12763
12871
  target: '.new-grid2',
12872
+ headers: [
12873
+ {
12874
+ label: 'no',
12875
+ key: 'number',
12876
+ onSelect: function () {
12877
+ // eslint-disable-next-line prefer-rest-params
12878
+ console.log(arguments);
12879
+ },
12880
+ template: function (k, d) {
12881
+ return '<span>' + d[k] + '</span>';
12882
+ },
12883
+ draggable: true,
12884
+ sortable: true,
12885
+ sort: 'asc'
12886
+ },
12887
+ {
12888
+ label: '제목',
12889
+ key: 'title',
12890
+ style: {
12891
+ width: '250px'
12892
+ },
12893
+ className: 'has-text-right',
12894
+ draggable: true,
12895
+ bodyClass: 'has-text-left',
12896
+ sortable: true
12897
+ },
12898
+ {
12899
+ label: '날짜',
12900
+ key: 'date',
12901
+ style: {
12902
+ width: '150px'
12903
+ },
12904
+ className: 'has-text-center',
12905
+ bodyClass: 'has-text-left'
12906
+ }
12907
+ ],
12908
+ data: [
12909
+ {
12910
+ number: '1',
12911
+ title: '하나',
12912
+ date: '2020-09-19',
12913
+ desc: 'hello, world',
12914
+ child: [
12915
+ {
12916
+ number: '1-1',
12917
+ title: '1-하나',
12918
+ date: '2020-09-19'
12919
+ },
12920
+ {
12921
+ number: '1-2',
12922
+ title: '1-둘',
12923
+ date: '2020-09-19',
12924
+ desc: 'hello, world',
12925
+ child: [
12926
+ {
12927
+ number: '1-2-1',
12928
+ title: '1-둘-1',
12929
+ date: '2020-09-19',
12930
+ desc: 'hello, world',
12931
+ child: [
12932
+ {
12933
+ number: '1-2-1-1',
12934
+ title: '1-둘-1-1',
12935
+ desc: 'hello, world',
12936
+ date: '2020-09-19'
12937
+ }
12938
+ ]
12939
+ }
12940
+ ]
12941
+ }
12942
+ ],
12943
+ color: 'is-danger-light'
12944
+ },
12945
+ {
12946
+ number: '2',
12947
+ title: '둘',
12948
+ date: '2020-09-19',
12949
+ desc: 'hello, world'
12950
+ }
12951
+ ],
12952
+ hasHeader: false,
12953
+ hasCheck: true,
12954
+ hasDelete: true,
12955
+ textSets: {
12956
+ deleteConfirmMessage: '파일을 삭제하시겠습니까?'
12957
+ },
12958
+ // onDelete 에서 false 를 반환하면 해당 행 삭제를 취소할 수 있다.
12959
+ onDelete: (data, index) => {
12960
+ console.log(data, index);
12961
+ // 예) 특정 조건에 따라 삭제 취소
12962
+ // if (index === 0) {
12963
+ // return false;
12964
+ // }
12965
+ }
12966
+ })
12967
+ Gn.create('datagrid', {
12968
+ target: '.new-grid3',
12764
12969
  headers: [
12765
12970
  {
12766
12971
  label: 'row data numbers',
12767
12972
  key: 'number',
12768
12973
  style: { width: '50px' },
12769
12974
  sortable: true,
12770
- draggable: true
12975
+ draggable: true,
12976
+ template: function (k, d) {
12977
+ return '<span>' + d[k] + '</span>';
12978
+ }
12771
12979
  },
12772
12980
  {
12773
12981
  label: '제목',
12774
12982
  key: 'title',
12775
12983
  sortable: true,
12776
- draggable: true
12984
+ draggable: true,
12985
+ template: function (k, d) {
12986
+ return '<span>' + d[k] + '</span>';
12987
+ }
12777
12988
  },
12778
12989
  {
12779
12990
  label: '날짜를 표시하는 컬럼입니다',
@@ -12836,8 +13047,6 @@ Gn.create('datagrid', {
12836
13047
  paginator: {
12837
13048
  rows: 30
12838
13049
  },
12839
- hasDelete: true,
12840
- fixHeader: true,
12841
13050
  onChange: updatedData => {
12842
13051
  console.log(updatedData)
12843
13052
  }
@@ -12952,7 +13161,7 @@ Gn.create('datagrid', {
12952
13161
  <b>color:is-warning-light</b> => 행의 색 변경</td>
12953
13162
  </tr>
12954
13163
  <tr>
12955
- <td rowspan="3">textSets</td>
13164
+ <td rowspan="4">textSets</td>
12956
13165
  <td>noData</td>
12957
13166
  <td>string</td>
12958
13167
  <td>No records available.</td>
@@ -12970,6 +13179,12 @@ Gn.create('datagrid', {
12970
13179
  <td></td>
12971
13180
  <td>삭제버튼 헤더표시문구</td>
12972
13181
  </tr>
13182
+ <tr>
13183
+ <td>deleteConfirmMessage</td>
13184
+ <td>string</td>
13185
+ <td></td>
13186
+ <td>삭제 확인 창 표시문구 - 삭제 버튼 클릭시 확인 창 출력</td>
13187
+ </tr>
12973
13188
  <tr>
12974
13189
  <td colspan="2">childField</td>
12975
13190
  <td>string</td>
@@ -12994,6 +13209,12 @@ Gn.create('datagrid', {
12994
13209
  <td>false</td>
12995
13210
  <td>삭제버튼 생성 여부</td>
12996
13211
  </tr>
13212
+ <tr>
13213
+ <td colspan="2">hasHeader</td>
13214
+ <td>boolean</td>
13215
+ <td>true</td>
13216
+ <td>헤더 생성 여부</td>
13217
+ </tr>
12997
13218
  <tr>
12998
13219
  <td colspan="2">readonly</td>
12999
13220
  <td>boolean</td>
@@ -13091,6 +13312,12 @@ Gn.create('datagrid', {
13091
13312
  <td></td>
13092
13313
  <td>이동, 삭제 등의 데이터 변경이 있는 경우, 변경된 데이터를 가져오기 위한 이벤트핸들러</td>
13093
13314
  </tr>
13315
+ <tr>
13316
+ <td colspan="2">onDelete</td>
13317
+ <td>function(deletedData, index)</td>
13318
+ <td>deletedData, index 를 인자로 받으며, false 를 반환하면 해당 행 삭제를 취소한다.</td>
13319
+ <td>삭제 버튼 클릭 시 삭제 대상 데이터와 인덱스를 받을 수 있는 이벤트핸들러<br>onChange 보다 먼저 동작하며, onDelete 에서 false 를 반환하면 실제 삭제 및 onChange 호출이 수행되지 않는다.</td>
13320
+ </tr>
13094
13321
  </tbody>
13095
13322
  </table>
13096
13323
 
@@ -13276,11 +13503,11 @@ Gn.create('datagrid', {
13276
13503
  }
13277
13504
  .gn-datagrid .gn-datagrid-body-row .is-toggler::before {
13278
13505
  content: "\f0d7";
13279
- font-family: "Font Awesome 6 Pro", "Font Awesome 5 Free", "FontAwesome";
13506
+ font-family: "Font Awesome 7 Pro", "Font Awesome 6 Pro", "Font Awesome 5 Free", "FontAwesome";
13280
13507
  font-weight: 700;
13281
13508
  }
13282
13509
  .gn-datagrid .gn-datagrid-body-row.has-child[data-depth="0"] .is-toggler {
13283
- margin-left: -3px;
13510
+ margin-left: -6px;
13284
13511
  }
13285
13512
  .gn-datagrid .gn-datagrid-body-row.is-collapsed .is-toggler::before {
13286
13513
  content: "\f0da";
@@ -13480,6 +13707,9 @@ Gn.create('datagrid', {
13480
13707
  .gn-datagrid.has-left-padding .gn-datagrid-body-row:not(.has-child)[data-depth="0"] .gn-datagrid-body-cell:first-child {
13481
13708
  padding-left: 15px;
13482
13709
  }
13710
+ .gn-datagrid.is-headless .gn-datagrid-body-row:first-child {
13711
+ border-top: 1px solid #bebebe;
13712
+ }
13483
13713
  .gn-datagrid .gn-datagrid-header-cell {
13484
13714
  border-right: 1px solid #bebebe;
13485
13715
  padding: 0.55rem;
@@ -17194,11 +17424,21 @@ tag:
17194
17424
  <div class="gn-loader is-info"></div>
17195
17425
  ```
17196
17426
 
17427
+ ```html
17428
+ <div class="gn-loader is-inline"></div>
17429
+ <div class="gn-loader is-inline is-success"></div>
17430
+ <div class="gn-loader is-inline is-warning"></div>
17431
+ <div class="gn-loader is-inline is-danger"></div>
17432
+ <div class="gn-loader is-inline is-info"></div>
17433
+ <div class="gn-loader is-inline is-primary"></div>
17434
+ ```
17435
+
17197
17436
  ### 타입
17198
17437
 
17199
17438
  ```html
17200
17439
  <div class="gn-loader is-bounce"></div><br>
17201
17440
  <div class="gn-loader is-move"></div>
17441
+ <div class="gn-loader is-inline"></div><br>
17202
17442
  ```
17203
17443
 
17204
17444
  ### 생성 옵션
@@ -17258,7 +17498,7 @@ Gn.create('button', {
17258
17498
  <td colspan="2">type</td>
17259
17499
  <td>string</td>
17260
17500
  <td></td>
17261
- <td>'bounce','move','circle'</td>
17501
+ <td>'inline','bounce','move','</td>
17262
17502
  </tr>
17263
17503
  <tr>
17264
17504
  <td colspan="2">positionX</td>
@@ -17367,6 +17607,7 @@ Gn.create('button', {
17367
17607
  .gn-loader.is-small {
17368
17608
  width: 15px;
17369
17609
  height: 15px;
17610
+ border-width: 5px;
17370
17611
  }
17371
17612
  .gn-loader.is-normal {
17372
17613
  width: 25px;
@@ -17452,6 +17693,82 @@ Gn.create('button', {
17452
17693
  border: 13px solid #88b50f;
17453
17694
  animation: move 1.5s ease-in-out infinite alternate;
17454
17695
  }
17696
+ .gn-loader.is-inline {
17697
+ border: 0;
17698
+ position: relative;
17699
+ margin-left: 10px;
17700
+ margin-right: 10px;
17701
+ animation-delay: -0.12s;
17702
+ background: #e1e1e1;
17703
+ }
17704
+ .gn-loader.is-inline, .gn-loader.is-inline::before, .gn-loader.is-inline::after {
17705
+ display: inline-block !important;
17706
+ width: 3px;
17707
+ height: 3px;
17708
+ animation: colorPulse 1.4s ease-in-out infinite;
17709
+ border-radius: 50%;
17710
+ }
17711
+ .gn-loader.is-inline::before, .gn-loader.is-inline::after {
17712
+ content: "";
17713
+ position: absolute;
17714
+ top: 0;
17715
+ }
17716
+ .gn-loader.is-inline::before {
17717
+ animation-delay: -0.24s;
17718
+ margin-left: -8px;
17719
+ }
17720
+ .gn-loader.is-inline::after {
17721
+ animation-delay: 0s;
17722
+ margin-left: 8px;
17723
+ }
17724
+ .gn-loader.is-inline.is-white, .gn-loader.is-inline.is-white::before, .gn-loader.is-inline.is-white::after {
17725
+ animation-name: colorPulse-white;
17726
+ }
17727
+ .gn-loader.is-inline.is-black, .gn-loader.is-inline.is-black::before, .gn-loader.is-inline.is-black::after {
17728
+ animation-name: colorPulse-black;
17729
+ }
17730
+ .gn-loader.is-inline.is-light, .gn-loader.is-inline.is-light::before, .gn-loader.is-inline.is-light::after {
17731
+ animation-name: colorPulse-light;
17732
+ }
17733
+ .gn-loader.is-inline.is-dark, .gn-loader.is-inline.is-dark::before, .gn-loader.is-inline.is-dark::after {
17734
+ animation-name: colorPulse-dark;
17735
+ }
17736
+ .gn-loader.is-inline.is-primary, .gn-loader.is-inline.is-primary::before, .gn-loader.is-inline.is-primary::after {
17737
+ animation-name: colorPulse-primary;
17738
+ }
17739
+ .gn-loader.is-inline.is-link, .gn-loader.is-inline.is-link::before, .gn-loader.is-inline.is-link::after {
17740
+ animation-name: colorPulse-link;
17741
+ }
17742
+ .gn-loader.is-inline.is-info, .gn-loader.is-inline.is-info::before, .gn-loader.is-inline.is-info::after {
17743
+ animation-name: colorPulse-info;
17744
+ }
17745
+ .gn-loader.is-inline.is-cancel, .gn-loader.is-inline.is-cancel::before, .gn-loader.is-inline.is-cancel::after {
17746
+ animation-name: colorPulse-cancel;
17747
+ }
17748
+ .gn-loader.is-inline.is-success, .gn-loader.is-inline.is-success::before, .gn-loader.is-inline.is-success::after {
17749
+ animation-name: colorPulse-success;
17750
+ }
17751
+ .gn-loader.is-inline.is-warning, .gn-loader.is-inline.is-warning::before, .gn-loader.is-inline.is-warning::after {
17752
+ animation-name: colorPulse-warning;
17753
+ }
17754
+ .gn-loader.is-inline.is-danger, .gn-loader.is-inline.is-danger::before, .gn-loader.is-inline.is-danger::after {
17755
+ animation-name: colorPulse-danger;
17756
+ }
17757
+ .gn-loader.is-inline.is-trans, .gn-loader.is-inline.is-trans::before, .gn-loader.is-inline.is-trans::after {
17758
+ animation-name: colorPulse-trans;
17759
+ }
17760
+ .gn-loader.is-inline.is-help, .gn-loader.is-inline.is-help::before, .gn-loader.is-inline.is-help::after {
17761
+ animation-name: colorPulse-help;
17762
+ }
17763
+ .gn-loader.is-inline.is-plain, .gn-loader.is-inline.is-plain::before, .gn-loader.is-inline.is-plain::after {
17764
+ animation-name: colorPulse-plain;
17765
+ }
17766
+ .gn-loader.is-inline.is-secondary, .gn-loader.is-inline.is-secondary::before, .gn-loader.is-inline.is-secondary::after {
17767
+ animation-name: colorPulse-secondary;
17768
+ }
17769
+ .gn-loader.is-inline.is-mono, .gn-loader.is-inline.is-mono::before, .gn-loader.is-inline.is-mono::after {
17770
+ animation-name: colorPulse-mono;
17771
+ }
17455
17772
 
17456
17773
  @keyframes load-spin {
17457
17774
  0% {
@@ -17480,6 +17797,210 @@ Gn.create('button', {
17480
17797
  transform: translateX(15px);
17481
17798
  }
17482
17799
  }
17800
+ @keyframes colorPulse {
17801
+ 0%, 70%, 100% {
17802
+ background: #e1e1e1;
17803
+ /* 비활성 색상 */
17804
+ transform: scale(1);
17805
+ }
17806
+ 35% {
17807
+ background: #88b50f;
17808
+ /* 활성 색상 */
17809
+ transform: scale(1.1);
17810
+ }
17811
+ }
17812
+ @keyframes colorPulse-white {
17813
+ 0%, 70%, 100% {
17814
+ background: hsl(0, 0%, 71%);
17815
+ /* 비활성 색상 */
17816
+ transform: scale(1);
17817
+ }
17818
+ 35% {
17819
+ background: hsl(0, 0%, 100%);
17820
+ /* 활성 색상 */
17821
+ transform: scale(1.1);
17822
+ }
17823
+ }
17824
+ @keyframes colorPulse-black {
17825
+ 0%, 70%, 100% {
17826
+ background: hsl(0, 0%, 86%);
17827
+ /* 비활성 색상 */
17828
+ transform: scale(1);
17829
+ }
17830
+ 35% {
17831
+ background: hsl(0, 0%, 4%);
17832
+ /* 활성 색상 */
17833
+ transform: scale(1.1);
17834
+ }
17835
+ }
17836
+ @keyframes colorPulse-light {
17837
+ 0%, 70%, 100% {
17838
+ background: hsl(0, 0%, 93%);
17839
+ /* 비활성 색상 */
17840
+ transform: scale(1);
17841
+ }
17842
+ 35% {
17843
+ background: hsl(0, 0%, 96%);
17844
+ /* 활성 색상 */
17845
+ transform: scale(1.1);
17846
+ }
17847
+ }
17848
+ @keyframes colorPulse-dark {
17849
+ 0%, 70%, 100% {
17850
+ background: hsl(0, 0%, 86%);
17851
+ /* 비활성 색상 */
17852
+ transform: scale(1);
17853
+ }
17854
+ 35% {
17855
+ background: hsl(0, 0%, 20%);
17856
+ /* 활성 색상 */
17857
+ transform: scale(1.1);
17858
+ }
17859
+ }
17860
+ @keyframes colorPulse-primary {
17861
+ 0%, 70%, 100% {
17862
+ background: rgb(248.7551020408, 253.4387755102, 236.1612244898);
17863
+ /* 비활성 색상 */
17864
+ transform: scale(1);
17865
+ }
17866
+ 35% {
17867
+ background: #88b50f;
17868
+ /* 활성 색상 */
17869
+ transform: scale(1.1);
17870
+ }
17871
+ }
17872
+ @keyframes colorPulse-link {
17873
+ 0%, 70%, 100% {
17874
+ background: hsl(217, 71%, 96%);
17875
+ /* 비활성 색상 */
17876
+ transform: scale(1);
17877
+ }
17878
+ 35% {
17879
+ background: hsl(217, 71%, 53%);
17880
+ /* 활성 색상 */
17881
+ transform: scale(1.1);
17882
+ }
17883
+ }
17884
+ @keyframes colorPulse-info {
17885
+ 0%, 70%, 100% {
17886
+ background: hsl(204, 71%, 96%);
17887
+ /* 비활성 색상 */
17888
+ transform: scale(1);
17889
+ }
17890
+ 35% {
17891
+ background: hsl(204, 71%, 53%);
17892
+ /* 활성 색상 */
17893
+ transform: scale(1.1);
17894
+ }
17895
+ }
17896
+ @keyframes colorPulse-cancel {
17897
+ 0%, 70%, 100% {
17898
+ background: hsl(0, 0%, 96%);
17899
+ /* 비활성 색상 */
17900
+ transform: scale(1);
17901
+ }
17902
+ 35% {
17903
+ background: hsl(0, 0%, 71%);
17904
+ /* 활성 색상 */
17905
+ transform: scale(1.1);
17906
+ }
17907
+ }
17908
+ @keyframes colorPulse-success {
17909
+ 0%, 70%, 100% {
17910
+ background: hsl(141, 53%, 96%);
17911
+ /* 비활성 색상 */
17912
+ transform: scale(1);
17913
+ }
17914
+ 35% {
17915
+ background: hsl(141, 53%, 53%);
17916
+ /* 활성 색상 */
17917
+ transform: scale(1.1);
17918
+ }
17919
+ }
17920
+ @keyframes colorPulse-warning {
17921
+ 0%, 70%, 100% {
17922
+ background: hsl(38, 100%, 96%);
17923
+ /* 비활성 색상 */
17924
+ transform: scale(1);
17925
+ }
17926
+ 35% {
17927
+ background: hsl(38, 100%, 50%);
17928
+ /* 활성 색상 */
17929
+ transform: scale(1.1);
17930
+ }
17931
+ }
17932
+ @keyframes colorPulse-danger {
17933
+ 0%, 70%, 100% {
17934
+ background: hsl(348, 86%, 96%);
17935
+ /* 비활성 색상 */
17936
+ transform: scale(1);
17937
+ }
17938
+ 35% {
17939
+ background: hsl(348, 86%, 61%);
17940
+ /* 활성 색상 */
17941
+ transform: scale(1.1);
17942
+ }
17943
+ }
17944
+ @keyframes colorPulse-trans {
17945
+ 0%, 70%, 100% {
17946
+ background: hsl(0, 0%, 100%);
17947
+ /* 비활성 색상 */
17948
+ transform: scale(1);
17949
+ }
17950
+ 35% {
17951
+ background: hsl(0, 0%, 100%);
17952
+ /* 활성 색상 */
17953
+ transform: scale(1.1);
17954
+ }
17955
+ }
17956
+ @keyframes colorPulse-help {
17957
+ 0%, 70%, 100% {
17958
+ background: hsl(203, 96%, 96%);
17959
+ /* 비활성 색상 */
17960
+ transform: scale(1);
17961
+ }
17962
+ 35% {
17963
+ background: hsl(203, 96%, 43%);
17964
+ /* 활성 색상 */
17965
+ transform: scale(1.1);
17966
+ }
17967
+ }
17968
+ @keyframes colorPulse-plain {
17969
+ 0%, 70%, 100% {
17970
+ background: #ffffff;
17971
+ /* 비활성 색상 */
17972
+ transform: scale(1);
17973
+ }
17974
+ 35% {
17975
+ background: #ece8e8;
17976
+ /* 활성 색상 */
17977
+ transform: scale(1.1);
17978
+ }
17979
+ }
17980
+ @keyframes colorPulse-secondary {
17981
+ 0%, 70%, 100% {
17982
+ background: rgb(234.6, 246.9169811321, 255);
17983
+ /* 비활성 색상 */
17984
+ transform: scale(1);
17985
+ }
17986
+ 35% {
17987
+ background: #0080d4;
17988
+ /* 활성 색상 */
17989
+ transform: scale(1.1);
17990
+ }
17991
+ }
17992
+ @keyframes colorPulse-mono {
17993
+ 0%, 70%, 100% {
17994
+ background: rgb(244.8, 244.8, 244.8);
17995
+ /* 비활성 색상 */
17996
+ transform: scale(1);
17997
+ }
17998
+ 35% {
17999
+ background: #656565;
18000
+ /* 활성 색상 */
18001
+ transform: scale(1.1);
18002
+ }
18003
+ }
17483
18004
  /*
17484
18005
  ---
17485
18006
  name: Message
@@ -19048,22 +19569,26 @@ tag:
19048
19569
  ```
19049
19570
  ````
19050
19571
  Gn.create('picklist', {
19051
- target: '.new-picklist',
19052
- data : {
19572
+ target: '.new-picklist',
19573
+ data: {
19053
19574
  source: [
19054
- { value: 'item1', text: '항목1' },
19055
- { value: 'item2', text: '항목2' },
19056
- { value: 'item5', text: '항목3' },
19057
- { value: 'item4', text: '항목4' },
19058
- { value: 'item5', text: '항목5' },
19059
- { value: 'item6', text: '항목6' },
19060
- { value: 'item7', text: '항목7' },
19061
- { value: 'item8', text: '항목8' }
19575
+ { value: '항목1', text: 'item1', html: '<span class="gn-tag is-primary">항목1</span> item1' },
19576
+ { value: '항목2', text: 'item2', html: '<span class="gn-tag is-danger">항목2</span> item2' },
19577
+ { value: '항목3', text: 'item3', html: '<span class="gn-tag is-warning">항목3</span> item3' }
19062
19578
  ],
19063
- target: [],
19579
+ target: [
19580
+ { value: '항목4', text: 'item4', html: '<span class="gn-tag is-help">항목4</span> item4' },
19581
+ { value: '항목5', text: 'item5', html: '<span class="gn-tag is-success">항목5</span> item5' }
19582
+ ]
19064
19583
  },
19584
+ hasSourceSearch: true,
19585
+ hasTargetSearch: true,
19065
19586
  width: '80%',
19066
- height: 180
19587
+ height: 180,
19588
+ onChange: function (s, t) {
19589
+ console.log(s, t);
19590
+ },
19591
+ orderable: 'target'
19067
19592
  });
19068
19593
  Gn.create('picklist', {
19069
19594
  target: '.new-picklist-v',
@@ -19100,15 +19625,21 @@ tag:
19100
19625
  <tr>
19101
19626
  <td rowspan="2">data</td>
19102
19627
  <td>source</td>
19103
- <td>array[{value: string|array, text: string}]</td>
19628
+ <td>array[{value: string|array, text: string, html?: string, icon?:string}]</td>
19104
19629
  <td></td>
19105
- <td>source 항목 배열</td>
19630
+ <td>source 항목 배열<br>
19631
+ html: 옵션 html(html이 있는 경우 text가 있는 항목만 선택 가능하다.)<br>
19632
+ icon : <a href="https://fontawesome.com/cheatsheet?from=io" target="_blank">font awesome <span class="gn-icon is-small"><i class="fas fa-external-link-alt"></i></span></a> solid icon name
19633
+ </td>
19106
19634
  </tr>
19107
19635
  <tr>
19108
19636
  <td>target</td>
19109
- <td>array[{value: string|array, text: string}]</td>
19637
+ <td>array[{value: string|array, text: string, html?: string, icon?:string}]</td>
19110
19638
  <td></td>
19111
- <td>target 항목 배열</td>
19639
+ <td>target 항목 배열<br>
19640
+ html: 옵션 html(html이 있는 경우 text가 있는 항목만 선택 가능하다.)<br>
19641
+ icon : <a href="https://fontawesome.com/cheatsheet?from=io" target="_blank">font awesome <span class="gn-icon is-small"><i class="fas fa-external-link-alt"></i></span></a> solid icon name
19642
+ </td>
19112
19643
  </tr>
19113
19644
  <tr>
19114
19645
  <td rowspan="3">textSets</td>
@@ -19262,23 +19793,17 @@ tag:
19262
19793
  .gn-picklist .picklist-caption + .dropdown-items {
19263
19794
  border-radius: 0 0 2px 2px;
19264
19795
  }
19265
- .gn-picklist .picklist-source {
19796
+ .gn-picklist .gn-dropdown {
19797
+ display: block;
19798
+ }
19799
+ .gn-picklist .picklist-source,
19800
+ .gn-picklist .picklist-target {
19266
19801
  display: flex;
19267
19802
  flex-basis: calc(50% - 16px);
19268
19803
  width: calc(50% - 16px);
19269
19804
  flex-grow: 0;
19270
19805
  flex-shrink: 0;
19271
19806
  }
19272
- .gn-picklist .picklist-source > .gn-dropdown {
19273
- order: 2;
19274
- width: 100%;
19275
- }
19276
- .gn-picklist .picklist-source .picklist-controls {
19277
- order: 1;
19278
- }
19279
- .gn-picklist .gn-dropdown {
19280
- display: block;
19281
- }
19282
19807
  .gn-picklist .picklist-source.no-controls,
19283
19808
  .gn-picklist .picklist-target.no-controls {
19284
19809
  flex-basis: calc(50% - 45px);
@@ -19289,23 +19814,22 @@ tag:
19289
19814
  width: 100%;
19290
19815
  height: 100%;
19291
19816
  }
19292
- .gn-picklist.is-vertical .picklist-source,
19293
- .gn-picklist .picklist-target {
19294
- display: flex;
19295
- flex-basis: calc(50% - 16px);
19296
- width: calc(50% - 16px);
19297
- flex-grow: 0;
19298
- flex-shrink: 0;
19299
- }
19300
- .gn-picklist.is-vertical .picklist-source > .gn-dropdown,
19817
+ .gn-picklist .picklist-source > .gn-dropdown,
19301
19818
  .gn-picklist .picklist-target > .gn-dropdown {
19302
19819
  order: 1;
19303
19820
  width: 100%;
19304
19821
  }
19305
- .gn-picklist.is-vertical .picklist-source .picklist-controls,
19822
+ .gn-picklist .picklist-source .picklist-controls,
19306
19823
  .gn-picklist .picklist-target .picklist-controls {
19307
19824
  order: 2;
19308
19825
  }
19826
+ .gn-picklist .picklist-source > .gn-dropdown {
19827
+ order: 2;
19828
+ width: 100%;
19829
+ }
19830
+ .gn-picklist .picklist-source .picklist-controls {
19831
+ order: 1;
19832
+ }
19309
19833
  .gn-picklist .picklist-controls {
19310
19834
  margin: 0.5rem;
19311
19835
  }
@@ -19315,6 +19839,16 @@ tag:
19315
19839
  .gn-picklist.is-vertical {
19316
19840
  flex-direction: column;
19317
19841
  }
19842
+ .gn-picklist.is-vertical .picklist-source,
19843
+ .gn-picklist.is-vertical .picklist-target {
19844
+ width: calc(100% - 32px);
19845
+ }
19846
+ .gn-picklist.is-vertical .picklist-source > .gn-dropdown {
19847
+ order: 1;
19848
+ }
19849
+ .gn-picklist.is-vertical .picklist-source .picklist-controls {
19850
+ order: 2;
19851
+ }
19318
19852
  .gn-picklist.is-vertical > .picklist-controls {
19319
19853
  width: 90%;
19320
19854
  width: calc(100% - 50px);
@@ -19325,6 +19859,382 @@ tag:
19325
19859
  box-shadow: 0 0 0 0.1em rgba(241.077, 70.023, 104.2338, 0.7);
19326
19860
  }
19327
19861
 
19862
+ /*
19863
+ ---
19864
+ name: SortableList
19865
+ category:
19866
+ - CONTROLS/SortableList(js)
19867
+ tag:
19868
+ - v.0.1.0
19869
+ - javascript
19870
+ ---
19871
+ ### 기본 사용
19872
+
19873
+ ```html
19874
+ <div class="gn-sortablelist">
19875
+ <div class="sortablelist-controls gn-control is-small has-arrange is-vertical is-center">
19876
+ <button type="button" class="gn-button is-outline">
19877
+ <span class="gn-icon">
19878
+ <i class="fas fa-angle-double-up"></i>
19879
+ </span>
19880
+ </button>
19881
+ <button type="button" class="gn-button is-outline">
19882
+ <span class="gn-icon">
19883
+ <i class="fas fa-angle-up"></i>
19884
+ </span>
19885
+ </button>
19886
+ <button type="button" class="gn-button is-outline">
19887
+ <span class="gn-icon">
19888
+ <i class="fas fa-angle-down"></i>
19889
+ </span>
19890
+ </button>
19891
+ <button type="button" class="gn-button is-outline">
19892
+ <span class="gn-icon">
19893
+ <i class="fas fa-angle-double-down"></i>
19894
+ </span>
19895
+ </button>
19896
+ </div>
19897
+ <div class="gn-dropdown is-opened sortablelist-items">
19898
+ <div class="dropdown-items">
19899
+ <ul class="sortablelist-rows">
19900
+ <li class="dropdown-item">항목 1</li>
19901
+ <li class="dropdown-item">항목 2</li>
19902
+ <li class="dropdown-item">항목 3</li>
19903
+ <li class="dropdown-item">항목 4</li>
19904
+ </ul>
19905
+ </div>
19906
+ </div>
19907
+ </div>
19908
+ ```
19909
+
19910
+ ### 버튼 우측 배치
19911
+
19912
+ ```html
19913
+ <div class="gn-sortablelist">
19914
+ <div class="gn-dropdown is-opened sortablelist-items">
19915
+ <div class="dropdown-items">
19916
+ <ul class="sortablelist-rows">
19917
+ <li class="dropdown-item">항목 1</li>
19918
+ <li class="dropdown-item">항목 2</li>
19919
+ <li class="dropdown-item">항목 3</li>
19920
+ </ul>
19921
+ </div>
19922
+ </div>
19923
+ <div class="sortablelist-controls gn-control is-small has-arrange is-vertical is-center is-right">
19924
+ <button type="button" class="gn-button is-outline">
19925
+ <span class="gn-icon">
19926
+ <i class="fas fa-angle-double-up"></i>
19927
+ </span>
19928
+ </button>
19929
+ <button type="button" class="gn-button is-outline">
19930
+ <span class="gn-icon">
19931
+ <i class="fas fa-angle-up"></i>
19932
+ </span>
19933
+ </button>
19934
+ <button type="button" class="gn-button is-outline">
19935
+ <span class="gn-icon">
19936
+ <i class="fas fa-angle-down"></i>
19937
+ </span>
19938
+ </button>
19939
+ <button type="button" class="gn-button is-outline">
19940
+ <span class="gn-icon">
19941
+ <i class="fas fa-angle-double-down"></i>
19942
+ </span>
19943
+ </button>
19944
+ </div>
19945
+ </div>
19946
+ ```
19947
+
19948
+ ### 생성 옵션
19949
+ ```ejs
19950
+ <div class="new-sortablelist"></div>
19951
+ <div class="new-sortablelist-drag"></div>
19952
+ <div class="new-sortablelist-cols"></div>
19953
+ ```
19954
+ ````
19955
+ // 단일 컬럼
19956
+ Gn.create('sortablelist', {
19957
+ target: '.new-sortablelist',
19958
+ data: [
19959
+ { value: '1', text: '항목 1' },
19960
+ { value: '2', text: '항목 2' },
19961
+ { value: '3', text: '항목 3' },
19962
+ { value: '4', text: '항목 4' },
19963
+ { value: '5', text: '항목 5' },
19964
+ { value: '6', text: '항목 6' },
19965
+ { value: '7', text: '항목 7' },
19966
+ { value: '8', text: '항목 8' },
19967
+ { value: '9', text: '항목 9' },
19968
+ { value: '10', text: '항목 10' }
19969
+ ]
19970
+ });
19971
+ // 드래그 앤 드롭
19972
+ Gn.create('sortablelist', {
19973
+ target: '.new-sortablelist-drag',
19974
+ data: [
19975
+ { value: 'a', text: '항목 A' },
19976
+ { value: 'b', text: '항목 B' },
19977
+ { value: 'c', text: '항목 C' },
19978
+ { value: 'd', text: '항목 D' },
19979
+ { value: 'e', text: '항목 E' },
19980
+ { value: 'f', text: '항목 F' },
19981
+ { value: 'g', text: '항목 G' },
19982
+ { value: 'h', text: '항목 H' },
19983
+ { value: 'i', text: '항목 I' },
19984
+ { value: 'j', text: '항목 J' }
19985
+ ],
19986
+ draggable: true
19987
+ });
19988
+ // 다중 컬럼
19989
+ Gn.create('sortablelist', {
19990
+ target: '.new-sortablelist-cols',
19991
+ buttonPosition: 'right',
19992
+ data: [
19993
+ { value: 'x1', cols: ['항목1', '카테고리A', '1000'] },
19994
+ { value: 'x2', cols: ['항목2', '카테고리B', '2000'] },
19995
+ { value: 'x3', cols: ['항목3', '카테고리C', '3000'] },
19996
+ { value: 'x4', cols: ['항목4', '카테고리D', '4000'] },
19997
+ { value: 'x5', cols: ['항목5', '카테고리E', '5000'] },
19998
+ { value: 'x6', cols: ['항목6', '카테고리F', '6000'] },
19999
+ { value: 'x7', cols: ['항목7', '카테고리G', '7000'] },
20000
+ { value: 'x8', cols: ['항목8', '카테고리H', '8000'] },
20001
+ { value: 'x9', cols: ['항목9', '카테고리I', '9000'] },
20002
+ { value: 'x10', cols: ['항목10', '카테고리J', '10000'] }
20003
+ ]
20004
+ });
20005
+ ````
20006
+
20007
+ ### 데이터 모델 (SortableListItem)
20008
+
20009
+ <table class="gn-table is-full is-border">
20010
+ <thead>
20011
+ <th>필드</th>
20012
+ <th>type</th>
20013
+ <th>필수</th>
20014
+ <th>description</th>
20015
+ </thead>
20016
+ <tbody>
20017
+ <tr>
20018
+ <td>value</td>
20019
+ <td>string</td>
20020
+ <td>Y</td>
20021
+ <td>고유 값 (빈 문자열 불가)</td>
20022
+ </tr>
20023
+ <tr>
20024
+ <td>text</td>
20025
+ <td>string</td>
20026
+ <td>N</td>
20027
+ <td>단일 컬럼 표시 텍스트</td>
20028
+ </tr>
20029
+ <tr>
20030
+ <td>cols</td>
20031
+ <td>string[]</td>
20032
+ <td>N</td>
20033
+ <td>다중 컬럼 표시 값 배열</td>
20034
+ </tr>
20035
+ </tbody>
20036
+ </table>
20037
+
20038
+ ### 옵션
20039
+ <table class="gn-table is-full is-border">
20040
+ <thead>
20041
+ <th colspan="2">name</th>
20042
+ <th>type</th>
20043
+ <th>default</th>
20044
+ <th>description</th>
20045
+ </thead>
20046
+ <tbody>
20047
+ <tr>
20048
+ <td colspan="2">target</td>
20049
+ <td>string</td>
20050
+ <td></td>
20051
+ <td>sortablelist를 표시할 대상의 선택자(selector)</td>
20052
+ </tr>
20053
+ <tr>
20054
+ <td colspan="2">data</td>
20055
+ <td>SortableListItem[]</td>
20056
+ <td></td>
20057
+ <td>sortablelist에 표시할 데이터 배열</td>
20058
+ </tr>
20059
+ <tr>
20060
+ <td colspan="2">buttonPosition</td>
20061
+ <td>left | right</td>
20062
+ <td>left</td>
20063
+ <td>순서 변경 버튼 위치</td>
20064
+ </tr>
20065
+ <tr>
20066
+ <td colspan="2">draggable</td>
20067
+ <td>boolean</td>
20068
+ <td>false</td>
20069
+ <td>드래그 앤 드롭 순서 변경 활성화 여부</td>
20070
+ </tr>
20071
+ <tr>
20072
+ <td>textSets</td>
20073
+ <td>noData</td>
20074
+ <td>string</td>
20075
+ <td>No records available.</td>
20076
+ <td>데이터가 없을 경우 출력 메시지</td>
20077
+ </tr>
20078
+ <tr>
20079
+ <td colspan="2">disabled</td>
20080
+ <td>boolean</td>
20081
+ <td>false</td>
20082
+ <td>컴포넌트 비활성화 여부</td>
20083
+ </tr>
20084
+ <tr>
20085
+ <td colspan="2">width</td>
20086
+ <td>number, string</td>
20087
+ <td>100%</td>
20088
+ <td>컴포넌트 너비</td>
20089
+ </tr>
20090
+ <tr>
20091
+ <td colspan="2">height</td>
20092
+ <td>number, string</td>
20093
+ <td>150</td>
20094
+ <td>리스트 높이 (미지정 시 150)</td>
20095
+ </tr>
20096
+ <tr>
20097
+ <td colspan="2">onChange</td>
20098
+ <td>function(data)</td>
20099
+ <td></td>
20100
+ <td>데이터 변경 시 발생 이벤트</td>
20101
+ </tr>
20102
+ </tbody>
20103
+ </table>
20104
+
20105
+ ### 메소드
20106
+
20107
+ <table class="gn-table is-full is-border">
20108
+ <thead>
20109
+ <th>name</th>
20110
+ <th>return</th>
20111
+ <th>description</th>
20112
+ </thead>
20113
+ <tbody>
20114
+ <tr>
20115
+ <td>getData()</td>
20116
+ <td>SortableListItem[]</td>
20117
+ <td>현재 데이터 배열을 반환한다.</td>
20118
+ </tr>
20119
+ <tr>
20120
+ <td>setData(data: SortableListItem[]})</td>
20121
+ <td>void</td>
20122
+ <td>데이터 배열을 설정하고 다시 렌더링한다.</td>
20123
+ </tr>
20124
+ <tr>
20125
+ <td>disable()</td>
20126
+ <td>void</td>
20127
+ <td>컴포넌트를 비활성화한다.</td>
20128
+ </tr>
20129
+ <tr>
20130
+ <td>enable()</td>
20131
+ <td>void</td>
20132
+ <td>컴포넌트를 활성화한다.</td>
20133
+ </tr>
20134
+ </tbody>
20135
+ </table>
20136
+
20137
+ */
20138
+ .gn-sortablelist {
20139
+ display: flex;
20140
+ align-items: stretch;
20141
+ -webkit-user-select: none;
20142
+ -moz-user-select: none;
20143
+ user-select: none;
20144
+ }
20145
+ .gn-sortablelist .gn-dropdown {
20146
+ display: block;
20147
+ }
20148
+ .gn-sortablelist .sortablelist-items {
20149
+ flex: 1 1 auto;
20150
+ }
20151
+ .gn-sortablelist .sortablelist-controls {
20152
+ margin: 0.5rem;
20153
+ }
20154
+ .gn-sortablelist .sortablelist-controls .gn-button {
20155
+ padding: 0.25rem 0.75rem;
20156
+ }
20157
+ .gn-sortablelist .sortablelist-controls.is-right {
20158
+ order: 2;
20159
+ margin-left: 0.5rem;
20160
+ margin-right: 0;
20161
+ justify-content: center;
20162
+ }
20163
+ .gn-sortablelist .sortablelist-rows {
20164
+ margin: 0;
20165
+ padding: 0;
20166
+ list-style: none;
20167
+ }
20168
+ .gn-sortablelist .sortablelist-cols {
20169
+ display: flex;
20170
+ gap: 0.5rem;
20171
+ width: 100%;
20172
+ }
20173
+ .gn-sortablelist .sortablelist-col {
20174
+ flex: 1 1 0;
20175
+ min-width: 0;
20176
+ }
20177
+ .gn-sortablelist .dropdown-item.is-empty {
20178
+ color: hsl(0, 0%, 48%);
20179
+ }
20180
+ .gn-sortablelist .dropdown-item.is-dragging {
20181
+ opacity: 0.6;
20182
+ }
20183
+ .gn-sortablelist .dropdown-item.is-group-dragging {
20184
+ outline: 1px dashed hsl(0, 0%, 71%);
20185
+ }
20186
+ .gn-sortablelist .dropdown-item.is-drag-over-top,
20187
+ .gn-sortablelist .dropdown-item.is-drag-over-bottom {
20188
+ background-color: hsl(0, 0%, 96%);
20189
+ }
20190
+ .gn-sortablelist .dropdown-item.is-drag-over-top {
20191
+ box-shadow: inset 0 2px 0 0 #88b50f;
20192
+ }
20193
+ .gn-sortablelist .dropdown-item.is-drag-over-bottom {
20194
+ box-shadow: inset 0 -2px 0 0 #88b50f;
20195
+ }
20196
+
20197
+ .sortablelist-drag-preview {
20198
+ position: absolute;
20199
+ top: -9999px;
20200
+ left: -9999px;
20201
+ display: inline-flex;
20202
+ align-items: flex-start;
20203
+ gap: 8px;
20204
+ padding: 6px 10px;
20205
+ border-radius: 8px;
20206
+ background-color: hsl(0, 0%, 20%);
20207
+ color: hsl(0, 0%, 98%);
20208
+ font-size: 12px;
20209
+ line-height: 1;
20210
+ }
20211
+
20212
+ .sortablelist-drag-preview::before {
20213
+ content: attr(data-count);
20214
+ min-width: 18px;
20215
+ height: 18px;
20216
+ padding: 0 6px;
20217
+ border-radius: 999px;
20218
+ background-color: hsl(0, 0%, 98%);
20219
+ color: hsl(0, 0%, 20%);
20220
+ font-size: 11px;
20221
+ line-height: 18px;
20222
+ text-align: center;
20223
+ }
20224
+
20225
+ .sortablelist-drag-preview-list {
20226
+ display: flex;
20227
+ flex-direction: column;
20228
+ gap: 4px;
20229
+ }
20230
+
20231
+ .sortablelist-drag-preview .dropdown-item.is-ghost {
20232
+ padding: 4px 8px;
20233
+ background-color: hsl(0, 0%, 18%);
20234
+ border-radius: 4px;
20235
+ color: hsl(0, 0%, 98%);
20236
+ }
20237
+
19328
20238
  /*
19329
20239
  ---
19330
20240
  name: Progressbar
@@ -19904,6 +20814,7 @@ tag:
19904
20814
  .gn-tab > ul {
19905
20815
  display: flex;
19906
20816
  border-bottom: 1px solid #bebebe;
20817
+ padding-bottom: 0px;
19907
20818
  }
19908
20819
  .gn-tab.is-center > ul {
19909
20820
  justify-content: center;
@@ -21053,7 +21964,7 @@ Gn.create('tree', {
21053
21964
  }
21054
21965
  .gn-tree li .tree-item .is-toggler::before {
21055
21966
  content: "\f0da";
21056
- font-family: "Font Awesome 6 Pro", "Font Awesome 5 Free", "FontAwesome";
21967
+ font-family: "Font Awesome 7 Pro", "Font Awesome 6 Pro", "Font Awesome 5 Free", "FontAwesome";
21057
21968
  font-weight: 900;
21058
21969
  }
21059
21970
  .gn-tree li .tree-item + ul {