slim-select 1.27.0 → 2.0.0

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 (155) hide show
  1. package/.nvmrc +1 -0
  2. package/.prettierrc +6 -0
  3. package/.vscode/extensions.json +3 -0
  4. package/.vscode/settings.json +15 -5
  5. package/README.md +2 -1
  6. package/dist/helper.d.ts +1 -4
  7. package/dist/index.d.ts +38 -58
  8. package/dist/render.d.ts +109 -0
  9. package/dist/select.d.ts +31 -20
  10. package/dist/settings.d.ts +33 -0
  11. package/dist/slimselect.cjs.js +2 -0
  12. package/dist/slimselect.cjs.js.map +1 -0
  13. package/dist/slimselect.css +1 -2
  14. package/dist/slimselect.css.map +1 -0
  15. package/dist/slimselect.es.js +2 -0
  16. package/dist/slimselect.es.js.map +1 -0
  17. package/dist/slimselect.global.js +2 -0
  18. package/dist/slimselect.global.js.map +1 -0
  19. package/dist/slimselect.js +2 -1956
  20. package/dist/slimselect.js.map +1 -0
  21. package/dist/slimselect.umd.js +2 -0
  22. package/dist/slimselect.umd.js.map +1 -0
  23. package/dist/store.d.ts +71 -0
  24. package/docs/assets/check-mark.svg +6 -0
  25. package/docs/assets/data.js +59 -0
  26. package/docs/assets/home.css +1 -0
  27. package/docs/assets/home.js +1 -0
  28. package/docs/assets/index.css +1 -0
  29. package/docs/assets/index.js +16 -0
  30. package/docs/assets/index2.js +274 -0
  31. package/docs/assets/index3.js +126 -0
  32. package/docs/assets/index4.js +60 -0
  33. package/docs/assets/install.js +34 -0
  34. package/docs/assets/selects.js +55 -0
  35. package/docs/index.html +18 -5
  36. package/docs.go +3 -1
  37. package/index.html +16 -0
  38. package/jest.config.js +7 -0
  39. package/package.json +39 -39
  40. package/src/docs/app.vue +185 -76
  41. package/src/docs/assets/scss/_variables.scss +26 -10
  42. package/src/docs/assets/scss/alert.scss +12 -0
  43. package/src/docs/assets/scss/animations.scss +5 -3
  44. package/src/docs/assets/scss/button.scss +21 -0
  45. package/src/docs/assets/scss/index.scss +8 -6
  46. package/src/docs/assets/scss/input.scss +2 -2
  47. package/src/docs/assets/scss/layout.scss +195 -65
  48. package/src/docs/assets/scss/misc.scss +144 -34
  49. package/src/docs/assets/scss/prism.scss +155 -153
  50. package/src/docs/env.d.ts +12 -0
  51. package/src/docs/images/check-mark.svg +6 -0
  52. package/src/docs/images/chrome.svg +22 -0
  53. package/src/docs/images/firefox.svg +58 -0
  54. package/src/docs/images/github.png +0 -0
  55. package/src/docs/images/ie.svg +11 -0
  56. package/src/docs/images/npm.png +0 -0
  57. package/src/docs/images/opera.svg +15 -0
  58. package/src/docs/images/safari.svg +22 -0
  59. package/src/docs/main.ts +27 -0
  60. package/src/docs/pages/data.vue +130 -0
  61. package/src/docs/pages/events/addable.vue +79 -0
  62. package/src/docs/pages/events/before_after_change.vue +140 -0
  63. package/src/docs/pages/events/before_after_open_close.vue +122 -0
  64. package/src/docs/pages/events/error.vue +59 -0
  65. package/src/docs/pages/events/index.vue +33 -0
  66. package/src/docs/pages/events/search.vue +154 -0
  67. package/src/docs/pages/events/search_filter.vue +45 -0
  68. package/src/docs/pages/home.vue +96 -116
  69. package/src/docs/pages/install.vue +47 -74
  70. package/src/docs/pages/methods/destroy.vue +66 -0
  71. package/src/docs/pages/methods/enable_disable.vue +70 -0
  72. package/src/docs/pages/methods/get_data.vue +81 -0
  73. package/src/docs/pages/methods/get_selected.vue +78 -0
  74. package/src/docs/pages/methods/index.vue +36 -0
  75. package/src/docs/pages/methods/open_close.vue +63 -0
  76. package/src/docs/pages/methods/search.vue +62 -0
  77. package/src/docs/pages/methods/set_data.vue +106 -0
  78. package/src/docs/pages/methods/set_selected.vue +70 -0
  79. package/src/docs/pages/selects.vue +108 -114
  80. package/src/docs/pages/settings/always_open.vue +88 -0
  81. package/src/docs/pages/settings/close_on_select.vue +69 -0
  82. package/src/docs/pages/settings/content_location.vue +64 -0
  83. package/src/docs/pages/settings/content_position.vue +86 -0
  84. package/src/docs/pages/settings/css.vue +73 -0
  85. package/src/docs/pages/settings/data_attributes.vue +39 -0
  86. package/src/docs/pages/settings/deselect.vue +69 -0
  87. package/src/docs/pages/settings/display.vue +88 -0
  88. package/src/docs/pages/settings/hide_selected.vue +73 -0
  89. package/src/docs/pages/settings/html.vue +86 -0
  90. package/src/docs/pages/settings/index.vue +73 -0
  91. package/src/docs/pages/settings/mandatory.vue +91 -0
  92. package/src/docs/pages/settings/min_max.vue +61 -0
  93. package/src/docs/pages/settings/open_position.vue +60 -0
  94. package/src/docs/pages/settings/placeholder.vue +72 -0
  95. package/src/docs/pages/settings/search.vue +140 -0
  96. package/src/docs/pages/settings/select.vue +32 -0
  97. package/src/docs/pages/settings/select_by_group.vue +46 -0
  98. package/src/docs/pages/settings/show_tooltip.vue +44 -0
  99. package/src/docs/pages/settings/styles.vue +51 -0
  100. package/src/docs/router.ts +41 -13
  101. package/src/slim-select/helper.ts +25 -86
  102. package/src/slim-select/index.ts +318 -413
  103. package/src/slim-select/render.test.ts +39 -0
  104. package/src/slim-select/render.ts +1129 -0
  105. package/src/slim-select/rollup.config.mjs +39 -0
  106. package/src/slim-select/select.test.ts +155 -0
  107. package/src/slim-select/select.ts +280 -107
  108. package/src/slim-select/settings.ts +68 -0
  109. package/src/slim-select/slimselect.scss +263 -278
  110. package/src/slim-select/store.test.ts +220 -0
  111. package/src/slim-select/store.ts +320 -0
  112. package/src/slim-select/tsconfig.json +11 -5
  113. package/src/vue/slimselect.vue +61 -0
  114. package/tsconfig.json +10 -29
  115. package/vite.config.ts +18 -0
  116. package/.browserslistrc +0 -4
  117. package/.postcssrc.js +0 -5
  118. package/.travis.yml +0 -22
  119. package/babel.config.js +0 -5
  120. package/dist/config.d.ts +0 -83
  121. package/dist/data.d.ts +0 -50
  122. package/dist/slim.d.ts +0 -50
  123. package/dist/slimselect.min.css +0 -1
  124. package/dist/slimselect.min.js +0 -1
  125. package/dist/slimselect.min.mjs +0 -1
  126. package/docs/css/app.d5840d21.css +0 -1
  127. package/docs/css/chunk-vendors.4db6930d.css +0 -1
  128. package/docs/css/home.57020178.css +0 -1
  129. package/docs/css/install.baa5d3fb.css +0 -1
  130. package/docs/css/methods.728c742a.css +0 -1
  131. package/docs/css/options.b28a32ef.css +0 -1
  132. package/docs/css/selects.1a7e1e6a.css +0 -1
  133. package/docs/js/app.db13c724.js +0 -2
  134. package/docs/js/app.db13c724.js.map +0 -1
  135. package/docs/js/chunk-vendors.cc40aa28.js +0 -28
  136. package/docs/js/chunk-vendors.cc40aa28.js.map +0 -1
  137. package/docs/js/home.8bcb44fd.js +0 -2
  138. package/docs/js/home.8bcb44fd.js.map +0 -1
  139. package/docs/js/install.02f31028.js +0 -2
  140. package/docs/js/install.02f31028.js.map +0 -1
  141. package/docs/js/methods.1b31e988.js +0 -11
  142. package/docs/js/methods.1b31e988.js.map +0 -1
  143. package/docs/js/options.39fe1005.js +0 -2
  144. package/docs/js/options.39fe1005.js.map +0 -1
  145. package/docs/js/selects.f4d0b859.js +0 -2
  146. package/docs/js/selects.f4d0b859.js.map +0 -1
  147. package/src/docs/pages/methods.vue +0 -427
  148. package/src/docs/pages/options.vue +0 -1480
  149. package/src/main.ts +0 -29
  150. package/src/shims-vue.d.ts +0 -8
  151. package/src/slim-select/config.ts +0 -118
  152. package/src/slim-select/data.ts +0 -377
  153. package/src/slim-select/slim.ts +0 -770
  154. package/tslint.json +0 -26
  155. 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.8bcb44fd.js" rel="prefetch"><link href="/js/install.02f31028.js" rel="prefetch"><link href="/js/methods.1b31e988.js" rel="prefetch"><link href="/js/options.39fe1005.js" rel="prefetch"><link href="/js/selects.f4d0b859.js" rel="prefetch"><link href="/css/app.d5840d21.css" rel="preload" as="style"><link href="/css/chunk-vendors.4db6930d.css" rel="preload" as="style"><link href="/js/app.db13c724.js" rel="preload" as="script"><link href="/js/chunk-vendors.cc40aa28.js" rel="preload" as="script"><link href="/css/chunk-vendors.4db6930d.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.cc40aa28.js"></script><script src="/js/app.db13c724.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.0",
