slim-select 1.27.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/.github/ISSUE_TEMPLATE/issue-report.md +3 -3
  2. package/.nvmrc +1 -0
  3. package/.prettierrc +6 -0
  4. package/.vscode/extensions.json +3 -0
  5. package/.vscode/settings.json +15 -5
  6. package/README.md +17 -19
  7. package/dist/helper.d.ts +1 -4
  8. package/dist/index.d.ts +38 -58
  9. package/dist/render.d.ts +109 -0
  10. package/dist/select.d.ts +31 -20
  11. package/dist/settings.d.ts +33 -0
  12. package/dist/slimselect.cjs.js +2 -0
  13. package/dist/slimselect.cjs.js.map +1 -0
  14. package/dist/slimselect.css +1 -2
  15. package/dist/slimselect.css.map +1 -0
  16. package/dist/slimselect.es.js +2 -0
  17. package/dist/slimselect.es.js.map +1 -0
  18. package/dist/slimselect.global.js +2 -0
  19. package/dist/slimselect.global.js.map +1 -0
  20. package/dist/slimselect.js +2 -1970
  21. package/dist/slimselect.js.map +1 -0
  22. package/dist/slimselect.umd.js +2 -0
  23. package/dist/slimselect.umd.js.map +1 -0
  24. package/dist/store.d.ts +71 -0
  25. package/docs/assets/check-mark.svg +6 -0
  26. package/docs/assets/data.js +59 -0
  27. package/docs/assets/home.css +1 -0
  28. package/docs/assets/home.js +1 -0
  29. package/docs/assets/index.css +1 -0
  30. package/docs/assets/index.js +16 -0
  31. package/docs/assets/index2.js +274 -0
  32. package/docs/assets/index3.js +126 -0
  33. package/docs/assets/index4.js +60 -0
  34. package/docs/assets/install.js +34 -0
  35. package/docs/assets/selects.js +55 -0
  36. package/docs/index.html +18 -5
  37. package/docs.go +3 -1
  38. package/index.html +16 -0
  39. package/jest.config.js +7 -0
  40. package/package.json +39 -35
  41. package/src/docs/app.vue +196 -73
  42. package/src/docs/assets/scss/_variables.scss +26 -10
  43. package/src/docs/assets/scss/alert.scss +12 -0
  44. package/src/docs/assets/scss/animations.scss +5 -3
  45. package/src/docs/assets/scss/button.scss +21 -0
  46. package/src/docs/assets/scss/index.scss +8 -6
  47. package/src/docs/assets/scss/input.scss +2 -2
  48. package/src/docs/assets/scss/layout.scss +195 -65
  49. package/src/docs/assets/scss/misc.scss +144 -34
  50. package/src/docs/assets/scss/prism.scss +155 -153
  51. package/src/docs/env.d.ts +12 -0
  52. package/src/docs/images/check-mark.svg +6 -0
  53. package/src/docs/images/chrome.svg +22 -0
  54. package/src/docs/images/firefox.svg +58 -0
  55. package/src/docs/images/github.png +0 -0
  56. package/src/docs/images/ie.svg +11 -0
  57. package/src/docs/images/npm.png +0 -0
  58. package/src/docs/images/opera.svg +15 -0
  59. package/src/docs/images/safari.svg +22 -0
  60. package/src/docs/main.ts +27 -0
  61. package/src/docs/pages/data.vue +130 -0
  62. package/src/docs/pages/events/addable.vue +79 -0
  63. package/src/docs/pages/events/before_after_change.vue +140 -0
  64. package/src/docs/pages/events/before_after_open_close.vue +122 -0
  65. package/src/docs/pages/events/error.vue +59 -0
  66. package/src/docs/pages/events/index.vue +33 -0
  67. package/src/docs/pages/events/search.vue +154 -0
  68. package/src/docs/pages/events/search_filter.vue +45 -0
  69. package/src/docs/pages/home.vue +131 -117
  70. package/src/docs/pages/install.vue +51 -74
  71. package/src/docs/pages/methods/destroy.vue +66 -0
  72. package/src/docs/pages/methods/enable_disable.vue +70 -0
  73. package/src/docs/pages/methods/get_data.vue +81 -0
  74. package/src/docs/pages/methods/get_selected.vue +78 -0
  75. package/src/docs/pages/methods/index.vue +36 -0
  76. package/src/docs/pages/methods/open_close.vue +63 -0
  77. package/src/docs/pages/methods/search.vue +62 -0
  78. package/src/docs/pages/methods/set_data.vue +106 -0
  79. package/src/docs/pages/methods/set_selected.vue +70 -0
  80. package/src/docs/pages/selects.vue +108 -114
  81. package/src/docs/pages/settings/always_open.vue +88 -0
  82. package/src/docs/pages/settings/close_on_select.vue +69 -0
  83. package/src/docs/pages/settings/content_location.vue +64 -0
  84. package/src/docs/pages/settings/content_position.vue +86 -0
  85. package/src/docs/pages/settings/css.vue +73 -0
  86. package/src/docs/pages/settings/data_attributes.vue +39 -0
  87. package/src/docs/pages/settings/deselect.vue +69 -0
  88. package/src/docs/pages/settings/display.vue +88 -0
  89. package/src/docs/pages/settings/hide_selected.vue +73 -0
  90. package/src/docs/pages/settings/html.vue +86 -0
  91. package/src/docs/pages/settings/index.vue +73 -0
  92. package/src/docs/pages/settings/mandatory.vue +91 -0
  93. package/src/docs/pages/settings/min_max.vue +61 -0
  94. package/src/docs/pages/settings/open_position.vue +60 -0
  95. package/src/docs/pages/settings/placeholder.vue +72 -0
  96. package/src/docs/pages/settings/search.vue +140 -0
  97. package/src/docs/pages/settings/select.vue +32 -0
  98. package/src/docs/pages/settings/select_by_group.vue +46 -0
  99. package/src/docs/pages/settings/show_tooltip.vue +44 -0
  100. package/src/docs/pages/settings/styles.vue +51 -0
  101. package/src/docs/router.ts +41 -13
  102. package/src/slim-select/helper.ts +25 -86
  103. package/src/slim-select/index.ts +317 -420
  104. package/src/slim-select/render.test.ts +39 -0
  105. package/src/slim-select/render.ts +1129 -0
  106. package/src/slim-select/rollup.config.mjs +40 -0
  107. package/src/slim-select/select.test.ts +155 -0
  108. package/src/slim-select/select.ts +280 -108
  109. package/src/slim-select/settings.ts +68 -0
  110. package/src/slim-select/slimselect.scss +263 -278
  111. package/src/slim-select/store.test.ts +220 -0
  112. package/src/slim-select/store.ts +320 -0
  113. package/src/slim-select/tsconfig.json +11 -5
  114. package/src/vue/slimselect.vue +61 -0
  115. package/tsconfig.json +10 -29
  116. package/vite.config.ts +18 -0
  117. package/.browserslistrc +0 -4
  118. package/.postcssrc.js +0 -5
  119. package/.travis.yml +0 -22
  120. package/babel.config.js +0 -5
  121. package/dist/config.d.ts +0 -83
  122. package/dist/data.d.ts +0 -50
  123. package/dist/slim.d.ts +0 -50
  124. package/dist/slimselect.min.css +0 -1
  125. package/dist/slimselect.min.js +0 -1
  126. package/dist/slimselect.min.mjs +0 -1
  127. package/docs/css/app.d5840d21.css +0 -1
  128. package/docs/css/chunk-vendors.fa8199af.css +0 -1
  129. package/docs/css/home.57020178.css +0 -1
  130. package/docs/css/install.baa5d3fb.css +0 -1
  131. package/docs/css/methods.728c742a.css +0 -1
  132. package/docs/css/options.b28a32ef.css +0 -1
  133. package/docs/css/selects.1a7e1e6a.css +0 -1
  134. package/docs/js/app.238ee382.js +0 -2
  135. package/docs/js/app.238ee382.js.map +0 -1
  136. package/docs/js/chunk-vendors.5125e3d8.js +0 -21
  137. package/docs/js/chunk-vendors.5125e3d8.js.map +0 -1
  138. package/docs/js/home.e7b28581.js +0 -2
  139. package/docs/js/home.e7b28581.js.map +0 -1
  140. package/docs/js/install.d4300783.js +0 -2
  141. package/docs/js/install.d4300783.js.map +0 -1
  142. package/docs/js/methods.fa1608f1.js +0 -11
  143. package/docs/js/methods.fa1608f1.js.map +0 -1
  144. package/docs/js/options.2c4ceb87.js +0 -2
  145. package/docs/js/options.2c4ceb87.js.map +0 -1
  146. package/docs/js/selects.1eeba693.js +0 -2
  147. package/docs/js/selects.1eeba693.js.map +0 -1
  148. package/src/docs/pages/methods.vue +0 -427
  149. package/src/docs/pages/options.vue +0 -1480
  150. package/src/main.ts +0 -29
  151. package/src/shims-vue.d.ts +0 -8
  152. package/src/slim-select/config.ts +0 -118
  153. package/src/slim-select/data.ts +0 -377
  154. package/src/slim-select/slim.ts +0 -775
  155. package/src/slim-select/webpack.config.js +0 -73
  156. package/tslint.json +0 -26
  157. package/vue.config.js +0 -23
