@vkontakte/vkui 5.5.2 → 5.5.3

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 (97) hide show
  1. package/dist/cjs/components/ChipsSelect/ChipsSelect.js +13 -9
  2. package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
  3. package/dist/cjs/components/CustomSelect/CustomSelect.js +23 -17
  4. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  5. package/dist/cjs/components/FixedLayout/FixedLayout.d.ts +6 -1
  6. package/dist/cjs/components/FixedLayout/FixedLayout.js +11 -4
  7. package/dist/cjs/components/FixedLayout/FixedLayout.js.map +1 -1
  8. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js +7 -7
  9. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  10. package/dist/cjs/components/ImageBase/ImageBase.d.ts +2 -2
  11. package/dist/cjs/components/ImageBase/ImageBase.js.map +1 -1
  12. package/dist/cjs/components/PullToRefresh/PullToRefresh.js +2 -1
  13. package/dist/cjs/components/PullToRefresh/PullToRefresh.js.map +1 -1
  14. package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js +3 -3
  15. package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  16. package/dist/cjs/components/Select/Select.d.ts +1 -1
  17. package/dist/cjs/components/Select/Select.js +22 -11
  18. package/dist/cjs/components/Select/Select.js.map +1 -1
  19. package/dist/cjs/components/Spinner/Spinner.d.ts +1 -1
  20. package/dist/cjs/components/Spinner/Spinner.js +14 -4
  21. package/dist/cjs/components/Spinner/Spinner.js.map +1 -1
  22. package/dist/cjs/components/Tappable/Tappable.d.ts +4 -4
  23. package/dist/cjs/components/Tappable/Tappable.js.map +1 -1
  24. package/dist/cjs/hooks/useAutoDetectAppearance.js +9 -13
  25. package/dist/cjs/hooks/useAutoDetectAppearance.js.map +1 -1
  26. package/dist/cjs/lib/platform.d.ts +2 -1
  27. package/dist/cjs/lib/platform.js.map +1 -1
  28. package/dist/cjs/types.d.ts +12 -0
  29. package/dist/cjs/types.js.map +1 -1
  30. package/dist/components/ChipsSelect/ChipsSelect.js +13 -9
  31. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  32. package/dist/components/CustomSelect/CustomSelect.js +23 -17
  33. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  34. package/dist/components/FixedLayout/FixedLayout.d.ts +6 -1
  35. package/dist/components/FixedLayout/FixedLayout.js +11 -4
  36. package/dist/components/FixedLayout/FixedLayout.js.map +1 -1
  37. package/dist/components/HorizontalScroll/HorizontalScroll.js +7 -7
  38. package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  39. package/dist/components/ImageBase/ImageBase.d.ts +2 -2
  40. package/dist/components/ImageBase/ImageBase.js.map +1 -1
  41. package/dist/components/PullToRefresh/PullToRefresh.js +2 -1
  42. package/dist/components/PullToRefresh/PullToRefresh.js.map +1 -1
  43. package/dist/components/ScreenSpinner/ScreenSpinner.js +3 -3
  44. package/dist/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  45. package/dist/components/Select/Select.d.ts +1 -1
  46. package/dist/components/Select/Select.js +22 -11
  47. package/dist/components/Select/Select.js.map +1 -1
  48. package/dist/components/Spinner/Spinner.d.ts +1 -1
  49. package/dist/components/Spinner/Spinner.js +14 -4
  50. package/dist/components/Spinner/Spinner.js.map +1 -1
  51. package/dist/components/Tappable/Tappable.d.ts +4 -4
  52. package/dist/components/Tappable/Tappable.js.map +1 -1
  53. package/dist/components.css +4 -4
  54. package/dist/components.css.map +1 -1
  55. package/dist/components.js.tmp +742 -732
  56. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +13 -9
  57. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  58. package/dist/cssm/components/CustomSelect/CustomSelect.js +22 -16
  59. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  60. package/dist/cssm/components/FixedLayout/FixedLayout.d.ts +6 -1
  61. package/dist/cssm/components/FixedLayout/FixedLayout.js +8 -3
  62. package/dist/cssm/components/FixedLayout/FixedLayout.js.map +1 -1
  63. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +7 -7
  64. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  65. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.module.css +2 -0
  66. package/dist/cssm/components/ImageBase/ImageBase.d.ts +2 -2
  67. package/dist/cssm/components/ImageBase/ImageBase.js.map +1 -1
  68. package/dist/cssm/components/PullToRefresh/PullToRefresh.js +2 -1
  69. package/dist/cssm/components/PullToRefresh/PullToRefresh.js.map +1 -1
  70. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js +3 -3
  71. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  72. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.module.css +4 -4
  73. package/dist/cssm/components/Select/Select.d.ts +1 -1
  74. package/dist/cssm/components/Select/Select.js +4 -9
  75. package/dist/cssm/components/Select/Select.js.map +1 -1
  76. package/dist/cssm/components/Spinner/Spinner.d.ts +1 -1
  77. package/dist/cssm/components/Spinner/Spinner.js +12 -3
  78. package/dist/cssm/components/Spinner/Spinner.js.map +1 -1
  79. package/dist/cssm/components/Tappable/Tappable.d.ts +4 -4
  80. package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
  81. package/dist/cssm/hooks/useAutoDetectAppearance.js +9 -13
  82. package/dist/cssm/hooks/useAutoDetectAppearance.js.map +1 -1
  83. package/dist/cssm/lib/platform.d.ts +2 -1
  84. package/dist/cssm/lib/platform.js.map +1 -1
  85. package/dist/cssm/styles/constants.css +3 -0
  86. package/dist/cssm/types.d.ts +12 -0
  87. package/dist/cssm/types.js.map +1 -1
  88. package/dist/hooks/useAutoDetectAppearance.js +9 -13
  89. package/dist/hooks/useAutoDetectAppearance.js.map +1 -1
  90. package/dist/lib/platform.d.ts +2 -1
  91. package/dist/lib/platform.js.map +1 -1
  92. package/dist/types.d.ts +12 -0
  93. package/dist/types.js.map +1 -1
  94. package/dist/vkui.css +4 -4
  95. package/dist/vkui.css.map +1 -1
  96. package/dist/vkui.js.tmp +742 -732
  97. package/package.json +1 -1
@@ -4,23 +4,23 @@ import { noop } from '@vkontakte/vkjs';
4
4
  import { resolveAppearance } from '../helpers/appearance';
5
5
  import { useDOM } from '../lib/dom';
6
6
  import { matchMediaListAddListener, matchMediaListRemoveListener } from '../lib/matchMedia';
7
- let initialAppearance = null;
8
- vkBridge.send('VKWebAppGetConfig').then((data)=>{
9
- initialAppearance = resolveAppearance(data);
10
- }).catch(console.error);
11
7
  function autoDetectAppearanceByBridge(setAppearance, onDetectAppearanceByBridge) {
8
+ function updateAppearance(data) {
9
+ const initialAppearance = resolveAppearance(data);
10
+ if (initialAppearance) {
11
+ onDetectAppearanceByBridge();
12
+ setAppearance(initialAppearance);
13
+ }
14
+ }
12
15
  function bridgeListener(e) {
13
16
  const { type , data } = e.detail;
14
17
  if (type !== 'VKWebAppUpdateConfig') {
15
18
  return;
16
19
  }
17
- initialAppearance = resolveAppearance(data);
18
- if (initialAppearance) {
19
- onDetectAppearanceByBridge();
20
- setAppearance(initialAppearance);
21
- }
20
+ updateAppearance(data);
22
21
  }
23
22
  vkBridge.subscribe(bridgeListener);
23
+ vkBridge.send('VKWebAppGetConfig').then(updateAppearance).catch(console.error);
24
24
  return ()=>vkBridge.unsubscribe(bridgeListener);
25
25
  }