4
+ "version": "2.0.0",
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,35 +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.10",
45
- "@vue/cli-plugin-typescript": "^4.5.10",
46
- "@vue/cli-service": "^4.5.10",
47
- "ajv": "^6.12.6",
48
- "chance": "^1.1.7",
49
- "clipboard": "^2.0.4",
50
- "node-sass": "^5.0.0",
51
- "optimize-css-assets-webpack-plugin": "^5.0.4",
52
- "prismjs": "^1.23.0",
53
- "sass-loader": "^10.1.0",
54
- "typescript": "^3.7.4",
55
- "uglifyjs-webpack-plugin": "^2.2.0",
56
- "vue": "^2.6.12",
57
- "vue-router": "^3.4.9",
58
- "vue-template-compiler": "^2.6.12",
59
- "vuex": "^3.6.0",
60
- "webpack-cli": "^4.3.1"
61
- },
62
- "dependencies": {
63
- "npm-check": "^5.9.2"
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"
64
64
  }
65
65
  }
package/src/docs/app.vue CHANGED
@@ -1,98 +1,207 @@
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
- ]
16
- }
17
- },
18
- mounted() {
19
- // Lets redirect to path
20
- if (this.$route.query.p) {
21
- this.$router.push({ path: this.$route.query.p })
22
- }
1
+ <script lang="ts">
2
+ import { defineComponent } from 'vue'
23
3
 
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
- }
31
- }
32
- })
33
- slim.setData(this.navData)
4
+ import SlimSelect, { debounce, Settings } from '../slim-select'
34
5
 