@@ -0,0 +1,55 @@
1
+ import{d as c,S as p,_ as v,o as a,c as s,a as e,F as n,r as i,f as l,t as r}from"./index.js";const b=c({name:"Selects",data(){return{states:[{abv:"AL",state:"Alabama"},{abv:"AK",state:"Alaska"},{abv:"AZ",state:"Arizona"},{abv:"AR",state:"Arkansas"},{abv:"CA",state:"California"},{abv:"CO",state:"Colorado"},{abv:"CT",state:"Connecticut"},{abv:"DE",state:"Delaware"},{abv:"FL",state:"Florida"},{abv:"GA",state:"Georgia"},{abv:"HI",state:"Hawaii"},{abv:"ID",state:"Idaho"},{abv:"IL",state:"Illinois"},{abv:"IN",state:"Indiana"},{abv:"IA",state:"Iowa"},{abv:"KS",state:"Kansas"},{abv:"KY",state:"Kentucky"},{abv:"LA",state:"Louisiana"},{abv:"ME",state:"Maine"},{abv:"MD",state:"Maryland"},{abv:"MA",state:"Massachusetts"},{abv:"MI",state:"Michigan"},{abv:"MN",state:"Minnesota"},{abv:"MS",state:"Mississippi"},{abv:"MO",state:"Missouri"},{abv:"MT",state:"Montana"},{abv:"NE",state:"Nebraska"},{abv:"NV",state:"Nevada"},{abv:"NH",state:"New Hampshire"},{abv:"NJ",state:"New Jersey"},{abv:"NM",state:"New Mexico"},{abv:"NY",state:"New York"},{abv:"NC",state:"North Carolina"},{abv:"ND",state:"North Dakota"},{abv:"OH",state:"Ohio"},{abv:"OK",state:"Oklahoma"},{abv:"OR",state:"Oregon"},{abv:"PA",state:"Pennsylvania"},{abv:"RI",state:"Rhode Island"},{abv:"SC",state:"South Carolina"},{abv:"SD",state:"South Dakota"},{abv:"TN",state:"Tennessee",selected:!0},{abv:"TX",state:"Texas"},{abv:"UT",state:"Utah"},{abv:"VT",state:"Vermont"},{abv:"VA",state:"Virginia"},{abv:"WA",state:"Washington"},{abv:"WV",state:"West Virginia"},{abv:"WI",state:"Wisconsin"},{abv:"WY",state:"Wyoming"}],foods:[{label:"Dairy",options:["Milk","Cheese","Butter","Ice Cream"]},{label:"Meat",options:["Beef","Ham","Pork","Sausage","Chicken","Turkey"]},{label:"Fruits",options:["Apple","Banana","Grape","Orange","Strawberry","Blueberry","Raspberry"]},{label:"Vegetables",options:["Carrot","Tomato","Broccoli","Celery","Corn","Pumpkin","Kale","Spinach"]}]}},mounted(){new p({select:this.$refs.single}),new p({select:this.$refs.singleOptgroup}),new p({select:this.$refs.multiple}),new p({select:this.$refs.multipleOptgroup}).setSelected(["Cheese","Apple","Corn"])}}),d={id:"selects",class:"contents"},h={id:"single",class:"content"},_=e("h2",{class:"header"},"Single",-1),g=e("p",null," Basic single select usage with Slim Select is extremely easy. Just set the select value to your select element. ",-1),m={class:"row"},V=e("h4",null,"Options",-1),y={ref:"single"},k=["value","selected"],M=e("h4",null,"Optgroups",-1),S={ref:"singleOptgroup"},N=["label"],O=["value"],f=e("pre",null,[l(" "),e("code",{class:"language-javascript"},`
2
+ new SlimSelect({
3
+ select: '#single'
4
+ })
5
+ `),l(`
6
+ `)],-1),C=e("pre",null,[l(" "),e("code",{class:"language-html"},`
7
+ <!-- Options -->
8
+ <select id="single">
9
+ <option value="value 1">Value 1</option>
10
+ <option value="value 2">Value 2</option>
11
+ <option value="value 3">Value 3</option>
12
+ </select>
13
+
14
+ <!-- Optgroups -->
15
+ <select id="single-optgroups">
16
+ <optgroup label="Label 1">
17
+ <option value="value 1">Value 1</option>
18
+ <option value="value 2">Value 2</option>
19
+ <option value="value 3">Value 3</option>
20
+ </optgroup>
21
+ <optgroup label="Label 2">
22
+ <option value="value 21">Value 1</option>
23
+ <option value="value 22">Value 2</option>
24
+ <option value="value 23">Value 3</option>
25
+ </optgroup>
26
+ </select>
27
+ `),l(`
28
+ `)],-1),w={id:"multiple",class:"content"},A=e("h2",{class:"header"},"Multiple",-1),I=e("p",null," Multi selects work just the same as a single select. The only difference is setting the multiple attribute on your select. ",-1),T={class:"row"},D=e("h4",null,"Options",-1),L={ref:"multiple",multiple:""},B=["value","selected"],W=e("h4",null,"Optgroups",-1),$={ref:"multipleOptgroup",multiple:""},K=["label"],H=["value"],F=e("pre",null,[l(" "),e("code",{class:"language-javascript"},`
29
+ new SlimSelect({
30
+ select: '#multiple'
31
+ })
32
+ `),l(`
33
+ `)],-1),G=e("pre",null,[l(" "),e("code",{class:"language-html"},`
34
+ <!-- Options -->
35
+ <select id="multiple" multiple>
36
+ <option value="value 1">Value 1</option>
37
+ <option value="value 2">Value 2</option>
38
+ <option value="value 3">Value 3</option>
39
+ </select>
40
+
41
+ <!-- Optgroups -->
42
+ <select id="multiple-optgroups" multiple>
43
+ <optgroup label="Label 1">
44
+ <option value="value 1">Value 1</option>
45
+ <option value="value 2">Value 2</option>
46
+ <option value="value 3">Value 3</option>
47
+ </optgroup>
48
+ <optgroup label="Label 2">
49
+ <option value="value 21">Value 1</option>
50
+ <option value="value 22">Value 2</option>
51
+ <option value="value 23">Value 3</option>
52
+ </optgroup>
53
+ </select>
54
+ `),l(`
55
+ `)],-1);function R(u,E,P,Y,j,x){return a(),s("div",d,[e("div",h,[_,g,e("div",m,[e("div",null,[V,e("select",y,[(a(!0),s(n,null,i(u.states,t=>(a(),s("option",{key:t.abv,value:t.abv,selected:t.selected},r(t.state),9,k))),128))],512)]),e("div",null,[M,e("select",S,[(a(!0),s(n,null,i(u.foods,t=>(a(),s("optgroup",{key:t.label,label:t.label},[(a(!0),s(n,null,i(t.options,o=>(a(),s("option",{key:o,value:o},r(o),9,O))),128))],8,N))),128))],512)])]),f,C]),e("div",w,[A,I,e("div",T,[e("div",null,[D,e("select",L,[(a(!0),s(n,null,i(u.states,t=>(a(),s("option",{value:t.abv,key:t.abv,selected:t.selected},r(t.state),9,B))),128))],512)]),e("div",null,[W,e("select",$,[(a(!0),s(n,null,i(u.foods,t=>(a(),s("optgroup",{key:t.label,label:t.label},[(a(!0),s(n,null,i(t.options,o=>(a(),s("option",{key:o,value:o},r(o),9,H))),128))],8,K))),128))],512)])]),F,G])])}const U=v(b,[["render",R]]);export{U as default};
package/docs/index.html CHANGED
@@ -1,5 +1,18 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Slim Select</title><link rel="shortcut icon" href="favicon.ico"><meta name="description" content="Slim vanilla javascript select dropdown"><meta property="og:type" content="article"><meta property="og:title" content="Slim Select"><meta property="og:description" content="Slim vanilla javascript select dropdown"><link href="/css/home.57020178.css" rel="prefetch"><link href="/css/install.baa5d3fb.css" rel="prefetch"><link href="/css/methods.728c742a.css" rel="prefetch"><link href="/css/options.b28a32ef.css" rel="prefetch"><link href="/css/selects.1a7e1e6a.css" rel="prefetch"><link href="/js/home.e7b28581.js" rel="prefetch"><link href="/js/install.d4300783.js" rel="prefetch"><link href="/js/methods.fa1608f1.js" rel="prefetch"><link href="/js/options.2c4ceb87.js" rel="prefetch"><link href="/js/selects.1eeba693.js" rel="prefetch"><link href="/css/app.d5840d21.css" rel="preload" as="style"><link href="/css/chunk-vendors.fa8199af.css" rel="preload" as="style"><link href="/js/app.238ee382.js" rel="preload" as="script"><link href="/js/chunk-vendors.5125e3d8.js" rel="preload" as="script"><link href="/css/chunk-vendors.fa8199af.css" rel="stylesheet"><link href="/css/app.d5840d21.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but slim select doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script async src="https://www.googletagmanager.com/gtag/js?id=UA-96955238-1"></script><script>window.dataLayer = window.dataLayer || [];
2
- function gtag(){dataLayer.push(arguments);}
3
- gtag('js', new Date());
4
-
5
- gtag('config', 'UA-96955238-1');</script><script src="/js/chunk-vendors.5125e3d8.js"></script><script src="/js/app.238ee382.js"></script></body></html>
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" href="/favicon.ico" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Slim Select</title>
8
+ <script type="module" crossorigin src="/assets/index.js"></script>
9
+ <link rel="stylesheet" href="/assets/index.css">
10
+ </head>
11
+ <body>
12
+ <noscript>
13
+ <strong>We're sorry but this site doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
14
+ </noscript>
15
+ <div id="app"></div>
16
+
17
+ </body>
18
+ </html>
package/docs.go CHANGED
@@ -1,10 +1,12 @@
1
1
  package main
