@inkbar/vue 0.9.0 → 0.11.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 (104) hide show
  1. package/README.md +63 -2
  2. package/dist/components/InkDownloadButton.js +7 -0
  3. package/dist/components/InkDownloadButton.js.map +1 -0
  4. package/dist/components/InkDownloadButton.vue.d.ts +21 -0
  5. package/dist/components/InkDownloadButton.vue.d.ts.map +1 -0
  6. package/dist/components/InkDownloadButton.vue_vue_type_script_setup_true_lang.js +42 -0
  7. package/dist/components/InkDownloadButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  8. package/dist/components/InkFindBar.js.map +1 -1
  9. package/dist/components/InkFindBar.vue.d.ts.map +1 -1
  10. package/dist/components/InkFindBar.vue_vue_type_script_setup_true_lang.js +48 -48
  11. package/dist/components/InkFindBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/components/InkPanel.js +7 -0
  13. package/dist/components/InkPanel.js.map +1 -0
  14. package/dist/components/InkPanel.vue.d.ts +21 -0
  15. package/dist/components/InkPanel.vue.d.ts.map +1 -0
  16. package/dist/components/InkPanel.vue_vue_type_script_setup_true_lang.js +48 -0
  17. package/dist/components/InkPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  18. package/dist/components/InkPrintButton.js +7 -0
  19. package/dist/components/InkPrintButton.js.map +1 -0
  20. package/dist/components/InkPrintButton.vue.d.ts +19 -0
  21. package/dist/components/InkPrintButton.vue.d.ts.map +1 -0
  22. package/dist/components/InkPrintButton.vue_vue_type_script_setup_true_lang.js +39 -0
  23. package/dist/components/InkPrintButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  24. package/dist/components/InkRecordList.js +7 -0
  25. package/dist/components/InkRecordList.js.map +1 -0
  26. package/dist/components/InkRecordList.vue.d.ts +35 -0
  27. package/dist/components/InkRecordList.vue.d.ts.map +1 -0
  28. package/dist/components/InkRecordList.vue_vue_type_script_setup_true_lang.js +41 -0
  29. package/dist/components/InkRecordList.vue_vue_type_script_setup_true_lang.js.map +1 -0
  30. package/dist/components/InkRoot.js.map +1 -1
  31. package/dist/components/InkRoot.vue.d.ts +39 -0
  32. package/dist/components/InkRoot.vue.d.ts.map +1 -1
  33. package/dist/components/InkRoot.vue_vue_type_script_setup_true_lang.js +45 -45
  34. package/dist/components/InkRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/components/InkSearchResults.js +7 -0
  36. package/dist/components/InkSearchResults.js.map +1 -0
  37. package/dist/components/InkSearchResults.vue.d.ts +9 -0
  38. package/dist/components/InkSearchResults.vue.d.ts.map +1 -0
  39. package/dist/components/InkSearchResults.vue_vue_type_script_setup_true_lang.js +52 -0
  40. package/dist/components/InkSearchResults.vue_vue_type_script_setup_true_lang.js.map +1 -0
  41. package/dist/components/InkSidebar.js +7 -0
  42. package/dist/components/InkSidebar.js.map +1 -0
  43. package/dist/components/InkSidebar.vue.d.ts +34 -0
  44. package/dist/components/InkSidebar.vue.d.ts.map +1 -0
  45. package/dist/components/InkSidebar.vue_vue_type_script_setup_true_lang.js +95 -0
  46. package/dist/components/InkSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  47. package/dist/components/InkThumbnail.js +7 -0
  48. package/dist/components/InkThumbnail.js.map +1 -0
  49. package/dist/components/InkThumbnail.vue.d.ts +18 -0
  50. package/dist/components/InkThumbnail.vue.d.ts.map +1 -0
  51. package/dist/components/InkThumbnail.vue_vue_type_script_setup_true_lang.js +49 -0
  52. package/dist/components/InkThumbnail.vue_vue_type_script_setup_true_lang.js.map +1 -0
  53. package/dist/components/InkThumbnails.js +7 -0
  54. package/dist/components/InkThumbnails.js.map +1 -0
  55. package/dist/components/InkThumbnails.vue.d.ts +27 -0
  56. package/dist/components/InkThumbnails.vue.d.ts.map +1 -0
  57. package/dist/components/InkThumbnails.vue_vue_type_script_setup_true_lang.js +107 -0
  58. package/dist/components/InkThumbnails.vue_vue_type_script_setup_true_lang.js.map +1 -0
  59. package/dist/components/InkViewport.js.map +1 -1
  60. package/dist/components/InkViewport.vue.d.ts +3 -0
  61. package/dist/components/InkViewport.vue.d.ts.map +1 -1
  62. package/dist/components/InkViewport.vue_vue_type_script_setup_true_lang.js +12 -2
  63. package/dist/components/InkViewport.vue_vue_type_script_setup_true_lang.js.map +1 -1
  64. package/dist/components/InkZoomSelect.js.map +1 -1
  65. package/dist/components/InkZoomSelect.vue.d.ts.map +1 -1
  66. package/dist/components/InkZoomSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  67. package/dist/components/InkZoomSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  68. package/dist/components/RecordCards.js +7 -0
  69. package/dist/components/RecordCards.js.map +1 -0
  70. package/dist/components/RecordCards.vue.d.ts +25 -0
  71. package/dist/components/RecordCards.vue.d.ts.map +1 -0
  72. package/dist/components/RecordCards.vue_vue_type_script_setup_true_lang.js +120 -0
  73. package/dist/components/RecordCards.vue_vue_type_script_setup_true_lang.js.map +1 -0
  74. package/dist/components/SidebarTrigger.js +7 -0
  75. package/dist/components/SidebarTrigger.js.map +1 -0
  76. package/dist/components/SidebarTrigger.vue.d.ts +9 -0
  77. package/dist/components/SidebarTrigger.vue.d.ts.map +1 -0
  78. package/dist/components/SidebarTrigger.vue_vue_type_script_setup_true_lang.js +33 -0
  79. package/dist/components/SidebarTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -0
  80. package/dist/components/sidebar-context.d.ts +21 -0
  81. package/dist/components/sidebar-context.d.ts.map +1 -0
  82. package/dist/components/sidebar-context.js +7 -0
  83. package/dist/components/sidebar-context.js.map +1 -0
  84. package/dist/composables/useAnnotations.d.ts +91 -0
  85. package/dist/composables/useAnnotations.d.ts.map +1 -1
  86. package/dist/composables/useRecordSelection.d.ts +12 -0
  87. package/dist/composables/useRecordSelection.d.ts.map +1 -0
  88. package/dist/composables/useRecordSelection.js +15 -0
  89. package/dist/composables/useRecordSelection.js.map +1 -0
  90. package/dist/composables/useRecords.d.ts +14 -0
  91. package/dist/composables/useRecords.d.ts.map +1 -0
  92. package/dist/composables/useRecords.js +16 -0
  93. package/dist/composables/useRecords.js.map +1 -0
  94. package/dist/composables/useSearch.d.ts.map +1 -1
  95. package/dist/composables/useSearch.js +1 -0
  96. package/dist/composables/useSearch.js.map +1 -1
  97. package/dist/index.d.ts +11 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +40 -30
  100. package/dist/to-readable.d.ts +7 -0
  101. package/dist/to-readable.d.ts.map +1 -0
  102. package/dist/to-readable.js +11 -0
  103. package/dist/to-readable.js.map +1 -0
  104. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"InkZoomSelect.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_unref","_withCtx","_createVNode","_mergeProps","InkIcon","_createElementBlock","_Fragment","_renderList","_createTextVNode","_toDisplayString","InkIcon_default","CUSTOM","InkZoomSelect_vue_vue_type_script_setup_true_lang_default","useZoom","level","ZOOM_LEVELS","l","z","custom","computed","zoom","value","onChange","v","next","FITS","triggerAttrs","percent","levels","list","c","scale","a","b","openBlock","createBlock","unref","SelectRoot","withCtx","createVNode","SelectTrigger","mergeProps","SelectValue","SelectIcon","ChevronDown","SelectPortal","SelectContent","SelectViewport","createElementBlock","Fragment","renderList","SelectItem","o","SelectItemText","createTextVNode","toDisplayString","SelectItemIndicator","Check","SelectSeparator"],"sources":["../../src/components/InkZoomSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ZOOM_LEVELS } from '@inkbar/core/dom'\nimport { Check, ChevronDown } from '@inkbar/icons'\nimport {\n SelectContent,\n SelectIcon,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n SelectPortal,\n SelectRoot,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n SelectViewport,\n} from 'reka-ui'\nimport { computed } from 'vue'\n\nimport { useZoom } from '../composables/useZoom'\n\nimport InkIcon from './InkIcon.vue'\n\nimport type { ZoomValue } from '@inkbar/core/dom'\n\nconst CUSTOM = 'custom:'\n\nconst { zoom, scale, setZoom } = useZoom()\n\nconst level = (z: number) => ZOOM_LEVELS.find((l) => Math.abs(l - z) < 0.001)\n/** A numeric zoom that is not one of the levels (zoom in and out multiply). */\nconst custom = computed(() =>\n typeof zoom.value === 'number' && level(zoom.value) === undefined ? zoom.value : null\n)\nconst value = computed(() => {\n const z = zoom.value\n if (typeof z !== 'number') return z\n return custom.value === null ? String(level(z)) : `${CUSTOM}${z}`\n})\n\nfunction onChange(v: unknown): void {\n if (typeof v !== 'string' || v === value.value) return\n const next: ZoomValue =\n v === 'fit-width' || v === 'fit-page' ? v : Number(v.replace(CUSTOM, ''))\n setZoom(next)\n}\n\nconst FITS = [\n { value: 'fit-width', label: 'Fit width' },\n { value: 'fit-page', label: 'Fit page' },\n]\n// Reka's typed props stop at its own; ARIA goes through a bound object.\nconst triggerAttrs = { 'aria-label': 'Zoom' }\nconst percent = (z: number) => `${Math.round(z * 100)}%`\n/** The levels, with a custom zoom in its place among them. */\nconst levels = computed(() => {\n const list = ZOOM_LEVELS.map((l) => ({ z: l, value: String(l), label: percent(l) }))\n const c = custom.value\n if (c !== null) list.push({ z: c, value: `${CUSTOM}${c}`, label: percent(scale.value) })\n return list.sort((a, b) => a.z - b.z)\n})\n</script>\n\n<template>\n <SelectRoot :model-value=\"value\" @update:model-value=\"onChange\">\n <SelectTrigger\n class=\"ink-zoom-select ink-select-trigger\"\n data-ink-zoom-select\n v-bind=\"triggerAttrs\"\n >\n <SelectValue class=\"ink-select-value\" />\n <SelectIcon class=\"ink-select-icon\">\n <InkIcon :icon=\"ChevronDown\" :size=\"16\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectContent\n class=\"ink-select-content\"\n data-ink-select-content\n position=\"popper\"\n side=\"top\"\n :side-offset=\"4\"\n >\n <SelectViewport>\n <SelectItem\n v-for=\"o in FITS\"\n :key=\"o.value\"\n :value=\"o.value\"\n class=\"ink-select-item\"\n data-ink-select-item\n >\n <SelectItemText>{{ o.label }}</SelectItemText>\n <SelectItemIndicator class=\"ink-select-indicator\">\n <InkIcon :icon=\"Check\" :size=\"16\" />\n </SelectItemIndicator>\n </SelectItem>\n <SelectSeparator class=\"ink-select-separator\" />\n <SelectItem\n v-for=\"o in levels\"\n :key=\"o.value\"\n :value=\"o.value\"\n class=\"ink-select-item\"\n data-ink-select-item\n >\n <SelectItemText>{{ o.label }}</SelectItemText>\n <SelectItemIndicator class=\"ink-select-indicator\">\n <InkIcon :icon=\"Check\" :size=\"16\" />\n </SelectItemIndicator>\n </SelectItem>\n </SelectViewport>\n </SelectContent>\n </SelectPortal>\n </SelectRoot>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"InkZoomSelect.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_unref","_withCtx","_createVNode","_mergeProps","InkIcon","_createElementBlock","_Fragment","_renderList","_createTextVNode","_toDisplayString","InkIcon_default","CUSTOM","InkZoomSelect_vue_vue_type_script_setup_true_lang_default","useZoom","level","ZOOM_LEVELS","l","z","custom","computed","zoom","value","onChange","v","next","FITS","triggerAttrs","percent","levels","list","c","scale","a","b","openBlock","createBlock","unref","SelectRoot","withCtx","createVNode","SelectTrigger","mergeProps","SelectValue","SelectIcon","ChevronDown","SelectPortal","SelectContent","SelectViewport","createElementBlock","Fragment","renderList","SelectItem","o","SelectItemText","createTextVNode","toDisplayString","SelectItemIndicator","Check","SelectSeparator"],"sources":["../../src/components/InkZoomSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ZOOM_LEVELS } from '@inkbar/core/dom'\nimport { Check, ChevronDown } from '@inkbar/icons'\nimport {\n SelectContent,\n SelectIcon,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n SelectPortal,\n SelectRoot,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n SelectViewport,\n} from 'reka-ui'\nimport { computed } from 'vue'\n\nimport { useZoom } from '../composables/useZoom'\n\nimport InkIcon from './InkIcon.vue'\n\nimport type { ZoomValue } from '@inkbar/core/dom'\n\nconst CUSTOM = 'custom:'\n\nconst { zoom, scale, setZoom } = useZoom()\n\nconst level = (z: number) => ZOOM_LEVELS.find((l) => Math.abs(l - z) < 0.001)\n/** A numeric zoom that is not one of the levels (zoom in and out multiply). */\nconst custom = computed(() =>\n typeof zoom.value === 'number' && level(zoom.value) === undefined ? zoom.value : null\n)\nconst value = computed(() => {\n const z = zoom.value\n if (typeof z !== 'number') return z\n return custom.value === null ? String(level(z)) : `${CUSTOM}${z}`\n})\n\nfunction onChange(v: unknown): void {\n if (typeof v !== 'string' || v === value.value) return\n const next: ZoomValue =\n v === 'fit-width' || v === 'fit-page' ? v : Number(v.replace(CUSTOM, ''))\n setZoom(next)\n}\n\nconst FITS = [\n { value: 'fit-width', label: 'Fit width' },\n { value: 'fit-page', label: 'Fit page' },\n]\n// Reka's typed props stop at its own; ARIA goes through a bound object.\nconst triggerAttrs = { 'aria-label': 'Zoom' }\nconst percent = (z: number) => `${Math.round(z * 100)}%`\n/** The levels, with a custom zoom in its place among them. */\nconst levels = computed(() => {\n const list = ZOOM_LEVELS.map((l) => ({ z: l, value: String(l), label: percent(l) }))\n const c = custom.value\n if (c !== null) list.push({ z: c, value: `${CUSTOM}${c}`, label: percent(scale.value) })\n return list.sort((a, b) => a.z - b.z)\n})\n</script>\n\n<template>\n <SelectRoot :model-value=\"value\" @update:model-value=\"onChange\">\n <SelectTrigger\n class=\"ink-select ink-select-trigger ink-zoom-select\"\n data-ink-zoom-select\n v-bind=\"triggerAttrs\"\n >\n <SelectValue class=\"ink-select-value\" />\n <SelectIcon class=\"ink-select-icon\">\n <InkIcon :icon=\"ChevronDown\" :size=\"16\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectContent\n class=\"ink-select-content\"\n data-ink-select-content\n position=\"popper\"\n side=\"top\"\n :side-offset=\"4\"\n >\n <SelectViewport>\n <SelectItem\n v-for=\"o in FITS\"\n :key=\"o.value\"\n :value=\"o.value\"\n class=\"ink-select-item\"\n data-ink-select-item\n >\n <SelectItemText>{{ o.label }}</SelectItemText>\n <SelectItemIndicator class=\"ink-select-indicator\">\n <InkIcon :icon=\"Check\" :size=\"16\" />\n </SelectItemIndicator>\n </SelectItem>\n <SelectSeparator class=\"ink-select-separator\" />\n <SelectItem\n v-for=\"o in levels\"\n :key=\"o.value\"\n :value=\"o.value\"\n class=\"ink-select-item\"\n data-ink-select-item\n >\n <SelectItemText>{{ o.label }}</SelectItemText>\n <SelectItemIndicator class=\"ink-select-indicator\">\n <InkIcon :icon=\"Check\" :size=\"16\" />\n </SelectItemIndicator>\n </SelectItem>\n </SelectViewport>\n </SelectContent>\n </SelectPortal>\n </SelectRoot>\n</template>\n"],"mappings":";;;;;;;AAwBA,IAAMa,IAAS;;;EAEf,IAAM,EAAE,SAAM,UAAO,eAAYE,EAAQ,GAEnCC,KAAS,MAAcC,EAAY,MAAM,MAAM,KAAK,IAAIC,IAAIC,CAAC,IAAI,IAAK,GAEtEC,IAASC,QACb,OAAOC,EAAK,SAAU,YAAYN,EAAMM,EAAK,KAAK,MAAM,KAAA,IAAYA,EAAK,QAAQ,IACnF,GACMC,IAAQF,QAAe;GAC3B,IAAMF,IAAIG,EAAK;GAEf,OADI,OAAOH,KAAM,WACVC,EAAO,UAAU,OAAO,OAAOJ,EAAMG,CAAC,CAAC,IAAI,GAAGN,IAASM,MAD5BA;EAEpC,CAAC;EAED,SAASK,EAAS,GAAkB;GAClC,IAAI,OAAOC,KAAM,YAAYA,MAAMF,EAAM,OAAO;GAChD,IAAMG,IACJD,MAAM,eAAeA,MAAM,aAAaA,IAAI,OAAOA,EAAE,QAAQZ,GAAQ,EAAE,CAAC;GAC1E,EAAQa,CAAI;EACd;EAEA,IAAMC,IAAO,CACX;GAAE,OAAO;GAAa,OAAO;EAAY,GACzC;GAAE,OAAO;GAAY,OAAO;EAAW,CACzC,GAEMC,IAAe,EAAE,cAAc,OAAO,GACtCC,KAAW,MAAc,GAAG,KAAK,MAAMV,IAAI,GAAG,EAAE,IAEhDW,IAAST,QAAe;GAC5B,IAAMU,IAAOd,EAAY,KAAK,OAAO;IAAE,GAAGC;IAAG,OAAO,OAAOA,CAAC;IAAG,OAAOW,EAAQX,CAAC;GAAE,EAAE,GAC7Ec,IAAIZ,EAAO;GAEjB,OADIY,MAAM,QAAMD,EAAK,KAAK;IAAE,GAAGC;IAAG,OAAO,GAAGnB,IAASmB;IAAK,OAAOH,EAAQI,EAAM,KAAK;GAAE,CAAC,GAChFF,EAAK,MAAM,GAAG,MAAMG,EAAE,IAAIC,EAAE,CAAC;EACtC,CAAC;oBAICnC,EAAA,GAAAC,EAgDaC,EAAAqC,CAAA,GAAA;GAhDA,eAAahB,EAAA;GAAQ,uBAAoBC;;GACpD,SAAArB,QASgB,CAThBC,EASgBF,EAAAwC,CAAA,GAThBrC,EASgB;IARd,OAAM;IACN,wBAAA;GACQ,GAAAuB,CAAY,GAAA;IAEpB,SAAAzB,QAAwC,CAAxCC,EAAwCF,EAAA0C,CAAA,GAAA,EAA3B,OAAM,mBAAkB,CAAA,GACrCxC,EAEaF,EAAA2C,CAAA,GAAA,EAFD,OAAM,kBAAiB,GAAA;KACjC,SAAA1C,QAA0C,CAA1CC,EAA0CE,GAAA;MAAhC,MAAMJ,EAAA4C,CAAA;MAAc,MAAM;;;;;GAGxC1C,GAAAA,EAAAA,GAAAA,EAoCeF,EAAA6C,CAAA,GAAA,MAAA;IAnCb,SAAA5C,QAkCgB,CAlChBC,EAkCgBF,EAAA8C,CAAA,GAAA;KAjCd,OAAM;KACN,2BAAA;KACA,UAAS;KACT,MAAK;KACJ,eAAa;;KAEd,SAAA7C,QA0BiB,CA1BjBC,EA0BiBF,EAAA+C,CAAA,GAAA,MAAA;MAxBb,SAAA9C,QAAiB;QADnBH,EAAA,GAAAO,EAWaC,GAAA,MAAAC,EAVCkB,IAAL,MADTvB,EAWaF,EAAAmD,CAAA,GAAA;QATV,KAAKC,EAAE;QACP,OAAOA,EAAE;QACV,OAAM;QACN,wBAAA;;QAEA,SAAAnD,QAA8C,CAA9CC,EAA8CF,EAAAqD,CAAA,GAAA,MAAA;SAA9B,SAAApD,QAAa,CAAVO,EAAAC,EAAA2C,EAAE,KAAK,GAAA,CAAA,CAAA,CAAA;;QAC1BlD,GAAAA,IAAAA,GAAAA,EAEsBF,EAAAwD,CAAA,GAAA,EAFD,OAAM,uBAAsB,GAAA;SAC/C,SAAAvD,QAAoC,CAApCC,EAAoCE,GAAA;UAA1B,MAAMJ,EAAAyD,CAAA;UAAQ,MAAM;;;;;;OAGlCvD,EAAgDF,EAAA0D,CAAA,GAAA,EAA/B,OAAM,uBAAsB,CAAA;QAC7C5D,EAAA,EAAA,GAAAO,EAWaC,GAAA,MAAAC,EAVCqB,EAAA,QAAL,OADT9B,EAAA,GAAAC,EAWaC,EAAAmD,CAAA,GAAA;QATV,KAAKC,EAAE;QACP,OAAOA,EAAE;QACV,OAAM;QACN,wBAAA;;QAEA,SAAAnD,QAA8C,CAA9CC,EAA8CF,EAAAqD,CAAA,GAAA,MAAA;SAA9B,SAAApD,QAAa,CAAVO,EAAAC,EAAA2C,EAAE,KAAK,GAAA,CAAA,CAAA,CAAA;;QAC1BlD,GAAAA,IAAAA,GAAAA,EAEsBF,EAAAwD,CAAA,GAAA,EAFD,OAAM,uBAAsB,GAAA;SAC/C,SAAAvD,QAAoC,CAApCC,EAAoCE,GAAA;UAA1B,MAAMJ,EAAAyD,CAAA;UAAQ,MAAM"}