35
- this.$router.onReady(() => {
36
- const urlPathValue = this.$route.path.replace('/', '')
37
- if (urlPathValue !== '') {
38
- slim.setSelected(urlPathValue)
39
- }
40
- })
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
+ ],
41
79
  }
42
- }
43
- </script>
80
+ },
81
+ mounted() {
82
+ this.runNav()
44
83
 
45
- <style lang="scss">
46
- #app {
47
- .select-nav {
48
- .ss-single-selected {
49
- position: relative;
50
- z-index: 2000;
84
+ this.$router.isReady().then(() => {
85
+ if (this.nav) {
86
+ this.nav.setSelected(this.$router.currentRoute.value.fullPath.replace('/', ''))
87
+ }
88
+ })
51
89
 
52
- .placeholder {
53
- font-weight: bold;
90
+ this.$router.afterEach(() => {
91
+ // After route change get the hash and scroll to element in main
92
+ setTimeout(() => {
93
+ const hash = this.$route.hash
94
+ if (hash === '') {
95
+ window.scroll({
96
+ top: 0,
97
+ behavior: 'smooth',
98
+ })
54
99
  }
55
- }
56
100
 
57
- .ss-content {
58
- box-shadow: 0px 5px 10px 5px rgba(0, 0, 0, 0.2);
101
+ // If hash is not empty scroll to element
102
+ if (hash) {
103
+ const el = document.querySelector(hash) as HTMLElement
104
+ if (el) {
105
+ // get header height
106
+ const header = document.querySelector('header') as HTMLElement
107
+ const nav = document.querySelector('nav') as HTMLElement
108
+ const headerHeight = header ? header.clientHeight + (window.innerWidth < 700 ? nav.clientHeight : 0) + 8 : 0
59
109
 
60
- .ss-option {
61
- font-weight: bold;
110
+ window.scroll({
111
+ top: el.offsetTop - headerHeight, // header height + padding
112
+ behavior: 'smooth',
113
+ })
114
+ }
62
115
  }
116
+ }, 100)
117
+ })
118
+
119
+ this.setDemensions()
120
+ window.addEventListener('resize', this.navDebounce)
121
+ },
122
+ unmounted() {
123
+ window.removeEventListener('resize', this.navDebounce)
124
+ },
125
+ watch: {
126
+ width() {
127
+ this.runNav()
128
+ },
129
+ },
130
+ methods: {
131
+ setDemensions(): void {
132
+ this.width = document.documentElement.clientWidth
133
+ this.height = document.documentElement.clientHeight
134
+ },
135
+ runNav() {
136
+ if (this.nav) {
137
+ this.nav.destroy()
138
+ this.nav = null
63
139
  }
64
- }
65
- }
66
- </style>
140
+
141
+ let settings = {
142
+ searchHighlight: true,
143
+ openContent: 'below',
144
+ } as Partial<Settings>
145
+
146
+ if (this.width > 700) {
147
+ settings.alwaysOpen = true
148
+ settings.contentPosition = 'relative'
149
+ settings.contentLocation = this.$refs.navContent as HTMLDivElement
150
+ }
151
+
152
+ this.nav = new SlimSelect({
153
+ select: this.$refs.nav as HTMLSelectElement,
154
+ data: this.navData,
155
+ settings: settings,
156
+ events: {
157
+ afterChange: (newVal) => {
158
+ const value = newVal[0].value
159
+ const split = value.split('#')
160
+ const val = split[0]
161
+ const hash = split[1] ? '#' + split[1] : undefined
162
+ this.$router.push({ path: val, hash: hash })
163
+ },
164
+ },
165
+ })
166
+ },
167
+ },
168
+ })
169
+ </script>
67
170
 