2
2
 
3
3
  import (
4
+ "fmt"
4
5
  "net/http"
5
6
  )
6
7
 
7
8
  func main() {
9
+ fmt.Println("Running on port 8080")
8
10
  http.Handle("/", http.FileServer(http.Dir("./docs")))
9
- http.ListenAndServe(":3000", nil)
11
+ http.ListenAndServe(":8080", nil)
10
12
  }
package/index.html ADDED
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" href="/favicon.ico" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Slim Select</title>
8
+ </head>
9
+ <body>
10
+ <noscript>
11
+ <strong>We're sorry but this site doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
12
+ </noscript>
13
+ <div id="app"></div>
14
+ <script type="module" src="/src/docs/main.ts"></script>
15
+ </body>
16
+ </html>
package/jest.config.js ADDED
@@ -0,0 +1,7 @@
1
+ /** @type {import('ts-jest').JestConfigWithTsJest} */
2
+ module.exports = {
3
+ preset: 'ts-jest',
4
+ testEnvironment: 'jsdom',
5
+ testMatch: ['**/*.test.ts'],
6
+ roots: ['./src/slim-select'],
7
+ }
package/package.json CHANGED
@@ -1,24 +1,20 @@
1
1
  {
2
2
  "name": "slim-select",
3
3
  "description": "Slim advanced select dropdown",
4
- "version": "1.27.1",
4
+ "version": "2.0.1",
5
5
  "author": "Brian Voelker <brian@webiswhatido.com> (http://webiswhatido.com)",
6
6
  "homepage": "https://slimselectjs.com",
7
7
  "license": "MIT",
8
8
  "bugs": {
9
9
  "url": "https://github.com/brianvoe/slim-select/issues"
10
10
  },
11
- "engines": {
12
- "node": ">=8"
13
- },
14
- "main": "dist/slimselect.min.js",
15
- "exports": {
16
- "require": "./dist/slimselect.min.js",
17
- "import": "./dist/slimselect.min.mjs"
18
- },
19
- "style": "dist/slimselect.min.css",
20
- "sass": "src/slim-select/slimselect.scss",
11
+ "main": "dist/slimselect.js",
12
+ "module": "dist/slimselect.es.js",
13
+ "unpkg": "dist/slimselect.js",
21
14
  "types": "dist/index.d.ts",
15
+ "typings": "dist/index.d.ts",
16
+ "style": "dist/slimselect.css",
17
+ "sass": "src/slim-select/slimselect.scss",
22
18
  "repository": {
23
19
  "type": "git",
24
20
  "url": "git+https://github.com/brianvoe/slim-select.git"
@@ -31,31 +27,39 @@
31
27
  "multiselect"
32
28
  ],
33
29
  "scripts": {
34
- "dev": "vue-cli-service serve",
35
- "library": "rm -r dist && cd src/slim-select && webpack && cd ../../ && npm run cleanDist && npm run renameDist && npm run mjs",
36
- "cleanDist": "rm dist/slimselectcss.min.js && rm dist/slimselectcss.js",
37
- "renameDist": "mv 'dist/slimselectcss.css' 'dist/slimselect.css' && mv 'dist/slimselectcss.min.css' 'dist/slimselect.min.css'",
38
- "docs": "vue-cli-service build",
39
- "build": "npm run docs && npm run library",
40
- "mjs": "(printf 'var exports = {};'; cat dist/slimselect.min.js; printf 'export default exports.SlimSelect') > dist/slimselect.min.mjs",
41
- "lint": "vue-cli-service lint"
30
+ "jestinit": "ts-jest config:init",
31
+ "dev": "vite --port=1111",
32
+ "format": "prettier --write --cache --parser typescript \"src/**/*.ts\"",
33
+ "build": "npm run build:clean && npm run build:docs && npm run build:library",
34
+ "build:clean": "rimraf ./dist/*",
35
+ "build:docs": "vite build",
36
+ "build:library": "npm run build:library:js && npm run build:library:css",
37
+ "build:library:js": "cd src/slim-select && rollup --config ./rollup.config.mjs && cd ../../",
38
+ "build:library:css": "cd src/slim-select && sass ./slimselect.scss ../../dist/slimselect.css --style=compressed && cd ../../",
39
+ "test": "jest"
42
40
  },
43
41
  "devDependencies": {
44
- "@vue/cli-plugin-babel": "^4.5.15",
45
- "@vue/cli-plugin-typescript": "^4.5.15",
46
- "@vue/cli-service": "^4.5.15",
47
- "chance": "^1.1.8",
48
- "clipboard": "^2.0.8",
49
- "node-sass": "^5.0.0",
50
- "optimize-css-assets-webpack-plugin": "^5.0.4",
51
- "prismjs": "^1.25.0",
52
- "sass-loader": "^10.1.0",
53
- "typescript": "^4.5.4",
54
- "uglifyjs-webpack-plugin": "^2.2.0",
55
- "vue": "^2.6.14",
56
- "vue-router": "^3.5.3",
57
- "vue-template-compiler": "^2.6.14",
58
- "vuex": "^3.6.2",
59
- "webpack-cli": "^4.9.1"
42
+ "@jest/globals": "^29.3.1",
43
+ "@rollup/plugin-typescript": "^9.0.2",
44
+ "@types/downloadjs": "^1.4.3",
45
+ "@vitejs/plugin-vue": "^3.2.0",
46
+ "clipboard": "^2.0.11",
47
+ "downloadjs": "^1.4.7",
48
+ "jest": "^29.3.1",
49
+ "jest-environment-jsdom": "^29.3.1",
50
+ "prettier": "^2.7.1",
51
+ "prismjs": "^1.29.0",
52
+ "rimraf": "^3.0.2",
53
+ "rollup": "^2.79.1",
54
+ "rollup-plugin-terser": "^7.0.2",
55
+ "sass": "^1.56.1",
56
+ "ts-jest": "^29.0.3",
57
+ "tslib": "^2.4.1",
58
+ "typescript": "^4.9.3",
59
+ "vite": "^3.2.4",
60
+ "vue": "^3.2.45",
61
+ "vue-router": "^4.1.6",
62
+ "vue-tsc": "^1.0.9",
63
+ "vuex": "^4.0.2"
60
64
  }
61
65
  }