26
26
  function autoDetectAppearance(window, setAppearance) {
@@ -46,10 +46,6 @@ export const useAutoDetectAppearance = (appearanceProp, onDetectAppearanceByBrid
46
46
  if (appearanceProp) {
47
47
  return appearanceProp;
48
48
  }
49
- if (initialAppearance) {
50
- onceDetectAppearanceByBridge.current();
51
- return initialAppearance;
52
- }
53
49
  const mediaQuery = window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');
54
50
  // eslint-disable-next-line no-restricted-properties
55
51
  return mediaQuery?.matches ? 'dark' : 'light';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/useAutoDetectAppearance.tsx"],"sourcesContent":["import * as React from 'react';\nimport vkBridge, {\n AnyReceiveMethodName,\n AppearanceType,\n VKBridgeEvent,\n} from '@vkontakte/vk-bridge';\nimport { noop } from '@vkontakte/vkjs';\nimport { resolveAppearance, VKBridgeConfigData } from '../helpers/appearance';\nimport { useDOM } from '../lib/dom';\nimport { matchMediaListAddListener, matchMediaListRemoveListener } from '../lib/matchMedia';\n\nlet initialAppearance: AppearanceType | null = null;\n\nvkBridge\n .send('VKWebAppGetConfig')\n .then((data) => {\n initialAppearance = resolveAppearance(data);\n })\n .catch(console.error);\n\nfunction autoDetectAppearanceByBridge(\n setAppearance: (value: AppearanceType) => void,\n onDetectAppearanceByBridge: () => void,\n) {\n function bridgeListener(e: VKBridgeEvent<AnyReceiveMethodName>) {\n const { type, data } = e.detail;\n\n if (type !== 'VKWebAppUpdateConfig') {\n return;\n }\n\n initialAppearance = resolveAppearance(data as VKBridgeConfigData);\n\n if (initialAppearance) {\n onDetectAppearanceByBridge();\n setAppearance(initialAppearance);\n }\n }\n\n vkBridge.subscribe(bridgeListener);\n\n return () => vkBridge.unsubscribe(bridgeListener);\n}\n\nfunction autoDetectAppearance(\n window: Window | undefined,\n setAppearance: (value: AppearanceType) => void,\n): () => void {\n const mediaQuery =\n window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');\n\n if (mediaQuery === undefined) {\n return noop;\n }\n\n const check = (event: MediaQueryList | MediaQueryListEvent) => {\n // eslint-disable-next-line no-restricted-properties\n setAppearance(event.matches ? 'dark' : 'light');\n };\n\n check(mediaQuery);\n matchMediaListAddListener(mediaQuery, check);\n\n return () => matchMediaListRemoveListener(mediaQuery, check);\n}\n\nexport const useAutoDetectAppearance = (\n appearanceProp?: AppearanceType,\n onDetectAppearanceByBridge?: () => void,\n): AppearanceType => {\n const { window } = useDOM();\n const onceDetectAppearanceByBridge = React.useRef(() => {\n onDetectAppearanceByBridge && onDetectAppearanceByBridge();\n onceDetectAppearanceByBridge.current = noop;\n });\n\n const [appearance, setAppearance] = React.useState<AppearanceType>(() => {\n if (appearanceProp) {\n return appearanceProp;\n }\n\n if (initialAppearance) {\n onceDetectAppearanceByBridge.current();\n return initialAppearance;\n }\n\n const mediaQuery =\n window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');\n\n // eslint-disable-next-line no-restricted-properties\n return mediaQuery?.matches ? 'dark' : 'light';\n });\n\n React.useEffect(() => {\n if (appearanceProp) {\n setAppearance(appearanceProp);\n return noop;\n }\n\n if (vkBridge.isEmbedded()) {\n return autoDetectAppearanceByBridge(setAppearance, onceDetectAppearanceByBridge.current);\n }\n\n return autoDetectAppearance(window, setAppearance);\n }, [window, appearanceProp]);\n\n return appearance;\n};\n"],"names":["React","vkBridge","noop","resolveAppearance","useDOM","matchMediaListAddListener","matchMediaListRemoveListener","initialAppearance","send","then","data","catch","console","error","autoDetectAppearanceByBridge","setAppearance","onDetectAppearanceByBridge","bridgeListener","e","type","detail","subscribe","unsubscribe","autoDetectAppearance","window","mediaQuery","matchMedia","undefined","check","event","matches","useAutoDetectAppearance","appearanceProp","onceDetectAppearanceByBridge","useRef","current","appearance","useState","useEffect","isEmbedded"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,OAAOC,cAIA,uBAAuB;AAC9B,SAASC,IAAI,QAAQ,kBAAkB;AACvC,SAASC,iBAAiB,QAA4B,wBAAwB;AAC9E,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,yBAAyB,EAAEC,4BAA4B,QAAQ,oBAAoB;AAE5F,IAAIC,oBAA2C;AAE/CN,SACGO,KAAK,qBACLC,KAAK,CAACC;IACLH,oBAAoBJ,kBAAkBO;AACxC,GACCC,MAAMC,QAAQC;AAEjB,SAASC,6BACPC,aAA8C,EAC9CC,0BAAsC;IAEtC,SAASC,eAAeC,CAAsC;QAC5D,MAAM,EAAEC,KAAI,EAAET,KAAI,EAAE,GAAGQ,EAAEE;QAEzB,IAAID,SAAS,wBAAwB;YACnC;QACF;QAEAZ,oBAAoBJ,kBAAkBO;QAEtC,IAAIH,mBAAmB;YACrBS;YACAD,cAAcR;QAChB;IACF;IAEAN,SAASoB,UAAUJ;IAEnB,OAAO,IAAMhB,SAASqB,YAAYL;AACpC;AAEA,SAASM,qBACPC,MAA0B,EAC1BT,aAA8C;IAE9C,MAAMU,aACJD,UAAUA,OAAOE,cAAcF,OAAOE,WAAW;IAEnD,IAAID,eAAeE,WAAW;QAC5B,OAAOzB;IACT;IAEA,MAAM0B,QAAQ,CAACC;QACb,oDAAoD;QACpDd,cAAcc,MAAMC,UAAU,SAAS;IACzC;IAEAF,MAAMH;IACNpB,0BAA0BoB,YAAYG;IAEtC,OAAO,IAAMtB,6BAA6BmB,YAAYG;AACxD;AAEA,OAAO,MAAMG,0BAA0B,CACrCC,gBACAhB;IAEA,MAAM,EAAEQ,OAAM,EAAE,GAAGpB;IACnB,MAAM6B,+BAA+BjC,MAAMkC,OAAO;QAChDlB,8BAA8BA;QAC9BiB,6BAA6BE,UAAUjC;IACzC;IAEA,MAAM,CAACkC,YAAYrB,cAAc,GAAGf,MAAMqC,SAAyB;QACjE,IAAIL,gBAAgB;YAClB,OAAOA;QACT;QAEA,IAAIzB,mBAAmB;YACrB0B,6BAA6BE;YAC7B,OAAO5B;QACT;QAEA,MAAMkB,aACJD,UAAUA,OAAOE,cAAcF,OAAOE,WAAW;QAEnD,oDAAoD;QACpD,OAAOD,YAAYK,UAAU,SAAS;IACxC;IAEA9B,MAAMsC,UAAU;QACd,IAAIN,gBAAgB;YAClBjB,cAAciB;YACd,OAAO9B;QACT;QAEA,IAAID,SAASsC,cAAc;YACzB,OAAOzB,6BAA6BC,eAAekB,6BAA6BE;QAClF;QAEA,OAAOZ,qBAAqBC,QAAQT;IACtC,GAAG;QAACS;QAAQQ;KAAe;IAE3B,OAAOI;AACT,EAAE"}
1
+ {"version":3,"sources":["../../../src/hooks/useAutoDetectAppearance.tsx"],"sourcesContent":["import * as React from 'react';\nimport vkBridge, {\n AnyReceiveMethodName,\n AppearanceType,\n VKBridgeEvent,\n} from '@vkontakte/vk-bridge';\nimport { noop } from '@vkontakte/vkjs';\nimport { resolveAppearance, VKBridgeConfigData } from '../helpers/appearance';\nimport { useDOM } from '../lib/dom';\nimport { matchMediaListAddListener, matchMediaListRemoveListener } from '../lib/matchMedia';\n\nfunction autoDetectAppearanceByBridge(\n setAppearance: (value: AppearanceType) => void,\n onDetectAppearanceByBridge: () => void,\n) {\n function updateAppearance(data: VKBridgeConfigData) {\n const initialAppearance = resolveAppearance(data);\n\n if (initialAppearance) {\n onDetectAppearanceByBridge();\n setAppearance(initialAppearance);\n }\n }\n\n function bridgeListener(e: VKBridgeEvent<AnyReceiveMethodName>) {\n const { type, data } = e.detail;\n\n if (type !== 'VKWebAppUpdateConfig') {\n return;\n }\n\n updateAppearance(data as VKBridgeConfigData);\n }\n\n vkBridge.subscribe(bridgeListener);\n vkBridge.send('VKWebAppGetConfig').then(updateAppearance).catch(console.error);\n\n return () => vkBridge.unsubscribe(bridgeListener);\n}\n\nfunction autoDetectAppearance(\n window: Window | undefined,\n setAppearance: (value: AppearanceType) => void,\n): () => void {\n const mediaQuery =\n window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');\n\n if (mediaQuery === undefined) {\n return noop;\n }\n\n const check = (event: MediaQueryList | MediaQueryListEvent) => {\n // eslint-disable-next-line no-restricted-properties\n setAppearance(event.matches ? 'dark' : 'light');\n };\n\n check(mediaQuery);\n matchMediaListAddListener(mediaQuery, check);\n\n return () => matchMediaListRemoveListener(mediaQuery, check);\n}\n\nexport const useAutoDetectAppearance = (\n appearanceProp?: AppearanceType,\n onDetectAppearanceByBridge?: () => void,\n): AppearanceType => {\n const { window } = useDOM();\n const onceDetectAppearanceByBridge = React.useRef(() => {\n onDetectAppearanceByBridge && onDetectAppearanceByBridge();\n onceDetectAppearanceByBridge.current = noop;\n });\n\n const [appearance, setAppearance] = React.useState<AppearanceType>(() => {\n if (appearanceProp) {\n return appearanceProp;\n }\n\n const mediaQuery =\n window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');\n\n // eslint-disable-next-line no-restricted-properties\n return mediaQuery?.matches ? 'dark' : 'light';\n });\n\n React.useEffect(() => {\n if (appearanceProp) {\n setAppearance(appearanceProp);\n return noop;\n }\n\n if (vkBridge.isEmbedded()) {\n return autoDetectAppearanceByBridge(setAppearance, onceDetectAppearanceByBridge.current);\n }\n\n return autoDetectAppearance(window, setAppearance);\n }, [window, appearanceProp]);\n\n return appearance;\n};\n"],"names":["React","vkBridge","noop","resolveAppearance","useDOM","matchMediaListAddListener","matchMediaListRemoveListener","autoDetectAppearanceByBridge","setAppearance","onDetectAppearanceByBridge","updateAppearance","data","initialAppearance","bridgeListener","e","type","detail","subscribe","send","then","catch","console","error","unsubscribe","autoDetectAppearance","window","mediaQuery","matchMedia","undefined","check","event","matches","useAutoDetectAppearance","appearanceProp","onceDetectAppearanceByBridge","useRef","current","appearance","useState","useEffect","isEmbedded"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,OAAOC,cAIA,uBAAuB;AAC9B,SAASC,IAAI,QAAQ,kBAAkB;AACvC,SAASC,iBAAiB,QAA4B,wBAAwB;AAC9E,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,yBAAyB,EAAEC,4BAA4B,QAAQ,oBAAoB;AAE5F,SAASC,6BACPC,aAA8C,EAC9CC,0BAAsC;IAEtC,SAASC,iBAAiBC,IAAwB;QAChD,MAAMC,oBAAoBT,kBAAkBQ;QAE5C,IAAIC,mBAAmB;YACrBH;YACAD,cAAcI;QAChB;IACF;IAEA,SAASC,eAAeC,CAAsC;QAC5D,MAAM,EAAEC,KAAI,EAAEJ,KAAI,EAAE,GAAGG,EAAEE;QAEzB,IAAID,SAAS,wBAAwB;YACnC;QACF;QAEAL,iBAAiBC;IACnB;IAEAV,SAASgB,UAAUJ;IACnBZ,SAASiB,KAAK,qBAAqBC,KAAKT,kBAAkBU,MAAMC,QAAQC;IAExE,OAAO,IAAMrB,SAASsB,YAAYV;AACpC;AAEA,SAASW,qBACPC,MAA0B,EAC1BjB,aAA8C;IAE9C,MAAMkB,aACJD,UAAUA,OAAOE,cAAcF,OAAOE,WAAW;IAEnD,IAAID,eAAeE,WAAW;QAC5B,OAAO1B;IACT;IAEA,MAAM2B,QAAQ,CAACC;QACb,oDAAoD;QACpDtB,cAAcsB,MAAMC,UAAU,SAAS;IACzC;IAEAF,MAAMH;IACNrB,0BAA0BqB,YAAYG;IAEtC,OAAO,IAAMvB,6BAA6BoB,YAAYG;AACxD;AAEA,OAAO,MAAMG,0BAA0B,CACrCC,gBACAxB;IAEA,MAAM,EAAEgB,OAAM,EAAE,GAAGrB;IACnB,MAAM8B,+BAA+BlC,MAAMmC,OAAO;QAChD1B,8BAA8BA;QAC9ByB,6BAA6BE,UAAUlC;IACzC;IAEA,MAAM,CAACmC,YAAY7B,cAAc,GAAGR,MAAMsC,SAAyB;QACjE,IAAIL,gBAAgB;YAClB,OAAOA;QACT;QAEA,MAAMP,aACJD,UAAUA,OAAOE,cAAcF,OAAOE,WAAW;QAEnD,oDAAoD;QACpD,OAAOD,YAAYK,UAAU,SAAS;IACxC;IAEA/B,MAAMuC,UAAU;QACd,IAAIN,gBAAgB;YAClBzB,cAAcyB;YACd,OAAO/B;QACT;QAEA,IAAID,SAASuC,cAAc;YACzB,OAAOjC,6BAA6BC,eAAe0B,6BAA6BE;QAClF;QAEA,OAAOZ,qBAAqBC,QAAQjB;IACtC,GAAG;QAACiB;QAAQQ;KAAe;IAE3B,OAAOI;AACT,EAAE"}
@@ -1,8 +1,9 @@
1
+ import { LiteralUnion } from '../types';
1
2
  import { BrowserInfo } from './browser';
2
3
  export declare enum Platform {
3
4
  ANDROID = "android",
4
5
  IOS = "ios",
5
6
  VKCOM = "vkcom"
6
7
  }
7
- export type PlatformType = Platform.ANDROID | Platform.IOS | Platform.VKCOM | string;
8
+ export type PlatformType = LiteralUnion<'android' | 'ios' | 'vkcom', string>;
8
9
  export declare function platform(browserInfo?: BrowserInfo): PlatformType;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/platform.ts"],"sourcesContent":["import { querystring } from '@vkontakte/vkjs';\nimport { BrowserInfo, computeBrowserInfo } from './browser';\nimport { canUseDOM } from './dom';\n\nexport enum Platform {\n ANDROID = 'android',\n IOS = 'ios',\n VKCOM = 'vkcom',\n}\n\nconst PLATFORM_ALIAS = {\n desktop_web: Platform.VKCOM,\n};\n\nfunction isPlatformAlias(platformAlias: string): platformAlias is keyof typeof PLATFORM_ALIAS {\n return platformAlias in PLATFORM_ALIAS;\n}\n\n/**\n * Значение, которое передаётся в качестве query-параметра при открытии VK Mini Apps\n * @see {@link https://dev.vk.com/mini-apps/development/launch-params#vk_platform vk_platform}\n */\nfunction getPlatformByQueryString(queryString: string): Platform | undefined {\n try {\n const parsedQuery = querystring.parse(queryString);\n const platformAliasByQuery = parsedQuery['vk_platform'];\n\n return typeof platformAliasByQuery === 'string' && isPlatformAlias(platformAliasByQuery)\n ? PLATFORM_ALIAS[platformAliasByQuery]\n : undefined;\n } catch (e) {\n console.warn(e);\n\n return undefined;\n }\n}\n\nconst platformByQueryString = canUseDOM ? getPlatformByQueryString(location.search) : undefined;\n\nexport type PlatformType = Platform.ANDROID | Platform.IOS | Platform.VKCOM | string;\n\nexport function platform(browserInfo?: BrowserInfo): PlatformType {\n if (platformByQueryString) {\n return platformByQueryString;\n }\n\n if (!browserInfo) {\n browserInfo = computeBrowserInfo();\n }\n\n return browserInfo.system === 'ios' ? Platform.IOS : Platform.ANDROID;\n}\n"],"names":["querystring","computeBrowserInfo","canUseDOM","Platform","ANDROID","IOS","VKCOM","PLATFORM_ALIAS","desktop_web","isPlatformAlias","platformAlias","getPlatformByQueryString","queryString","parsedQuery","parse","platformAliasByQuery","undefined","e","console","warn","platformByQueryString","location","search","platform","browserInfo","system"],"mappings":"AAAA,SAASA,WAAW,QAAQ,kBAAkB;AAC9C,SAAsBC,kBAAkB,QAAQ,YAAY;AAC5D,SAASC,SAAS,QAAQ,QAAQ;WAE3B;UAAKC,QAAQ;IAARA,SACVC,aAAU;IADAD,SAEVE,SAAM;IAFIF,SAGVG,WAAQ;GAHEH,aAAAA;AAMZ,MAAMI,iBAAiB;IACrBC,aAAaL,SAASG;AACxB;AAEA,SAASG,gBAAgBC,aAAqB;IAC5C,OAAOA,iBAAiBH;AAC1B;AAEA;;;CAGC,GACD,SAASI,yBAAyBC,WAAmB;IACnD,IAAI;QACF,MAAMC,cAAcb,YAAYc,MAAMF;QACtC,MAAMG,uBAAuBF,WAAW,CAAC,cAAc;QAEvD,OAAO,OAAOE,yBAAyB,YAAYN,gBAAgBM,wBAC/DR,cAAc,CAACQ,qBAAqB,GACpCC;IACN,EAAE,OAAOC,GAAG;QACVC,QAAQC,KAAKF;QAEb,OAAOD;IACT;AACF;AAEA,MAAMI,wBAAwBlB,YAAYS,yBAAyBU,SAASC,UAAUN;AAItF,OAAO,SAASO,SAASC,WAAyB;IAChD,IAAIJ,uBAAuB;QACzB,OAAOA;IACT;IAEA,IAAI,CAACI,aAAa;QAChBA,cAAcvB;IAChB;IAEA,OAAOuB,YAAYC,WAAW,QAAQtB,SAASE,MAAMF,SAASC;AAChE"}
1
+ {"version":3,"sources":["../../../src/lib/platform.ts"],"sourcesContent":["import { querystring } from '@vkontakte/vkjs';\nimport { LiteralUnion } from '../types';\nimport { BrowserInfo, computeBrowserInfo } from './browser';\nimport { canUseDOM } from './dom';\n\nexport enum Platform {\n ANDROID = 'android',\n IOS = 'ios',\n VKCOM = 'vkcom',\n}\n\nconst PLATFORM_ALIAS = {\n desktop_web: Platform.VKCOM,\n};\n\nfunction isPlatformAlias(platformAlias: string): platformAlias is keyof typeof PLATFORM_ALIAS {\n return platformAlias in PLATFORM_ALIAS;\n}\n\n/**\n * Значение, которое передаётся в качестве query-параметра при открытии VK Mini Apps\n * @see {@link https://dev.vk.com/mini-apps/development/launch-params#vk_platform vk_platform}\n */\nfunction getPlatformByQueryString(queryString: string): Platform | undefined {\n try {\n const parsedQuery = querystring.parse(queryString);\n const platformAliasByQuery = parsedQuery['vk_platform'];\n\n return typeof platformAliasByQuery === 'string' && isPlatformAlias(platformAliasByQuery)\n ? PLATFORM_ALIAS[platformAliasByQuery]\n : undefined;\n } catch (e) {\n console.warn(e);\n\n return undefined;\n }\n}\n\nconst platformByQueryString = canUseDOM ? getPlatformByQueryString(location.search) : undefined;\n\nexport type PlatformType = LiteralUnion<'android' | 'ios' | 'vkcom', string>;\n\nexport function platform(browserInfo?: BrowserInfo): PlatformType {\n if (platformByQueryString) {\n return platformByQueryString;\n }\n\n if (!browserInfo) {\n browserInfo = computeBrowserInfo();\n }\n\n return browserInfo.system === 'ios' ? Platform.IOS : Platform.ANDROID;\n}\n"],"names":["querystring","computeBrowserInfo","canUseDOM","Platform","ANDROID","IOS","VKCOM","PLATFORM_ALIAS","desktop_web","isPlatformAlias","platformAlias","getPlatformByQueryString","queryString","parsedQuery","parse","platformAliasByQuery","undefined","e","console","warn","platformByQueryString","location","search","platform","browserInfo","system"],"mappings":"AAAA,SAASA,WAAW,QAAQ,kBAAkB;AAE9C,SAAsBC,kBAAkB,QAAQ,YAAY;AAC5D,SAASC,SAAS,QAAQ,QAAQ;WAE3B;UAAKC,QAAQ;IAARA,SACVC,aAAU;IADAD,SAEVE,SAAM;IAFIF,SAGVG,WAAQ;GAHEH,aAAAA;AAMZ,MAAMI,iBAAiB;IACrBC,aAAaL,SAASG;AACxB;AAEA,SAASG,gBAAgBC,aAAqB;IAC5C,OAAOA,iBAAiBH;AAC1B;AAEA;;;CAGC,GACD,SAASI,yBAAyBC,WAAmB;IACnD,IAAI;QACF,MAAMC,cAAcb,YAAYc,MAAMF;QACtC,MAAMG,uBAAuBF,WAAW,CAAC,cAAc;QAEvD,OAAO,OAAOE,yBAAyB,YAAYN,gBAAgBM,wBAC/DR,cAAc,CAACQ,qBAAqB,GACpCC;IACN,EAAE,OAAOC,GAAG;QACVC,QAAQC,KAAKF;QAEb,OAAOD;IACT;AACF;AAEA,MAAMI,wBAAwBlB,YAAYS,yBAAyBU,SAASC,UAAUN;AAItF,OAAO,SAASO,SAASC,WAAyB;IAChD,IAAIJ,uBAAuB;QACzB,OAAOA;IACT;IAEA,IAAI,CAACI,aAAa;QAChBA,cAAcvB;IAChB;IAEA,OAAOuB,YAAYC,WAAW,QAAQtB,SAASE,MAAMF,SAASC;AAChE"}
@@ -58,6 +58,9 @@
58
58
  --vkui_internal--z_index_image_base_overlay: 0;
59
59
  --vkui_internal--z_index_image_base_border: 1;
60
60
  --vkui_internal--z_index_image_base_badge: 2;
61
+
62
+ /* z_index HorizontalScroll isolate */
63
+ --vkui_internal--z_index_horizontal_scroll_arrow: 1;
61
64
  }
62
65
  @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) {
63
66
  /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
@@ -54,3 +54,15 @@ export type Exact<A, B> = A extends B ? B : never;
54
54
  * Для возможности указывать css custom properties
55
55
  */
56
56
  export type CSSCustomProperties<T extends string | undefined = string> = Record<`--${string}`, T>;
57
+ interface Nothing {
58
+ }
59
+ /**
60
+ * Автозаполнение для типов
61
+ *
62
+ * @example
63
+ * LiteralUnion<'foo' | 'bar', string>
64
+ *
65
+ * @see {@link https://github.com/microsoft/TypeScript/issues/29729}
66
+ */
67
+ export type LiteralUnion<Union, Type> = Union | (Type & Nothing);
68
+ export {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types.ts"],"sourcesContent":["import * as React from 'react';\nimport { Insets } from '@vkontakte/vk-bridge';\nimport { PlatformType } from './lib/platform';\n\nexport type AnyFunction = (...args: any[]) => any;\n\nexport type AlignType = 'left' | 'center' | 'right';\n\nexport interface HasChildren {\n children?: React.ReactNode;\n}\n\nexport type HasDataAttribute = Record<\n `data-${string}`,\n string | number | boolean | undefined | null\n>;\n\nexport interface HasRootRef<T> {\n getRootRef?: React.Ref<T>;\n}\n\nexport interface HasRef<T> {\n getRef?: React.Ref<T>;\n}\n\nexport interface HasComponent {\n Component?: React.ElementType;\n}\n\nexport interface HasAlign {\n align?: AlignType;\n}\n\nexport interface HasPlatform {\n /**\n * @ignore\n */\n platform?: PlatformType;\n}\n\nexport interface HasInsets {\n /**\n * @ignore\n */\n insets?: Partial<Insets>;\n}\n\nexport interface Version {\n major: number;\n minor?: number;\n patch?: number;\n}\n\n/**\n * Тип содержит атрибуты, которые применяются только для `<a>`\n *\n * @see {@link https://developer.mozilla.org/ru/docs/Web/HTML/Element/A &lt;a&gt; - HTML | MDN}\n */\nexport type AnchorHTMLAttributesOnly = Omit<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n keyof React.HTMLAttributes<HTMLAnchorElement>\n>;\n\n/**\n * Проверяет, является ли тип подтипом другого.\n *\n * В TS не реализовано.\n *\n * @see {@link https://github.com/microsoft/TypeScript/issues/12936}\n */\nexport type Exact<A, B> = A extends B ? B : never;\n\n/**\n * Для возможности указывать css custom properties\n */\nexport type CSSCustomProperties<T extends string | undefined = string> = Record<`--${string}`, T>;\n"],"names":["React"],"mappings":"AAAA,YAAYA,WAAW,QAAQ"}
1
+ {"version":3,"sources":["../../src/types.ts"],"sourcesContent":["import * as React from 'react';\nimport { Insets } from '@vkontakte/vk-bridge';\nimport { PlatformType } from './lib/platform';\n\nexport type AnyFunction = (...args: any[]) => any;\n\nexport type AlignType = 'left' | 'center' | 'right';\n\nexport interface HasChildren {\n children?: React.ReactNode;\n}\n\nexport type HasDataAttribute = Record<\n `data-${string}`,\n string | number | boolean | undefined | null\n>;\n\nexport interface HasRootRef<T> {\n getRootRef?: React.Ref<T>;\n}\n\nexport interface HasRef<T> {\n getRef?: React.Ref<T>;\n}\n\nexport interface HasComponent {\n Component?: React.ElementType;\n}\n\nexport interface HasAlign {\n align?: AlignType;\n}\n\nexport interface HasPlatform {\n /**\n * @ignore\n */\n platform?: PlatformType;\n}\n\nexport interface HasInsets {\n /**\n * @ignore\n */\n insets?: Partial<Insets>;\n}\n\nexport interface Version {\n major: number;\n minor?: number;\n patch?: number;\n}\n\n/**\n * Тип содержит атрибуты, которые применяются только для `<a>`\n *\n * @see {@link https://developer.mozilla.org/ru/docs/Web/HTML/Element/A &lt;a&gt; - HTML | MDN}\n */\nexport type AnchorHTMLAttributesOnly = Omit<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n keyof React.HTMLAttributes<HTMLAnchorElement>\n>;\n\n/**\n * Проверяет, является ли тип подтипом другого.\n *\n * В TS не реализовано.\n *\n * @see {@link https://github.com/microsoft/TypeScript/issues/12936}\n */\nexport type Exact<A, B> = A extends B ? B : never;\n\n/**\n * Для возможности указывать css custom properties\n */\nexport type CSSCustomProperties<T extends string | undefined = string> = Record<`--${string}`, T>;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface Nothing {}\n\n/**\n * Автозаполнение для типов\n *\n * @example\n * LiteralUnion<'foo' | 'bar', string>\n *\n * @see {@link https://github.com/microsoft/TypeScript/issues/29729}\n */\nexport type LiteralUnion<Union, Type> = Union | (Type & Nothing);\n"],"names":["React"],"mappings":"AAAA,YAAYA,WAAW,QAAQ"}
@@ -5,23 +5,23 @@ import { noop } from "@vkontakte/vkjs";
5
5
  import { resolveAppearance } from "../helpers/appearance";
6
6
  import { useDOM } from "../lib/dom";
7
7
  import { matchMediaListAddListener, matchMediaListRemoveListener } from "../lib/matchMedia";
8
- var initialAppearance = null;
9
- vkBridge.send("VKWebAppGetConfig").then(function(data) {
10
- initialAppearance = resolveAppearance(data);
11
- }).catch(console.error);
12
8
  function autoDetectAppearanceByBridge(setAppearance, onDetectAppearanceByBridge) {
9
+ var updateAppearance = function updateAppearance(data) {
10
+ var initialAppearance = resolveAppearance(data);
11
+ if (initialAppearance) {
12
+ onDetectAppearanceByBridge();
13
+ setAppearance(initialAppearance);
14
+ }
15
+ };
13
16
  var bridgeListener = function bridgeListener(e) {
14
17
  var _e_detail = e.detail, type = _e_detail.type, data = _e_detail.data;
15
18
  if (type !== "VKWebAppUpdateConfig") {
16
19
  return;
17
20
  }
18
- initialAppearance = resolveAppearance(data);
19
- if (initialAppearance) {
20
- onDetectAppearanceByBridge();
21
- setAppearance(initialAppearance);
22
- }
21
+ updateAppearance(data);
23
22
  };
24
23
  vkBridge.subscribe(bridgeListener);
24
+ vkBridge.send("VKWebAppGetConfig").then(updateAppearance).catch(console.error);
25
25
  return function() {
26
26
  return vkBridge.unsubscribe(bridgeListener);
27
27
  };
@@ -51,10 +51,6 @@ export var useAutoDetectAppearance = function(appearanceProp, onDetectAppearance
51
51
  if (appearanceProp) {
52
52
  return appearanceProp;
53
53
  }
54
- if (initialAppearance) {
55
- onceDetectAppearanceByBridge.current();
56
- return initialAppearance;
57
- }
58
54
  var mediaQuery = window && window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)");
59
55
  // eslint-disable-next-line no-restricted-properties
60
56
  return (mediaQuery === null || mediaQuery === void 0 ? void 0 : mediaQuery.matches) ? "dark" : "light";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useAutoDetectAppearance.tsx"],"sourcesContent":["import * as React from 'react';\nimport vkBridge, {\n AnyReceiveMethodName,\n AppearanceType,\n VKBridgeEvent,\n} from '@vkontakte/vk-bridge';\nimport { noop } from '@vkontakte/vkjs';\nimport { resolveAppearance, VKBridgeConfigData } from '../helpers/appearance';\nimport { useDOM } from '../lib/dom';\nimport { matchMediaListAddListener, matchMediaListRemoveListener } from '../lib/matchMedia';\n\nlet initialAppearance: AppearanceType | null = null;\n\nvkBridge\n .send('VKWebAppGetConfig')\n .then((data) => {\n initialAppearance = resolveAppearance(data);\n })\n .catch(console.error);\n\nfunction autoDetectAppearanceByBridge(\n setAppearance: (value: AppearanceType) => void,\n onDetectAppearanceByBridge: () => void,\n) {\n function bridgeListener(e: VKBridgeEvent<AnyReceiveMethodName>) {\n const { type, data } = e.detail;\n\n if (type !== 'VKWebAppUpdateConfig') {\n return;\n }\n\n initialAppearance = resolveAppearance(data as VKBridgeConfigData);\n\n if (initialAppearance) {\n onDetectAppearanceByBridge();\n setAppearance(initialAppearance);\n }\n }\n\n vkBridge.subscribe(bridgeListener);\n\n return () => vkBridge.unsubscribe(bridgeListener);\n}\n\nfunction autoDetectAppearance(\n window: Window | undefined,\n setAppearance: (value: AppearanceType) => void,\n): () => void {\n const mediaQuery =\n window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');\n\n if (mediaQuery === undefined) {\n return noop;\n }\n\n const check = (event: MediaQueryList | MediaQueryListEvent) => {\n // eslint-disable-next-line no-restricted-properties\n setAppearance(event.matches ? 'dark' : 'light');\n };\n\n check(mediaQuery);\n matchMediaListAddListener(mediaQuery, check);\n\n return () => matchMediaListRemoveListener(mediaQuery, check);\n}\n\nexport const useAutoDetectAppearance = (\n appearanceProp?: AppearanceType,\n onDetectAppearanceByBridge?: () => void,\n): AppearanceType => {\n const { window } = useDOM();\n const onceDetectAppearanceByBridge = React.useRef(() => {\n onDetectAppearanceByBridge && onDetectAppearanceByBridge();\n onceDetectAppearanceByBridge.current = noop;\n });\n\n const [appearance, setAppearance] = React.useState<AppearanceType>(() => {\n if (appearanceProp) {\n return appearanceProp;\n }\n\n if (initialAppearance) {\n onceDetectAppearanceByBridge.current();\n return initialAppearance;\n }\n\n const mediaQuery =\n window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');\n\n // eslint-disable-next-line no-restricted-properties\n return mediaQuery?.matches ? 'dark' : 'light';\n });\n\n React.useEffect(() => {\n if (appearanceProp) {\n setAppearance(appearanceProp);\n return noop;\n }\n\n if (vkBridge.isEmbedded()) {\n return autoDetectAppearanceByBridge(setAppearance, onceDetectAppearanceByBridge.current);\n }\n\n return autoDetectAppearance(window, setAppearance);\n }, [window, appearanceProp]);\n\n return appearance;\n};\n"],"names":["React","vkBridge","noop","resolveAppearance","useDOM","matchMediaListAddListener","matchMediaListRemoveListener","initialAppearance","send","then","data","catch","console","error","autoDetectAppearanceByBridge","setAppearance","onDetectAppearanceByBridge","bridgeListener","e","detail","type","subscribe","unsubscribe","autoDetectAppearance","window","mediaQuery","matchMedia","undefined","check","event","matches","useAutoDetectAppearance","appearanceProp","onceDetectAppearanceByBridge","useRef","current","useState","appearance","useEffect","isEmbedded"],"mappings":";AAAA,YAAYA,WAAW,QAAQ;AAC/B,OAAOC,cAIA,uBAAuB;AAC9B,SAASC,IAAI,QAAQ,kBAAkB;AACvC,SAASC,iBAAiB,QAA4B,wBAAwB;AAC9E,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,yBAAyB,EAAEC,4BAA4B,QAAQ,oBAAoB;AAE5F,IAAIC,oBAA2C;AAE/CN,SACGO,KAAK,qBACLC,KAAK,SAACC;IACLH,oBAAoBJ,kBAAkBO;AACxC,GACCC,MAAMC,QAAQC;AAEjB,SAASC,6BACPC,aAA8C,EAC9CC,0BAAsC;QAE7BC,iBAAT,SAASA,eAAeC,CAAsC;QAC5D,IAAuBA,YAAAA,EAAEC,QAAjBC,OAAeF,UAAfE,MAAMV,OAASQ,UAATR;QAEd,IAAIU,SAAS,wBAAwB;YACnC;QACF;QAEAb,oBAAoBJ,kBAAkBO;QAEtC,IAAIH,mBAAmB;YACrBS;YACAD,cAAcR;QAChB;IACF;IAEAN,SAASoB,UAAUJ;IAEnB,OAAO;eAAMhB,SAASqB,YAAYL;;AACpC;AAEA,SAASM,qBACPC,MAA0B,EAC1BT,aAA8C;IAE9C,IAAMU,aACJD,UAAUA,OAAOE,cAAcF,OAAOE,WAAW;IAEnD,IAAID,eAAeE,WAAW;QAC5B,OAAOzB;IACT;IAEA,IAAM0B,QAAQ,SAACC;QACb,oDAAoD;QACpDd,cAAcc,MAAMC,UAAU,SAAS;IACzC;IAEAF,MAAMH;IACNpB,0BAA0BoB,YAAYG;IAEtC,OAAO;eAAMtB,6BAA6BmB,YAAYG;;AACxD;AAEA,OAAO,IAAMG,0BAA0B,SACrCC,gBACAhB;IAEA,IAAM,AAAEQ,SAAWpB,SAAXoB;IACR,IAAMS,+BAA+BjC,MAAMkC,OAAO;QAChDlB,8BAA8BA;QAC9BiB,6BAA6BE,UAAUjC;IACzC;IAEA,IAAoCF,mCAAAA,MAAMoC,SAAyB;QACjE,IAAIJ,gBAAgB;YAClB,OAAOA;QACT;QAEA,IAAIzB,mBAAmB;YACrB0B,6BAA6BE;YAC7B,OAAO5B;QACT;QAEA,IAAMkB,aACJD,UAAUA,OAAOE,cAAcF,OAAOE,WAAW;QAEnD,oDAAoD;QACpD,OAAOD,CAAAA,uBAAAA,wBAAAA,KAAAA,IAAAA,WAAYK,OAAM,IAAI,SAAS;IACxC,QAfOO,aAA6BrC,oBAAjBe,gBAAiBf;IAiBpCA,MAAMsC,UAAU;QACd,IAAIN,gBAAgB;YAClBjB,cAAciB;YACd,OAAO9B;QACT;QAEA,IAAID,SAASsC,cAAc;YACzB,OAAOzB,6BAA6BC,eAAekB,6BAA6BE;QAClF;QAEA,OAAOZ,qBAAqBC,QAAQT;IACtC,GAAG;QAACS;QAAQQ;KAAe;IAE3B,OAAOK;AACT,EAAE"}
1
+ {"version":3,"sources":["../../src/hooks/useAutoDetectAppearance.tsx"],"sourcesContent":["import * as React from 'react';\nimport vkBridge, {\n AnyReceiveMethodName,\n AppearanceType,\n VKBridgeEvent,\n} from '@vkontakte/vk-bridge';\nimport { noop } from '@vkontakte/vkjs';\nimport { resolveAppearance, VKBridgeConfigData } from '../helpers/appearance';\nimport { useDOM } from '../lib/dom';\nimport { matchMediaListAddListener, matchMediaListRemoveListener } from '../lib/matchMedia';\n\nfunction autoDetectAppearanceByBridge(\n setAppearance: (value: AppearanceType) => void,\n onDetectAppearanceByBridge: () => void,\n) {\n function updateAppearance(data: VKBridgeConfigData) {\n const initialAppearance = resolveAppearance(data);\n\n if (initialAppearance) {\n onDetectAppearanceByBridge();\n setAppearance(initialAppearance);\n }\n }\n\n function bridgeListener(e: VKBridgeEvent<AnyReceiveMethodName>) {\n const { type, data } = e.detail;\n\n if (type !== 'VKWebAppUpdateConfig') {\n return;\n }\n\n updateAppearance(data as VKBridgeConfigData);\n }\n\n vkBridge.subscribe(bridgeListener);\n vkBridge.send('VKWebAppGetConfig').then(updateAppearance).catch(console.error);\n\n return () => vkBridge.unsubscribe(bridgeListener);\n}\n\nfunction autoDetectAppearance(\n window: Window | undefined,\n setAppearance: (value: AppearanceType) => void,\n): () => void {\n const mediaQuery =\n window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');\n\n if (mediaQuery === undefined) {\n return noop;\n }\n\n const check = (event: MediaQueryList | MediaQueryListEvent) => {\n // eslint-disable-next-line no-restricted-properties\n setAppearance(event.matches ? 'dark' : 'light');\n };\n\n check(mediaQuery);\n matchMediaListAddListener(mediaQuery, check);\n\n return () => matchMediaListRemoveListener(mediaQuery, check);\n}\n\nexport const useAutoDetectAppearance = (\n appearanceProp?: AppearanceType,\n onDetectAppearanceByBridge?: () => void,\n): AppearanceType => {\n const { window } = useDOM();\n const onceDetectAppearanceByBridge = React.useRef(() => {\n onDetectAppearanceByBridge && onDetectAppearanceByBridge();\n onceDetectAppearanceByBridge.current = noop;\n });\n\n const [appearance, setAppearance] = React.useState<AppearanceType>(() => {\n if (appearanceProp) {\n return appearanceProp;\n }\n\n const mediaQuery =\n window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');\n\n // eslint-disable-next-line no-restricted-properties\n return mediaQuery?.matches ? 'dark' : 'light';\n });\n\n React.useEffect(() => {\n if (appearanceProp) {\n setAppearance(appearanceProp);\n return noop;\n }\n\n if (vkBridge.isEmbedded()) {\n return autoDetectAppearanceByBridge(setAppearance, onceDetectAppearanceByBridge.current);\n }\n\n return autoDetectAppearance(window, setAppearance);\n }, [window, appearanceProp]);\n\n return appearance;\n};\n"],"names":["React","vkBridge","noop","resolveAppearance","useDOM","matchMediaListAddListener","matchMediaListRemoveListener","autoDetectAppearanceByBridge","setAppearance","onDetectAppearanceByBridge","updateAppearance","data","initialAppearance","bridgeListener","e","detail","type","subscribe","send","then","catch","console","error","unsubscribe","autoDetectAppearance","window","mediaQuery","matchMedia","undefined","check","event","matches","useAutoDetectAppearance","appearanceProp","onceDetectAppearanceByBridge","useRef","current","useState","appearance","useEffect","isEmbedded"],"mappings":";AAAA,YAAYA,WAAW,QAAQ;AAC/B,OAAOC,cAIA,uBAAuB;AAC9B,SAASC,IAAI,QAAQ,kBAAkB;AACvC,SAASC,iBAAiB,QAA4B,wBAAwB;AAC9E,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,yBAAyB,EAAEC,4BAA4B,QAAQ,oBAAoB;AAE5F,SAASC,6BACPC,aAA8C,EAC9CC,0BAAsC;QAE7BC,mBAAT,SAASA,iBAAiBC,IAAwB;QAChD,IAAMC,oBAAoBT,kBAAkBQ;QAE5C,IAAIC,mBAAmB;YACrBH;YACAD,cAAcI;QAChB;IACF;QAESC,iBAAT,SAASA,eAAeC,CAAsC;QAC5D,IAAuBA,YAAAA,EAAEC,QAAjBC,OAAeF,UAAfE,MAAML,OAASG,UAATH;QAEd,IAAIK,SAAS,wBAAwB;YACnC;QACF;QAEAN,iBAAiBC;IACnB;IAEAV,SAASgB,UAAUJ;IACnBZ,SAASiB,KAAK,qBAAqBC,KAAKT,kBAAkBU,MAAMC,QAAQC;IAExE,OAAO;eAAMrB,SAASsB,YAAYV;;AACpC;AAEA,SAASW,qBACPC,MAA0B,EAC1BjB,aAA8C;IAE9C,IAAMkB,aACJD,UAAUA,OAAOE,cAAcF,OAAOE,WAAW;IAEnD,IAAID,eAAeE,WAAW;QAC5B,OAAO1B;IACT;IAEA,IAAM2B,QAAQ,SAACC;QACb,oDAAoD;QACpDtB,cAAcsB,MAAMC,UAAU,SAAS;IACzC;IAEAF,MAAMH;IACNrB,0BAA0BqB,YAAYG;IAEtC,OAAO;eAAMvB,6BAA6BoB,YAAYG;;AACxD;AAEA,OAAO,IAAMG,0BAA0B,SACrCC,gBACAxB;IAEA,IAAM,AAAEgB,SAAWrB,SAAXqB;IACR,IAAMS,+BAA+BlC,MAAMmC,OAAO;QAChD1B,8BAA8BA;QAC9ByB,6BAA6BE,UAAUlC;IACzC;IAEA,IAAoCF,mCAAAA,MAAMqC,SAAyB;QACjE,IAAIJ,gBAAgB;YAClB,OAAOA;QACT;QAEA,IAAMP,aACJD,UAAUA,OAAOE,cAAcF,OAAOE,WAAW;QAEnD,oDAAoD;QACpD,OAAOD,CAAAA,uBAAAA,wBAAAA,KAAAA,IAAAA,WAAYK,OAAM,IAAI,SAAS;IACxC,QAVOO,aAA6BtC,oBAAjBQ,gBAAiBR;IAYpCA,MAAMuC,UAAU;QACd,IAAIN,gBAAgB;YAClBzB,cAAcyB;YACd,OAAO/B;QACT;QAEA,IAAID,SAASuC,cAAc;YACzB,OAAOjC,6BAA6BC,eAAe0B,6BAA6BE;QAClF;QAEA,OAAOZ,qBAAqBC,QAAQjB;IACtC,GAAG;QAACiB;QAAQQ;KAAe;IAE3B,OAAOK;AACT,EAAE"}
@@ -1,8 +1,9 @@
1
+ import { LiteralUnion } from '../types';
1
2
  import { BrowserInfo } from './browser';
2
3
  export declare enum Platform {
3
4
  ANDROID = "android",
4
5
  IOS = "ios",
5
6
  VKCOM = "vkcom"
6
7
  }
7
- export type PlatformType = Platform.ANDROID | Platform.IOS | Platform.VKCOM | string;
8
+ export type PlatformType = LiteralUnion<'android' | 'ios' | 'vkcom', string>;
8
9
  export declare function platform(browserInfo?: BrowserInfo): PlatformType;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/platform.ts"],"sourcesContent":["import { querystring } from '@vkontakte/vkjs';\nimport { BrowserInfo, computeBrowserInfo } from './browser';\nimport { canUseDOM } from './dom';\n\nexport enum Platform {\n ANDROID = 'android',\n IOS = 'ios',\n VKCOM = 'vkcom',\n}\n\nconst PLATFORM_ALIAS = {\n desktop_web: Platform.VKCOM,\n};\n\nfunction isPlatformAlias(platformAlias: string): platformAlias is keyof typeof PLATFORM_ALIAS {\n return platformAlias in PLATFORM_ALIAS;\n}\n\n/**\n * Значение, которое передаётся в качестве query-параметра при открытии VK Mini Apps\n * @see {@link https://dev.vk.com/mini-apps/development/launch-params#vk_platform vk_platform}\n */\nfunction getPlatformByQueryString(queryString: string): Platform | undefined {\n try {\n const parsedQuery = querystring.parse(queryString);\n const platformAliasByQuery = parsedQuery['vk_platform'];\n\n return typeof platformAliasByQuery === 'string' && isPlatformAlias(platformAliasByQuery)\n ? PLATFORM_ALIAS[platformAliasByQuery]\n : undefined;\n } catch (e) {\n console.warn(e);\n\n return undefined;\n }\n}\n\nconst platformByQueryString = canUseDOM ? getPlatformByQueryString(location.search) : undefined;\n\nexport type PlatformType = Platform.ANDROID | Platform.IOS | Platform.VKCOM | string;\n\nexport function platform(browserInfo?: BrowserInfo): PlatformType {\n if (platformByQueryString) {\n return platformByQueryString;\n }\n\n if (!browserInfo) {\n browserInfo = computeBrowserInfo();\n }\n\n return browserInfo.system === 'ios' ? Platform.IOS : Platform.ANDROID;\n}\n"],"names":["querystring","computeBrowserInfo","canUseDOM","Platform","ANDROID","IOS","VKCOM","PLATFORM_ALIAS","desktop_web","isPlatformAlias","platformAlias","getPlatformByQueryString","queryString","parsedQuery","parse","platformAliasByQuery","undefined","e","console","warn","platformByQueryString","location","search","platform","browserInfo","system"],"mappings":"AAAA,SAASA,WAAW,QAAQ,kBAAkB;AAC9C,SAAsBC,kBAAkB,QAAQ,YAAY;AAC5D,SAASC,SAAS,QAAQ,QAAQ;WAE3B;UAAKC,QAAQ;IAARA,SACVC,aAAU;IADAD,SAEVE,SAAM;IAFIF,SAGVG,WAAQ;GAHEH,aAAAA;AAMZ,IAAMI,iBAAiB;IACrBC,aAAaL,SAASG;AACxB;AAEA,SAASG,gBAAgBC,aAAqB;IAC5C,OAAOA,iBAAiBH;AAC1B;AAEA;;;CAGC,GACD,SAASI,yBAAyBC,WAAmB;IACnD,IAAI;QACF,IAAMC,cAAcb,YAAYc,MAAMF;QACtC,IAAMG,uBAAuBF,WAAW,CAAC,cAAc;QAEvD,OAAO,OAAOE,yBAAyB,YAAYN,gBAAgBM,wBAC/DR,cAAc,CAACQ,qBAAqB,GACpCC;IACN,EAAE,OAAOC,GAAG;QACVC,QAAQC,KAAKF;QAEb,OAAOD;IACT;AACF;AAEA,IAAMI,wBAAwBlB,YAAYS,yBAAyBU,SAASC,UAAUN;AAItF,OAAO,SAASO,SAASC,WAAyB;IAChD,IAAIJ,uBAAuB;QACzB,OAAOA;IACT;IAEA,IAAI,CAACI,aAAa;QAChBA,cAAcvB;IAChB;IAEA,OAAOuB,YAAYC,WAAW,QAAQtB,SAASE,MAAMF,SAASC;AAChE"}
1
+ {"version":3,"sources":["../../src/lib/platform.ts"],"sourcesContent":["import { querystring } from '@vkontakte/vkjs';\nimport { LiteralUnion } from '../types';\nimport { BrowserInfo, computeBrowserInfo } from './browser';\nimport { canUseDOM } from './dom';\n\nexport enum Platform {\n ANDROID = 'android',\n IOS = 'ios',\n VKCOM = 'vkcom',\n}\n\nconst PLATFORM_ALIAS = {\n desktop_web: Platform.VKCOM,\n};\n\nfunction isPlatformAlias(platformAlias: string): platformAlias is keyof typeof PLATFORM_ALIAS {\n return platformAlias in PLATFORM_ALIAS;\n}\n\n/**\n * Значение, которое передаётся в качестве query-параметра при открытии VK Mini Apps\n * @see {@link https://dev.vk.com/mini-apps/development/launch-params#vk_platform vk_platform}\n */\nfunction getPlatformByQueryString(queryString: string): Platform | undefined {\n try {\n const parsedQuery = querystring.parse(queryString);\n const platformAliasByQuery = parsedQuery['vk_platform'];\n\n return typeof platformAliasByQuery === 'string' && isPlatformAlias(platformAliasByQuery)\n ? PLATFORM_ALIAS[platformAliasByQuery]\n : undefined;\n } catch (e) {\n console.warn(e);\n\n return undefined;\n }\n}\n\nconst platformByQueryString = canUseDOM ? getPlatformByQueryString(location.search) : undefined;\n\nexport type PlatformType = LiteralUnion<'android' | 'ios' | 'vkcom', string>;\n\nexport function platform(browserInfo?: BrowserInfo): PlatformType {\n if (platformByQueryString) {\n return platformByQueryString;\n }\n\n if (!browserInfo) {\n browserInfo = computeBrowserInfo();\n }\n\n return browserInfo.system === 'ios' ? Platform.IOS : Platform.ANDROID;\n}\n"],"names":["querystring","computeBrowserInfo","canUseDOM","Platform","ANDROID","IOS","VKCOM","PLATFORM_ALIAS","desktop_web","isPlatformAlias","platformAlias","getPlatformByQueryString","queryString","parsedQuery","parse","platformAliasByQuery","undefined","e","console","warn","platformByQueryString","location","search","platform","browserInfo","system"],"mappings":"AAAA,SAASA,WAAW,QAAQ,kBAAkB;AAE9C,SAAsBC,kBAAkB,QAAQ,YAAY;AAC5D,SAASC,SAAS,QAAQ,QAAQ;WAE3B;UAAKC,QAAQ;IAARA,SACVC,aAAU;IADAD,SAEVE,SAAM;IAFIF,SAGVG,WAAQ;GAHEH,aAAAA;AAMZ,IAAMI,iBAAiB;IACrBC,aAAaL,SAASG;AACxB;AAEA,SAASG,gBAAgBC,aAAqB;IAC5C,OAAOA,iBAAiBH;AAC1B;AAEA;;;CAGC,GACD,SAASI,yBAAyBC,WAAmB;IACnD,IAAI;QACF,IAAMC,cAAcb,YAAYc,MAAMF;QACtC,IAAMG,uBAAuBF,WAAW,CAAC,cAAc;QAEvD,OAAO,OAAOE,yBAAyB,YAAYN,gBAAgBM,wBAC/DR,cAAc,CAACQ,qBAAqB,GACpCC;IACN,EAAE,OAAOC,GAAG;QACVC,QAAQC,KAAKF;QAEb,OAAOD;IACT;AACF;AAEA,IAAMI,wBAAwBlB,YAAYS,yBAAyBU,SAASC,UAAUN;AAItF,OAAO,SAASO,SAASC,WAAyB;IAChD,IAAIJ,uBAAuB;QACzB,OAAOA;IACT;IAEA,IAAI,CAACI,aAAa;QAChBA,cAAcvB;IAChB;IAEA,OAAOuB,YAAYC,WAAW,QAAQtB,SAASE,MAAMF,SAASC;AAChE"}
package/dist/types.d.ts CHANGED
@@ -54,3 +54,15 @@ export type Exact<A, B> = A extends B ? B : never;
54
54
  * Для возможности указывать css custom properties
55
55
  */
56
56
  export type CSSCustomProperties<T extends string | undefined = string> = Record<`--${string}`, T>;
57
+ interface Nothing {
58
+ }
59
+ /**
60
+ * Автозаполнение для типов
61
+ *
62
+ * @example
63
+ * LiteralUnion<'foo' | 'bar', string>
64
+ *
65
+ * @see {@link https://github.com/microsoft/TypeScript/issues/29729}
66
+ */
67
+ export type LiteralUnion<Union, Type> = Union | (Type & Nothing);
68
+ export {};
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import * as React from 'react';\nimport { Insets } from '@vkontakte/vk-bridge';\nimport { PlatformType } from './lib/platform';\n\nexport type AnyFunction = (...args: any[]) => any;\n\nexport type AlignType = 'left' | 'center' | 'right';\n\nexport interface HasChildren {\n children?: React.ReactNode;\n}\n\nexport type HasDataAttribute = Record<\n `data-${string}`,\n string | number | boolean | undefined | null\n>;\n\nexport interface HasRootRef<T> {\n getRootRef?: React.Ref<T>;\n}\n\nexport interface HasRef<T> {\n getRef?: React.Ref<T>;\n}\n\nexport interface HasComponent {\n Component?: React.ElementType;\n}\n\nexport interface HasAlign {\n align?: AlignType;\n}\n\nexport interface HasPlatform {\n /**\n * @ignore\n */\n platform?: PlatformType;\n}\n\nexport interface HasInsets {\n /**\n * @ignore\n */\n insets?: Partial<Insets>;\n}\n\nexport interface Version {\n major: number;\n minor?: number;\n patch?: number;\n}\n\n/**\n * Тип содержит атрибуты, которые применяются только для `<a>`\n *\n * @see {@link https://developer.mozilla.org/ru/docs/Web/HTML/Element/A &lt;a&gt; - HTML | MDN}\n */\nexport type AnchorHTMLAttributesOnly = Omit<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n keyof React.HTMLAttributes<HTMLAnchorElement>\n>;\n\n/**\n * Проверяет, является ли тип подтипом другого.\n *\n * В TS не реализовано.\n *\n * @see {@link https://github.com/microsoft/TypeScript/issues/12936}\n */\nexport type Exact<A, B> = A extends B ? B : never;\n\n/**\n * Для возможности указывать css custom properties\n */\nexport type CSSCustomProperties<T extends string | undefined = string> = Record<`--${string}`, T>;\n"],"names":["React"],"mappings":"AAAA,YAAYA,WAAW,QAAQ"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import * as React from 'react';\nimport { Insets } from '@vkontakte/vk-bridge';\nimport { PlatformType } from './lib/platform';\n\nexport type AnyFunction = (...args: any[]) => any;\n\nexport type AlignType = 'left' | 'center' | 'right';\n\nexport interface HasChildren {\n children?: React.ReactNode;\n}\n\nexport type HasDataAttribute = Record<\n `data-${string}`,\n string | number | boolean | undefined | null\n>;\n\nexport interface HasRootRef<T> {\n getRootRef?: React.Ref<T>;\n}\n\nexport interface HasRef<T> {\n getRef?: React.Ref<T>;\n}\n\nexport interface HasComponent {\n Component?: React.ElementType;\n}\n\nexport interface HasAlign {\n align?: AlignType;\n}\n\nexport interface HasPlatform {\n /**\n * @ignore\n */\n platform?: PlatformType;\n}\n\nexport interface HasInsets {\n /**\n * @ignore\n */\n insets?: Partial<Insets>;\n}\n\nexport interface Version {\n major: number;\n minor?: number;\n patch?: number;\n}\n\n/**\n * Тип содержит атрибуты, которые применяются только для `<a>`\n *\n * @see {@link https://developer.mozilla.org/ru/docs/Web/HTML/Element/A &lt;a&gt; - HTML | MDN}\n */\nexport type AnchorHTMLAttributesOnly = Omit<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n keyof React.HTMLAttributes<HTMLAnchorElement>\n>;\n\n/**\n * Проверяет, является ли тип подтипом другого.\n *\n * В TS не реализовано.\n *\n * @see {@link https://github.com/microsoft/TypeScript/issues/12936}\n */\nexport type Exact<A, B> = A extends B ? B : never;\n\n/**\n * Для возможности указывать css custom properties\n */\nexport type CSSCustomProperties<T extends string | undefined = string> = Record<`--${string}`, T>;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface Nothing {}\n\n/**\n * Автозаполнение для типов\n *\n * @example\n * LiteralUnion<'foo' | 'bar', string>\n *\n * @see {@link https://github.com/microsoft/TypeScript/issues/29729}\n */\nexport type LiteralUnion<Union, Type> = Union | (Type & Nothing);\n"],"names":["React"],"mappings":"AAAA,YAAYA,WAAW,QAAQ"}