68
171
  <template>
69
- <div id="app">
70
- <div class="header">
172
+ <header>
173
+ <div class="top">
71
174
  <div class="text">
72
- <div class="logo">
73
- Slim Select
74
- </div>
75
- <div class="tagline">
76
- Slim advanced select dropdown
77
- </div>
175
+ <h1 class="logo">Slim Select</h1>
78
176
  </div>
79
- <div class="select-nav">
177
+ <div class="socials">
80
178
  <a href="https://github.com/brianvoe/slim-select" target="_blank">
81
- <img src="images/github.png" />
179
+ <img src="./images/github.png" />
82
180
  </a>
83
181
  <a href="https://www.npmjs.com/package/slim-select" target="_blank">
84
- <img src="images/npm.png" />
182
+ <img src="./images/npm.png" />
85
183
  </a>
86
- <select id="select-nav"></select>
87
184
  </div>
88
185
  </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.
186
+ <div class="bar">
187
+ <div class="tagline">Advanced select dropdown</div>
188
+ <div class="drop">
189
+ <svg viewBox="0 0 100 100">
190
+ <path d="M10,30 L50,70 L90,30" />
191
+ </svg>
192
+ </div>
96
193
  </div>
97
- </div>
194
+ </header>
195
+ <nav>
196
+ <select ref="nav"></select>
197
+ <div class="nav-content" ref="navContent"></div>
198
+ </nav>
199
+ <main>
200
+ <router-view />
201
+ <footer>
202
+ © {{ year }} <a href="http://webiswhatido.com" style="color: #ffffff" target="_blank">Brian Voelker</a>.
203
+ <br />
204
+ Slim Select is under the MIT license.
205
+ </footer>
206
+ </main>
98
207
  </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
+ }