@@ -0,0 +1,7 @@
1
+ import e from "./RecordCards.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/components/RecordCards.vue
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
6
+
7
+ //# sourceMappingURL=RecordCards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordCards.js","names":["_sfc_main","RecordCards_vue_vue_type_script_setup_true_lang_default","RecordCards_default"],"sources":["../../src/components/RecordCards.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/*\n * A record list's markup on core's record list controller, shared by `InkRecordList` and\n * `InkSearchResults`: `createRecordList`'s `div.ink-records` holding `ul.ink-record-list` with\n * one `li.ink-record` card per row, the empty text and a polite live region. The controller\n * holds the rows, the count and the announcement, and handles the clicks, keys, Tab stop,\n * focus and scrolling. Empty, with no empty text, until there is a source.\n */\nimport {\n createRecordListController,\n type RecordListController,\n type RecordListRow,\n type RecordListSource,\n} from '@inkbar/core/dom'\nimport { computed, nextTick, shallowRef, useTemplateRef, watch } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n source: RecordListSource | null\n /** Whether the empty text shows when there are no rows. */\n emptyShown?: boolean\n }>(),\n { emptyShown: true }\n)\n\nconst emit = defineEmits<{ 'update:count': [count: number] }>()\n\ndefineSlots<{ empty?(): unknown }>()\n\nconst root = useTemplateRef<HTMLElement>('root')\nconst controller = shallowRef<RecordListController | null>(null)\nconst rows = shallowRef<readonly RecordListRow[]>([])\nconst announcement = shallowRef('')\nconst empty = computed(\n () => controller.value !== null && rows.value.length === 0 && props.emptyShown\n)\n\nlet reported: number | null = null\nfunction report(count: number): void {\n if (count === reported) return\n reported = count\n emit('update:count', count)\n}\n\n/**\n * When the rows change under a focused action whose button goes (its card lost that action),\n * focus the same place in the card once it re-renders, else the row. A row that goes is the\n * controller's to re-home.\n */\nfunction keepActionFocus(): void {\n const el = root.value\n const active = el?.ownerDocument.activeElement\n if (!el || !(active instanceof HTMLButtonElement) || !el.contains(active)) return\n const row = active.closest<HTMLElement>('[data-ink-record]')\n if (!row) return\n const id = row.dataset.inkRecord\n const buttons = (r: HTMLElement) => [\n ...r.querySelectorAll<HTMLElement>('.ink-card-actions > button'),\n ]\n const index = buttons(row).indexOf(active)\n void nextTick(() => {\n if (active.isConnected) return\n const now = [...el.querySelectorAll<HTMLElement>('[data-ink-record]')].find(\n (r) => r.dataset.inkRecord === id\n )\n if (now) (buttons(now)[index] ?? now).focus({ preventScroll: true })\n })\n}\n\nwatch(\n [() => props.source, root],\n ([source, el], _, onCleanup) => {\n if (!source || !el) {\n controller.value = null\n rows.value = []\n announcement.value = ''\n return\n }\n const c = createRecordListController(source)\n controller.value = c\n rows.value = c.rows.get()\n announcement.value = c.announcement.get()\n report(c.count.get())\n const stops = [\n c.rows.subscribe((next) => {\n keepActionFocus()\n rows.value = next\n }),\n c.count.subscribe(report),\n c.announcement.subscribe((text) => {\n announcement.value = text\n }),\n ]\n const detach = c.attach(el)\n onCleanup(() => {\n for (const stop of stops) stop()\n detach()\n c.destroy()\n })\n },\n { flush: 'post', immediate: true }\n)\n</script>\n\n<template>\n <div ref=\"root\" class=\"ink-records\" data-ink-records tabindex=\"-1\">\n <ul class=\"ink-record-list\" role=\"list\" :hidden=\"rows.length === 0\">\n <!-- The controller sets each row's tabindex. -->\n <li\n v-for=\"{ item, card, selected } in rows\"\n :key=\"item.id\"\n class=\"ink-record\"\n :data-ink-record=\"item.id\"\n :aria-current=\"selected ? 'true' : undefined\"\n :data-selected=\"selected ? '' : undefined\"\n >\n <div :class=\"['ink-card', card?.className]\">\n <template v-if=\"card\">\n <p class=\"ink-card-title\">{{ card.title }}</p>\n <!-- prettier-ignore -->\n <p v-if=\"card.meta !== undefined\" class=\"ink-card-meta\"><span v-if=\"card.swatch !== undefined\" class=\"ink-card-swatch\" :style=\"{ background: card.swatch }\" />{{ card.meta }}</p>\n <p v-if=\"card.body !== undefined\" class=\"ink-card-body\">{{ card.body }}</p>\n <!-- prettier-ignore -->\n <p v-if=\"card.excerpt !== undefined\" class=\"ink-card-excerpt\">{{ card.excerpt.before }}<mark>{{ card.excerpt.match }}</mark>{{ card.excerpt.after }}</p>\n <div class=\"ink-card-actions\">\n <button\n v-for=\"label in Object.keys(card.actions)\"\n :key=\"label\"\n type=\"button\"\n @click=\"controller?.act(item.id, label)\"\n v-text=\"label\"\n />\n </div>\n </template>\n </div>\n </li>\n </ul>\n <p class=\"ink-record-list-empty\" :hidden=\"!empty\">\n <slot name=\"empty\">Nothing here yet.</slot>\n </p>\n <div\n class=\"ink-visually-hidden\"\n aria-live=\"polite\"\n data-ink-record-status\n v-text=\"announcement\"\n />\n </div>\n</template>\n"],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { RecordListSource } from '@inkbar/core/dom';
2
+ type __VLS_Props = {
3
+ source: RecordListSource | null;
4
+ /** Whether the empty text shows when there are no rows. */
5
+ emptyShown?: boolean;
6
+ };
7
+ type __VLS_Slots = {
8
+ empty?(): unknown;
9
+ };
10
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
11
+ "update:count": (count: number) => any;
12
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
13
+ "onUpdate:count"?: (count: number) => any;
14
+ }>, {
15
+ emptyShown: boolean;
16
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
17
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
18
+ declare const _default: typeof __VLS_export;
19
+ export default _default;
20
+ type __VLS_WithSlots<T, S> = T & {
21
+ new (): {
22
+ $slots: S;
23
+ };
24
+ };
25
+ //# sourceMappingURL=RecordCards.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordCards.vue.d.ts","sourceRoot":"","sources":["../../src/components/RecordCards.vue"],"names":[],"mappings":"AA6JA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAA;AAIzB,KAAK,WAAW,GAAG;IACf,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC/B,2DAA2D;IAC3D,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAC;AASJ,KAAK,WAAW,GAAG;IAAE,KAAK,CAAC,IAAI,OAAO,CAAA;CAAE,CAAC;AAgNzC,QAAA,MAAM,UAAU;;;;;;6EAId,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { Fragment as e, computed as t, createCommentVNode as n, createElementBlock as r, createElementVNode as i, createTextVNode as a, defineComponent as o, nextTick as s, normalizeClass as c, normalizeStyle as l, openBlock as u, renderList as d, renderSlot as f, shallowRef as p, toDisplayString as m, useTemplateRef as h, watch as g } from "vue";
2
+ import { createRecordListController as _ } from "@inkbar/core/dom";
3
+ //#region src/components/RecordCards.vue?vue&type=script&setup=true&lang.ts
4
+ var v = ["hidden"], y = [
5
+ "data-ink-record",
6
+ "aria-current",
7
+ "data-selected"
8
+ ], b = { class: "ink-card-title" }, x = {
9
+ key: 0,
10
+ class: "ink-card-meta"
11
+ }, S = {
12
+ key: 1,
13
+ class: "ink-card-body"
14
+ }, C = {
15
+ key: 2,
16
+ class: "ink-card-excerpt"
17
+ }, w = { class: "ink-card-actions" }, T = ["onClick", "textContent"], E = ["hidden"], D = ["textContent"], O = /*@__PURE__*/ o({
18
+ __name: "RecordCards",
19
+ props: {
20
+ source: {},
21
+ emptyShown: {
22
+ type: Boolean,
23
+ default: !0
24
+ }
25
+ },
26
+ emits: ["update:count"],
27
+ setup(o, { emit: O }) {
28
+ let k = o, A = O, j = h("root"), M = p(null), N = p([]), P = p(""), F = t(() => M.value !== null && N.value.length === 0 && k.emptyShown), I = null;
29
+ function L(e) {
30
+ e !== I && (I = e, A("update:count", e));
31
+ }
32
+ function R() {
33
+ let e = j.value, t = e?.ownerDocument.activeElement;
34
+ if (!e || !(t instanceof HTMLButtonElement) || !e.contains(t)) return;
35
+ let n = t.closest("[data-ink-record]");
36
+ if (!n) return;
37
+ let r = n.dataset.inkRecord, i = (e) => [...e.querySelectorAll(".ink-card-actions > button")], a = i(n).indexOf(t);
38
+ s(() => {
39
+ if (t.isConnected) return;
40
+ let n = [...e.querySelectorAll("[data-ink-record]")].find((e) => e.dataset.inkRecord === r);
41
+ n && (i(n)[a] ?? n).focus({ preventScroll: !0 });
42
+ });
43
+ }
44
+ return g([() => k.source, j], ([e, t], n, r) => {
45
+ if (!e || !t) {
46
+ M.value = null, N.value = [], P.value = "";
47
+ return;
48
+ }
49
+ let i = _(e);
50
+ M.value = i, N.value = i.rows.get(), P.value = i.announcement.get(), L(i.count.get());
51
+ let a = [
52
+ i.rows.subscribe((e) => {
53
+ R(), N.value = e;
54
+ }),
55
+ i.count.subscribe(L),
56
+ i.announcement.subscribe((e) => {
57
+ P.value = e;
58
+ })
59
+ ], o = i.attach(t);
60
+ r(() => {
61
+ for (let e of a) e();
62
+ o(), i.destroy();
63
+ });
64
+ }, {
65
+ flush: "post",
66
+ immediate: !0
67
+ }), (t, o) => (u(), r("div", {
68
+ ref_key: "root",
69
+ ref: j,
70
+ class: "ink-records",
71
+ "data-ink-records": "",
72
+ tabindex: "-1"
73
+ }, [
74
+ i("ul", {
75
+ class: "ink-record-list",
76
+ role: "list",
77
+ hidden: N.value.length === 0
78
+ }, [(u(!0), r(e, null, d(N.value, ({ item: t, card: o, selected: s }) => (u(), r("li", {
79
+ key: t.id,
80
+ class: "ink-record",
81
+ "data-ink-record": t.id,
82
+ "aria-current": s ? "true" : void 0,
83
+ "data-selected": s ? "" : void 0
84
+ }, [i("div", { class: c(["ink-card", o?.className]) }, [o ? (u(), r(e, { key: 0 }, [
85
+ i("p", b, m(o.title), 1),
86
+ o.meta === void 0 ? n("", !0) : (u(), r("p", x, [o.swatch === void 0 ? n("", !0) : (u(), r("span", {
87
+ key: 0,
88
+ class: "ink-card-swatch",
89
+ style: l({ background: o.swatch })
90
+ }, null, 4)), a(m(o.meta), 1)])),
91
+ o.body === void 0 ? n("", !0) : (u(), r("p", S, m(o.body), 1)),
92
+ o.excerpt === void 0 ? n("", !0) : (u(), r("p", C, [
93
+ a(m(o.excerpt.before), 1),
94
+ i("mark", null, m(o.excerpt.match), 1),
95
+ a(m(o.excerpt.after), 1)
96
+ ])),
97
+ i("div", w, [(u(!0), r(e, null, d(Object.keys(o.actions), (e) => (u(), r("button", {
98
+ key: e,
99
+ type: "button",
100
+ onClick: (n) => M.value?.act(t.id, e),
101
+ textContent: m(e)
102
+ }, null, 8, T))), 128))])
103
+ ], 64)) : n("", !0)], 2)], 8, y))), 128))], 8, v),
104
+ i("p", {
105
+ class: "ink-record-list-empty",
106
+ hidden: !F.value
107
+ }, [f(t.$slots, "empty", {}, () => [o[0] ||= a("Nothing here yet.", -1)])], 8, E),
108
+ i("div", {
109
+ class: "ink-visually-hidden",
110
+ "aria-live": "polite",
111
+ "data-ink-record-status": "",
112
+ textContent: m(P.value)
113
+ }, null, 8, D)
114
+ ], 512));
115
+ }
116
+ });
117
+ //#endregion
118
+ export { O as default };
119
+
120
+ //# sourceMappingURL=RecordCards.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordCards.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createElementVNode","_Fragment","_renderList","_normalizeClass","_toDisplayString","_normalizeStyle","_createCommentVNode","_createTextVNode","_renderSlot","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","RecordCards_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","root","useTemplateRef","controller","shallowRef","rows","announcement","empty","computed","reported","report","count","keepActionFocus","el","active","row","id","buttons","r","index","now","watch","source","c","createRecordListController","stops","next","text","detach","stop","openBlock","createElementBlock","createElementVNode","Fragment","renderList","item","selected","normalizeClass","card","toDisplayString","createCommentVNode","normalizeStyle","createTextVNode","label","renderSlot","_ctx","_cache"],"sources":["../../src/components/RecordCards.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/*\n * A record list's markup on core's record list controller, shared by `InkRecordList` and\n * `InkSearchResults`: `createRecordList`'s `div.ink-records` holding `ul.ink-record-list` with\n * one `li.ink-record` card per row, the empty text and a polite live region. The controller\n * holds the rows, the count and the announcement, and handles the clicks, keys, Tab stop,\n * focus and scrolling. Empty, with no empty text, until there is a source.\n */\nimport {\n createRecordListController,\n type RecordListController,\n type RecordListRow,\n type RecordListSource,\n} from '@inkbar/core/dom'\nimport { computed, nextTick, shallowRef, useTemplateRef, watch } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n source: RecordListSource | null\n /** Whether the empty text shows when there are no rows. */\n emptyShown?: boolean\n }>(),\n { emptyShown: true }\n)\n\nconst emit = defineEmits<{ 'update:count': [count: number] }>()\n\ndefineSlots<{ empty?(): unknown }>()\n\nconst root = useTemplateRef<HTMLElement>('root')\nconst controller = shallowRef<RecordListController | null>(null)\nconst rows = shallowRef<readonly RecordListRow[]>([])\nconst announcement = shallowRef('')\nconst empty = computed(\n () => controller.value !== null && rows.value.length === 0 && props.emptyShown\n)\n\nlet reported: number | null = null\nfunction report(count: number): void {\n if (count === reported) return\n reported = count\n emit('update:count', count)\n}\n\n/**\n * When the rows change under a focused action whose button goes (its card lost that action),\n * focus the same place in the card once it re-renders, else the row. A row that goes is the\n * controller's to re-home.\n */\nfunction keepActionFocus(): void {\n const el = root.value\n const active = el?.ownerDocument.activeElement\n if (!el || !(active instanceof HTMLButtonElement) || !el.contains(active)) return\n const row = active.closest<HTMLElement>('[data-ink-record]')\n if (!row) return\n const id = row.dataset.inkRecord\n const buttons = (r: HTMLElement) => [\n ...r.querySelectorAll<HTMLElement>('.ink-card-actions > button'),\n ]\n const index = buttons(row).indexOf(active)\n void nextTick(() => {\n if (active.isConnected) return\n const now = [...el.querySelectorAll<HTMLElement>('[data-ink-record]')].find(\n (r) => r.dataset.inkRecord === id\n )\n if (now) (buttons(now)[index] ?? now).focus({ preventScroll: true })\n })\n}\n\nwatch(\n [() => props.source, root],\n ([source, el], _, onCleanup) => {\n if (!source || !el) {\n controller.value = null\n rows.value = []\n announcement.value = ''\n return\n }\n const c = createRecordListController(source)\n controller.value = c\n rows.value = c.rows.get()\n announcement.value = c.announcement.get()\n report(c.count.get())\n const stops = [\n c.rows.subscribe((next) => {\n keepActionFocus()\n rows.value = next\n }),\n c.count.subscribe(report),\n c.announcement.subscribe((text) => {\n announcement.value = text\n }),\n ]\n const detach = c.attach(el)\n onCleanup(() => {\n for (const stop of stops) stop()\n detach()\n c.destroy()\n })\n },\n { flush: 'post', immediate: true }\n)\n</script>\n\n<template>\n <div ref=\"root\" class=\"ink-records\" data-ink-records tabindex=\"-1\">\n <ul class=\"ink-record-list\" role=\"list\" :hidden=\"rows.length === 0\">\n <!-- The controller sets each row's tabindex. -->\n <li\n v-for=\"{ item, card, selected } in rows\"\n :key=\"item.id\"\n class=\"ink-record\"\n :data-ink-record=\"item.id\"\n :aria-current=\"selected ? 'true' : undefined\"\n :data-selected=\"selected ? '' : undefined\"\n >\n <div :class=\"['ink-card', card?.className]\">\n <template v-if=\"card\">\n <p class=\"ink-card-title\">{{ card.title }}</p>\n <!-- prettier-ignore -->\n <p v-if=\"card.meta !== undefined\" class=\"ink-card-meta\"><span v-if=\"card.swatch !== undefined\" class=\"ink-card-swatch\" :style=\"{ background: card.swatch }\" />{{ card.meta }}</p>\n <p v-if=\"card.body !== undefined\" class=\"ink-card-body\">{{ card.body }}</p>\n <!-- prettier-ignore -->\n <p v-if=\"card.excerpt !== undefined\" class=\"ink-card-excerpt\">{{ card.excerpt.before }}<mark>{{ card.excerpt.match }}</mark>{{ card.excerpt.after }}</p>\n <div class=\"ink-card-actions\">\n <button\n v-for=\"label in Object.keys(card.actions)\"\n :key=\"label\"\n type=\"button\"\n @click=\"controller?.act(item.id, label)\"\n v-text=\"label\"\n />\n </div>\n </template>\n </div>\n </li>\n </ul>\n <p class=\"ink-record-list-empty\" :hidden=\"!empty\">\n <slot name=\"empty\">Nothing here yet.</slot>\n </p>\n <div\n class=\"ink-visually-hidden\"\n aria-live=\"polite\"\n data-ink-record-status\n v-text=\"announcement\"\n />\n </div>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import e from "./SidebarTrigger.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/components/SidebarTrigger.vue
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
6
+
7
+ //# sourceMappingURL=SidebarTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarTrigger.js","names":["_sfc_main","SidebarTrigger_vue_vue_type_script_setup_true_lang_default","SidebarTrigger_default"],"sources":["../../src/components/SidebarTrigger.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/*\n * A sidebar trigger's content: `createSidebar`'s markup, so the theme styles both alike. The\n * rail shows the icon alone (the trigger's `title` carries the label); tabs and stack headers\n * show the label too. The badge is hidden from assistive technology: the trigger's name has it.\n */\nimport { sidebarBadge, type SidebarPanelInfo } from '@inkbar/core/dom'\nimport { computed } from 'vue'\n\nimport InkIcon from './InkIcon.vue'\n\nconst props = defineProps<{ panel: SidebarPanelInfo; rail: boolean }>()\nconst badge = computed(() => sidebarBadge(props.panel.badge))\n</script>\n\n<template>\n <InkIcon v-if=\"panel.icon\" :icon=\"panel.icon\" />\n <span v-if=\"!panel.icon || !rail\" class=\"ink-sidebar-label\">{{ panel.label }}</span>\n <span class=\"ink-sidebar-badge\" aria-hidden=\"true\" :hidden=\"badge === null\">{{\n badge\n }}</span>\n</template>\n"],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { SidebarPanelInfo } from '@inkbar/core/dom';
2
+ type __VLS_Props = {
3
+ panel: SidebarPanelInfo;
4
+ rail: boolean;
5
+ };
6
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
9
+ //# sourceMappingURL=SidebarTrigger.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarTrigger.vue.d.ts","sourceRoot":"","sources":["../../src/components/SidebarTrigger.vue"],"names":[],"mappings":"AA6BA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAMtE,KAAK,WAAW,GAAG;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAgD9D,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -0,0 +1,33 @@
1
+ import e from "./InkIcon.js";
2
+ import { Fragment as t, computed as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, defineComponent as s, openBlock as c, toDisplayString as l } from "vue";
3
+ import { sidebarBadge as u } from "@inkbar/core/dom";
4
+ //#region src/components/SidebarTrigger.vue?vue&type=script&setup=true&lang.ts
5
+ var d = {
6
+ key: 1,
7
+ class: "ink-sidebar-label"
8
+ }, f = ["hidden"], p = /*@__PURE__*/ s({
9
+ __name: "SidebarTrigger",
10
+ props: {
11
+ panel: {},
12
+ rail: { type: Boolean }
13
+ },
14
+ setup(s) {
15
+ let p = s, m = n(() => u(p.panel.badge));
16
+ return (n, u) => (c(), a(t, null, [
17
+ s.panel.icon ? (c(), r(e, {
18
+ key: 0,
19
+ icon: s.panel.icon
20
+ }, null, 8, ["icon"])) : i("", !0),
21
+ !s.panel.icon || !s.rail ? (c(), a("span", d, l(s.panel.label), 1)) : i("", !0),
22
+ o("span", {
23
+ class: "ink-sidebar-badge",
24
+ "aria-hidden": "true",
25
+ hidden: m.value === null
26
+ }, l(m.value), 9, f)
27
+ ], 64));
28
+ }
29
+ });
30
+ //#endregion
31
+ export { p as default };
32
+
33
+ //# sourceMappingURL=SidebarTrigger.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarTrigger.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createBlock","InkIcon","_createCommentVNode","_toDisplayString","_createElementVNode","InkIcon_default","_hoisted_1","_hoisted_2","SidebarTrigger_vue_vue_type_script_setup_true_lang_default","props","__props","badge","computed","sidebarBadge","openBlock","createElementBlock","Fragment","createBlock","createCommentVNode","toDisplayString","createElementVNode"],"sources":["../../src/components/SidebarTrigger.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/*\n * A sidebar trigger's content: `createSidebar`'s markup, so the theme styles both alike. The\n * rail shows the icon alone (the trigger's `title` carries the label); tabs and stack headers\n * show the label too. The badge is hidden from assistive technology: the trigger's name has it.\n */\nimport { sidebarBadge, type SidebarPanelInfo } from '@inkbar/core/dom'\nimport { computed } from 'vue'\n\nimport InkIcon from './InkIcon.vue'\n\nconst props = defineProps<{ panel: SidebarPanelInfo; rail: boolean }>()\nconst badge = computed(() => sidebarBadge(props.panel.badge))\n</script>\n\n<template>\n <InkIcon v-if=\"panel.icon\" :icon=\"panel.icon\" />\n <span v-if=\"!panel.icon || !rail\" class=\"ink-sidebar-label\">{{ panel.label }}</span>\n <span class=\"ink-sidebar-badge\" aria-hidden=\"true\" :hidden=\"badge === null\">{{\n badge\n }}</span>\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAWA,IAAMY,IAAQC,GACRC,IAAQC,QAAeC,EAAaJ,EAAM,MAAM,KAAK,CAAC;;GAI3CC,EAAA,MAAM,QAArBb,EAAA,GAAAG,EAAgDC,GAAA;;IAApB,MAAMS,EAAA,MAAM;;GAC3B,CAAAA,EAAA,MAAM,QAAI,CAAKA,EAAA,QAA5Bb,EAAA,GAAAC,EAAoF,QAApFQ,GAAoFH,EAArBO,EAAA,MAAM,KAAK,GAAA,CAAA,KAAAQ,EAAA,IAAA,EAAA;GAC1Ed,EAES,QAAA;IAFH,OAAM;IAAoB,eAAY;IAAQ,QAAQO,EAAA,UAAK;GAC/D,GAAAR,EAAAQ,EAAA,KAAK,GAAA,GAAAJ,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { SidebarController, SidebarPanelInfo, SidebarState } from '@inkbar/core/dom';
2
+ import { Ref } from 'vue';
3
+ /** A panel as `InkPanel` registers it. */
4
+ export interface SidebarPanelEntry {
5
+ /** The panel's props; read inside a computed, so changes reach the sidebar. */
6
+ info(): SidebarPanelInfo;
7
+ /** The panel's element once mounted, to keep the panels in DOM order. */
8
+ element(): HTMLElement | null;
9
+ }
10
+ /** What `InkSidebar` gives its panels. */
11
+ export interface SidebarContext {
12
+ controller: SidebarController;
13
+ /** The controller's state: read it to re-render when the attributes change. */
14
+ state: Readonly<Ref<SidebarState>>;
15
+ /** Adds a panel at the end; returns the function that removes it. */
16
+ register(entry: SidebarPanelEntry): () => void;
17
+ /** Puts the registered panels in the order of their elements in the DOM. */
18
+ arrange(): void;
19
+ }
20
+ export declare const injectSidebarContext: <T extends SidebarContext | null | undefined = SidebarContext>(fallback?: T | undefined) => T extends null ? SidebarContext | null : SidebarContext, provideSidebarContext: (contextValue: SidebarContext) => SidebarContext;
21
+ //# sourceMappingURL=sidebar-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-context.d.ts","sourceRoot":"","sources":["../../src/components/sidebar-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACzF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAE9B,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,IAAI,IAAI,gBAAgB,CAAA;IACxB,yEAAyE;IACzE,OAAO,IAAI,WAAW,GAAG,IAAI,CAAA;CAC9B;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,iBAAiB,CAAA;IAC7B,+EAA+E;IAC/E,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAA;IAClC,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAAA;IAC9C,4EAA4E;IAC5E,OAAO,IAAI,IAAI,CAAA;CAChB;AAED,eAAO,MAAO,oBAAoB,uJAAE,qBAAqB,kDACZ,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { createContext as e } from "reka-ui";
2
+ //#region src/components/sidebar-context.ts
3
+ var [t, n] = e("InkSidebar");
4
+ //#endregion
5
+ export { t as injectSidebarContext, n as provideSidebarContext };
6
+
7
+ //# sourceMappingURL=sidebar-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-context.js","names":["injectSidebarContext","provideSidebarContext","createContext"],"sources":["../../src/components/sidebar-context.ts"],"sourcesContent":["import { createContext } from 'reka-ui'\n\nimport type { SidebarController, SidebarPanelInfo, SidebarState } from '@inkbar/core/dom'\nimport type { Ref } from 'vue'\n\n/** A panel as `InkPanel` registers it. */\nexport interface SidebarPanelEntry {\n /** The panel's props; read inside a computed, so changes reach the sidebar. */\n info(): SidebarPanelInfo\n /** The panel's element once mounted, to keep the panels in DOM order. */\n element(): HTMLElement | null\n}\n\n/** What `InkSidebar` gives its panels. */\nexport interface SidebarContext {\n controller: SidebarController\n /** The controller's state: read it to re-render when the attributes change. */\n state: Readonly<Ref<SidebarState>>\n /** Adds a panel at the end; returns the function that removes it. */\n register(entry: SidebarPanelEntry): () => void\n /** Puts the registered panels in the order of their elements in the DOM. */\n arrange(): void\n}\n\nexport const [injectSidebarContext, provideSidebarContext] =\n createContext<SidebarContext>('InkSidebar')\n"],"mappings":";;AAwBA,IAAa,CAACA,GAAsBC,KAClCC,EAA8B,YAAY"}