package/src/docs/app.vue CHANGED
@@ -1,98 +1,221 @@
1
- <script>
2
- import SlimSelect from '@/slim-select'
3
-
4
- export default {
5
- data() {
6
- const path = this.$route.path
7
- return {
8
- year: new Date().getFullYear(),
9
- navData: [
10
- {text: 'Home', value: '/', selected: (path === '/')},
11
- {text: 'Installation', value: 'install', selected: (path === '/install')},
12
- {text: 'Select Types', value: 'selects', selected: (path === '/selects')},
13
- {text: 'Options', value: 'options', selected: (path === '/options')},
14
- {text: 'Methods', value: 'methods', selected: (path === '/methods')}
15
- ]
1
+ <script lang="ts">
2
+ import { defineComponent } from 'vue'
3
+
4
+ import SlimSelect, { debounce, Settings } from '../slim-select'
5
+
6
+ export default defineComponent({
7
+ name: 'App',
8
+ data() {
9
+ return {
10
+ nav: null as SlimSelect | null,
11
+ navDebounce: debounce(() => {
12
+ this.setDemensions()
13
+ }, 100),
14
+ year: new Date().getFullYear(),
15
+ width: 0,
16
+ height: 0,
17
+
18
+ navData: [
19
+ { text: 'Home', value: '/', class: 'label' },
20
+
21
+ // Install
22
+ { text: 'Install', value: 'install', class: 'label' },
23
+ { text: 'npm', value: 'install#npm', class: 'mar-l-l' },
24
+ { text: 'cdn', value: 'install#cdn', class: 'mar-l-l' },
25
+ { text: 'download', value: 'install#download', class: 'mar-l-l' },
26
+
27
+ // Select
28
+ { text: 'Selects', value: 'selects', class: 'label' },
29
+ { text: 'single', value: 'selects#single', class: 'mar-l-l' },
30
+ { text: 'multiple', value: 'selects#multiple', class: 'mar-l-l' },
31
+
32
+ // Data
33
+ { text: 'Data', value: 'data', class: 'label' },
34
+ { text: 'types', value: 'data#types', class: 'mar-l-l' },
35
+ { text: 'field', value: 'data#field', class: 'mar-l-l' },
36
+
37
+ // Settings
38
+ { text: 'Settings', value: 'settings', class: 'label' },
39
+ { text: 'select', value: 'settings#select', class: 'mar-l-l' },
40
+ { text: 'alwaysOpen', value: 'settings#alwaysOpen', class: 'mar-l-l' },
41
+ { text: 'contentLocation', value: 'settings#contentLocation', class: 'mar-l-l' },
42
+ { text: 'contentPosition', value: 'settings#contentPosition', class: 'mar-l-l' },
43
+ { text: 'openPosition', value: 'settings#openPosition', class: 'mar-l-l' },
44
+ { text: 'placeholder', value: 'settings#placeholder', class: 'mar-l-l' },
45
+ { text: 'allowDeselect', value: 'settings#allowDeselect', class: 'mar-l-l' },
46
+ { text: 'display', value: 'settings#display', class: 'mar-l-l' },
47
+ { text: 'mandatory', value: 'settings#mandatory', class: 'mar-l-l' },
48
+ { text: 'minmax', value: 'settings#minmax', class: 'mar-l-l' },
49
+ { text: 'dataAttributes', value: 'settings#dataAttributes', class: 'mar-l-l' },
50
+ { text: 'cssClass', value: 'settings#cssClass', class: 'mar-l-l' },
51
+ { text: 'inlineStyles', value: 'settings#inlineStyles', class: 'mar-l-l' },
52
+ { text: 'html', value: 'settings#html', class: 'mar-l-l' },
53
+ { text: 'search', value: 'settings#search', class: 'mar-l-l' },
54
+ { text: 'closeOnSelect', value: 'settings#closeOnSelect', class: 'mar-l-l' },
55
+ { text: 'showOptionTooltips', value: 'settings#showOptionTooltips', class: 'mar-l-l' },
56
+ { text: 'selectByGroup', value: 'settings#selectByGroup', class: 'mar-l-l' },
57
+ { text: 'hideSelected', value: 'settings#hideSelected', class: 'mar-l-l' },
58
+
59
+ // Events
60
+ { text: 'Events', value: 'events', class: 'label' },
61
+ { text: 'error', value: 'events#error', class: 'mar-l-l' },
62
+ { text: 'beforeChange', value: 'events#beforeChange', class: 'mar-l-l' },
63
+ { text: 'afterChange', value: 'events#afterChange', class: 'mar-l-l' },
64
+ { text: 'open', value: 'events#open', class: 'mar-l-l' },
65
+ { text: 'search', value: 'events#search', class: 'mar-l-l' },
66
+ { text: 'searchFilter', value: 'events#searchFilter', class: 'mar-l-l' },
67
+ { text: 'addable', value: 'events#addable', class: 'mar-l-l' },
68
+
69
+ // Methods
70
+ { text: 'Methods', value: 'methods', class: 'label' },
71
+ { text: 'getSelected', value: 'methods#getSelected', class: 'mar-l-l' },
72
+ { text: 'setSelected', value: 'methods#setSelected', class: 'mar-l-l' },
73
+ { text: 'getData', value: 'methods#getData', class: 'mar-l-l' },
74
+ { text: 'setData', value: 'methods#setData', class: 'mar-l-l' },
75
+ { text: 'enableDisable', value: 'methods#enableDisable', class: 'mar-l-l' },
76
+ { text: 'search', value: 'methods#search', class: 'mar-l-l' },
77
+ { text: 'destroy', value: 'methods#destroy', class: 'mar-l-l' },
78
+ ],
79
+ }
80
+ },
81
+ mounted() {
82
+ this.runNav()
83
+
84
+ this.$router.isReady().then(() => {
85
+ if (this.nav) {
86
+ this.nav.setSelected(this.$router.currentRoute.value.fullPath.replace('/', ''))
16
87
  }
17
- },
18
- mounted() {
19
- // Lets redirect to path
88
+ })
89
+
90
+ this.$router.afterEach(() => {
20
91
  if (this.$route.query.p) {
21
- this.$router.push({ path: this.$route.query.p })
92
+ // Delay router push to allow for
93
+ // other things to happen first
94
+ setTimeout(() => {
95
+ if (this.$route.query.p) {
96
+ this.$router.push({ path: this.$route.query.p.toString(), hash: this.$route.hash })
97
+ }
98
+ }, 200)
99
+
100
+ return
22
101
  }
23
102
 
24
- const slim = new SlimSelect({
25
- select: '#select-nav',
26
- showSearch: false,
27
- onChange: (info) => {
28
- if (!this.$route.path.includes(info.value)) {
29
- this.$router.push({ path: info.value })
30
- }
103
+ // After route change get the hash and scroll to element in main
104
+ setTimeout(() => {
105
+ const hash = this.$route.hash
106
+ if (hash === '') {
107
+ window.scroll({
108
+ top: 0,
109
+ behavior: 'smooth',
110
+ })
31
111
  }
32
- })
33
- slim.setData(this.navData)
34
112
 
35
- this.$router.onReady(() => {
36
- const urlPathValue = this.$route.path.replace('/', '')
37
- if (urlPathValue !== '') {
38
- slim.setSelected(urlPathValue)
113
+ // If hash is not empty scroll to element
114
+ if (hash) {
115
+ const el = document.querySelector(hash) as HTMLElement
116
+ if (el) {
117
+ // get header height
118
+ const header = document.querySelector('header') as HTMLElement
119
+ const nav = document.querySelector('nav') as HTMLElement
120
+ const headerHeight = header ? header.clientHeight + (window.innerWidth < 700 ? nav.clientHeight : 0) + 8 : 0
121
+
122
+ window.scroll({
123
+ top: el.offsetTop - headerHeight, // header height + padding
124
+ behavior: 'smooth',
125
+ })
126
+ }
39
127
  }
40
- })
41
- }
42
- }
43
- </script>
128
+ }, 200)
129
+ })
44
130
 
45
- <style lang="scss">
46
- #app {
47
- .select-nav {
48
- .ss-single-selected {
49
- position: relative;
50
- z-index: 2000;
131
+ this.setDemensions()
132
+ window.addEventListener('resize', this.navDebounce)
133
+ },
134
+ unmounted() {
135
+ window.removeEventListener('resize', this.navDebounce)
51
136
 
52
- .placeholder {
53
- font-weight: bold;
54
- }
137
+ this.nav?.destroy()
138
+ },
139
+ watch: {
140
+ width() {
141
+ this.runNav()
142
+ },
143
+ },
144
+ methods: {
145
+ setDemensions(): void {
146
+ this.width = document.documentElement.clientWidth
147
+ this.height = document.documentElement.clientHeight
148
+ },
149
+ runNav() {
150
+ if (this.nav) {
151
+ this.nav.destroy()
152
+ this.nav = null
55
153
  }
56
154
 
57
- .ss-content {
58
- box-shadow: 0px 5px 10px 5px rgba(0, 0, 0, 0.2);
155
+ let settings = {
156
+ searchHighlight: true,
157
+ openContent: 'below',
158
+ } as Partial<Settings>
59
159
 
60
- .ss-option {
61
- font-weight: bold;
62
- }
160
+ if (this.width > 700) {
161
+ settings.alwaysOpen = true
162
+ settings.contentPosition = 'relative'
163
+ settings.contentLocation = this.$refs.navContent as HTMLDivElement
63
164
  }
64
- }
65
- }
66
- </style>
165
+
166
+ this.nav = new SlimSelect({
167
+ select: this.$refs.nav as HTMLSelectElement,
168
+ data: this.navData,
169
+ settings: settings,
170
+ events: {
171
+ afterChange: (newVal) => {
172
+ const value = newVal[0].value
173
+ const split = value.split('#')
174
+ const val = split[0]
175
+ const hash = split[1] ? '#' + split[1] : undefined
176
+ this.$router.push({ path: val, hash: hash })
177
+ },
178
+ },
179
+ })
180
+ },
181
+ },
182
+ })
183
+ </script>
67
184
 
68
185
  <template>
69
- <div id="app">
70
- <div class="header">
186
+ <header>
187
+ <div class="top">
71
188
  <div class="text">
72
- <div class="logo">
73
- Slim Select
74
- </div>
75
- <div class="tagline">
76
- Slim advanced select dropdown
77
- </div>
189
+ <h1 class="logo">Slim Select</h1>
78
190
  </div>
79
- <div class="select-nav">
191
+ <div class="socials">
80
192
  <a href="https://github.com/brianvoe/slim-select" target="_blank">
81
- <img src="images/github.png" />
193
+ <img src="./images/github.png" />
82
194
  </a>
83
195
  <a href="https://www.npmjs.com/package/slim-select" target="_blank">
84
- <img src="images/npm.png" />
196
+ <img src="./images/npm.png" />
85
197
  </a>
86
- <select id="select-nav"></select>
87
198
  </div>
88
199
  </div>
89
- <div class="main">
90
- <transition name="fade" mode="out-in" appear>
91
- <router-view></router-view>
92
- </transition>
93
- </div>
94
- <div class="footer">
95
- © {{year}} <a href="http://webiswhatido.com" style="color: #ffffff;" target="_blank">Brian Voelker</a>. Slim Select is under the MIT license.
200
+ <div class="bar">
201
+ <div class="tagline">Advanced select dropdown</div>
202
+ <div class="drop">
203
+ <svg viewBox="0 0 100 100">
204
+ <path d="M10,30 L50,70 L90,30" />
205
+ </svg>
206
+ </div>
96
207
  </div>
97
- </div>
208
+ </header>
209
+ <nav>
210
+ <select ref="nav"></select>
211
+ <div class="nav-content" ref="navContent"></div>
212
+ </nav>
213
+ <main>
214
+ <router-view />
215
+ <footer>
216
+ © {{ year }} <a href="http://webiswhatido.com" style="color: #ffffff" target="_blank">Brian Voelker</a>.
217
+ <br />
218
+ Slim Select is under the MIT license.
219
+ </footer>
220
+ </main>
98
221
  </template>
@@ -1,10 +1,26 @@
1
- $primary-color: #5897fb;
2
- $secondary-color: #666666;
3
- $border-color: #dcdee2;
4
- $font-color: #666666;
5
- $white: #ffffff;
6
- $max-width: 800px;
7
- $min-width: 360px;
8
- $spacing: 20px;
9
- $spacing-half: $spacing/2;
10
- $spacing-quarter: $spacing/4;
1
+ :root {
2
+ // Colors
3
+ --color-primary: #5897fb;
4
+ --color-secondary: #666666;
5
+ --color-header-bg: #ffffff;
6
+ --color-border: #dcdee2;
7
+ --color-font: #66666;
8
+ --color-white: #ffffff;
9
+ --color-alert-info: #cfe2ff;
10
+ --color-alert-info-border: #b6d4fe;
11
+
12
+ // Sizes
13
+ --width-max: 1200px;
14
+ --height-header: 90px;
15
+ --width-nav: 200px;
16
+ --height-nav: 30px;
17
+
18
+ // Misc
19
+ --border-radius: 4px;
20
+ --font-size: 14px;
21
+
22
+ // Spacings
23
+ --spacing: 16px;
24
+ --spacing-half: 8px;
25
+ --spacing-quarter: 4px;
26
+ }
@@ -0,0 +1,12 @@
1
+ .alert {
2
+ position: relative;
3
+ color: var(--color-font);
4
+ padding: var(--spacing-half) var(--spacing);
5
+ margin: 0 0 var(--spacing-half) 0;
6
+ border-radius: var(--border-radius);
7
+
8
+ &.info {
9
+ background-color: var(--color-alert-info);
10
+ border-color: var(--color-alert-info-border);
11
+ }
12
+ }
@@ -1,6 +1,8 @@
1
- .fade-enter-active, .fade-leave-active {
2
- transition: opacity .3s ease-in-out;
1
+ .fade-enter-active,
2
+ .fade-leave-active {
3
+ transition: opacity 0.3s ease-in-out;
3
4
  }
4
- .fade-enter, .fade-leave-to {
5
+ .fade-enter,
6
+ .fade-leave-to {
5
7
  opacity: 0;
6
8
  }
@@ -0,0 +1,21 @@
1
+ button,
2
+ .btn {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ color: var(--color-white);
6
+ height: 30px;
7
+ width: auto;
8
+ max-width: 100%;
9
+ min-width: auto;
10
+ padding: 0 var(--spacing-half) 0 var(--spacing-half);
11
+ cursor: pointer;
12
+ background-color: var(--color-primary);
13
+ text-align: center;
14
+ line-height: 18px;
15
+ user-select: none;
16
+ white-space: nowrap;
17
+ border-radius: var(--border-radius);
18
+ vertical-align: middle;
19
+ box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset;
20
+ box-sizing: content-box;
21
+ }
@@ -1,6 +1,8 @@
1
- @import "_variables";
2
- @import "layout";
3
- @import "prism";
4
- @import "misc";
5
- @import "animations";
6
- @import "input";
1
+ @import '_variables';
2
+ @import 'layout';
3
+ @import 'prism';
4
+ @import 'misc';
5
+ @import 'animations';
6
+ @import 'button';
7
+ @import 'input';
8
+ @import 'alert';
@@ -1,3 +1,3 @@
1
1
  input {
2
- color: $font-color;
3
- }
2
+ color: var(--color-font);
3
+ }