@pod-os/elements 0.30.2-rc.8724051.0 → 0.30.2-rc.94c5dad.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 (62) hide show
  1. package/dist/cjs/elements.cjs.js +1 -1
  2. package/dist/cjs/ion-icon_33.cjs.entry.js +1 -2
  3. package/dist/cjs/ion-icon_33.cjs.entry.js.map +1 -1
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/pos-document.cjs.entry.js +9 -6
  6. package/dist/cjs/pos-document.cjs.entry.js.map +1 -1
  7. package/dist/cjs/pos-markdown-document.cjs.entry.js +13481 -14042
  8. package/dist/cjs/pos-markdown-document.cjs.entry.js.map +1 -1
  9. package/dist/collection/components/pos-document/pos-document.js +10 -7
  10. package/dist/collection/components/pos-document/pos-document.js.map +1 -1
  11. package/dist/collection/components/pos-markdown-document/pos-markdown-document.css +17 -0
  12. package/dist/collection/components/pos-markdown-document/pos-markdown-document.js +33 -25
  13. package/dist/collection/components/pos-markdown-document/pos-markdown-document.js.map +1 -1
  14. package/dist/collection/components/pos-markdown-document/rich-editor/PosImageNode.js +25 -21
  15. package/dist/collection/components/pos-markdown-document/rich-editor/PosImageNode.js.map +1 -1
  16. package/dist/collection/components/pos-markdown-document/rich-editor/PosRichLinkMark.js +20 -16
  17. package/dist/collection/components/pos-markdown-document/rich-editor/PosRichLinkMark.js.map +1 -1
  18. package/dist/collection/components/pos-markdown-document/rich-editor/RichEditor.js +10 -24
  19. package/dist/collection/components/pos-markdown-document/rich-editor/RichEditor.js.map +1 -1
  20. package/dist/components/pos-app2.js +1 -2
  21. package/dist/components/pos-app2.js.map +1 -1
  22. package/dist/components/pos-document2.js +10 -7
  23. package/dist/components/pos-document2.js.map +1 -1
  24. package/dist/components/pos-markdown-document2.js +13483 -14044
  25. package/dist/components/pos-markdown-document2.js.map +1 -1
  26. package/dist/elements/elements.esm.js +1 -1
  27. package/dist/elements/elements.esm.js.map +1 -1
  28. package/dist/elements/p-08f92489.entry.js +2 -0
  29. package/dist/elements/p-08f92489.entry.js.map +1 -0
  30. package/dist/elements/p-4f8297e8.entry.js +2 -0
  31. package/dist/elements/p-4f8297e8.entry.js.map +1 -0
  32. package/dist/elements/{p-411c85a4.entry.js → p-c9ba983f.entry.js} +2 -2
  33. package/dist/elements/p-c9ba983f.entry.js.map +1 -0
  34. package/dist/esm/elements.js +1 -1
  35. package/dist/esm/ion-icon_33.entry.js +1 -2
  36. package/dist/esm/ion-icon_33.entry.js.map +1 -1
  37. package/dist/esm/loader.js +1 -1
  38. package/dist/esm/pos-document.entry.js +9 -6
  39. package/dist/esm/pos-document.entry.js.map +1 -1
  40. package/dist/esm/pos-markdown-document.entry.js +13481 -14042
  41. package/dist/esm/pos-markdown-document.entry.js.map +1 -1
  42. package/dist/types/components/pos-document/pos-document.d.ts +1 -1
  43. package/dist/types/components/pos-markdown-document/pos-markdown-document.d.ts +5 -5
  44. package/dist/types/components/pos-markdown-document/rich-editor/PosImageNode.d.ts +2 -0
  45. package/dist/types/components/pos-markdown-document/rich-editor/PosRichLinkMark.d.ts +2 -0
  46. package/dist/types/components/pos-markdown-document/rich-editor/RichEditor.d.ts +1 -9
  47. package/dist/types/components.d.ts +4 -4
  48. package/package.json +9 -11
  49. package/dist/collection/components/pos-markdown-document/html2markdown.js +0 -10
  50. package/dist/collection/components/pos-markdown-document/html2markdown.js.map +0 -1
  51. package/dist/collection/components/pos-markdown-document/markdown2html.js +0 -5
  52. package/dist/collection/components/pos-markdown-document/markdown2html.js.map +0 -1
  53. package/dist/collection/components/pos-markdown-document/sanitize.js +0 -10
  54. package/dist/collection/components/pos-markdown-document/sanitize.js.map +0 -1
  55. package/dist/elements/p-411c85a4.entry.js.map +0 -1
  56. package/dist/elements/p-581ed3ee.entry.js +0 -3
  57. package/dist/elements/p-581ed3ee.entry.js.map +0 -1
  58. package/dist/elements/p-ff3f95dc.entry.js +0 -2
  59. package/dist/elements/p-ff3f95dc.entry.js.map +0 -1
  60. package/dist/types/components/pos-markdown-document/html2markdown.d.ts +0 -1
  61. package/dist/types/components/pos-markdown-document/markdown2html.d.ts +0 -1
  62. package/dist/types/components/pos-markdown-document/sanitize.d.ts +0 -4
@@ -16,7 +16,7 @@ const PosDocument = /*@__PURE__*/ proxyCustomElement(class PosDocument extends H
16
16
  this.initializeOsEmitter = createEvent(this, "pod-os:init", 7);
17
17
  this.resourceLoadedEmitter = createEvent(this, "pod-os:resource-loaded", 7);
18
18
  this.errorEmitter = createEvent(this, "pod-os:error", 7);
19
- this.savingFailed = false;
19
+ this.saveStatus = 'idle';
20
20
  this.loading = true;
21
21
  this.isEditable = false;
22
22
  this.setOs = async (os) => {
@@ -30,16 +30,19 @@ const PosDocument = /*@__PURE__*/ proxyCustomElement(class PosDocument extends H
30
30
  async handleDocumentModified(event) {
31
31
  const { file, newContent } = event.detail;
32
32
  try {
33
- this.savingFailed = false;
33
+ this.saveStatus = 'saving';
34
34
  const response = await this.os.files().putFile(file, newContent);
35
- if (!response.ok) {
36
- this.savingFailed = true;
35
+ if (response.ok) {
36
+ this.saveStatus = 'idle';
37
+ }
38
+ else {
39
+ this.saveStatus = 'failed';
37
40
  const error = new Error(`Failed to save file: ${response.status} ${response.statusText}`);
38
41
  this.errorEmitter.emit(error);
39
42
  }
40
43
  }
41
44
  catch (error) {
42
- this.savingFailed = true;
45
+ this.saveStatus = 'failed';
43
46
  this.errorEmitter.emit(error);
44
47
  }
45
48
  }
@@ -76,7 +79,7 @@ const PosDocument = /*@__PURE__*/ proxyCustomElement(class PosDocument extends H
76
79
  return h(BrokenFile, { file: this.brokenFile });
77
80
  }
78
81
  if (this.file.blob().type === 'text/markdown') {
79
- return (h("pos-markdown-document", { editable: this.isEditable, savingFailed: this.savingFailed, file: this.file }));
82
+ return (h("pos-markdown-document", { editable: this.isEditable, saveStatus: this.saveStatus, file: this.file }));
80
83
  }
81
84
  else {
82
85
  return h("iframe", { src: URL.createObjectURL(this.file.blob()) });
@@ -94,7 +97,7 @@ const PosDocument = /*@__PURE__*/ proxyCustomElement(class PosDocument extends H
94
97
  "file": [32],
95
98
  "brokenFile": [32],
96
99
  "error": [32],
97
- "savingFailed": [32],
100
+ "saveStatus": [32],
98
101
  "loading": [32],
99
102
  "isEditable": [32]
100
103
  }, [[0, "pod-os:document-modified", "handleDocumentModified"]], {
@@ -1 +1 @@
1
- {"file":"pos-document2.js","mappings":"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","names":["session"],"sources":["src/components/pos-document/pos-document.css?tag=pos-document&encapsulation=shadow","src/components/pos-document/pos-document.tsx"],"sourcesContent":["iframe {\n background-color: var(--pos-background-color);\n width: 100%;\n height: 100vh;\n}\n\n/* consolidate with styles from pos-image */\n.error {\n display: flex;\n opacity: 0.8;\n background: repeating-linear-gradient(-45deg, rgba(150, 0, 0, 0.1), rgba(150, 0, 0, 0.1) 10px, #fff 5px, #fff 25px);\n flex-direction: column;\n border: 1px solid red;\n color: black;\n align-items: center;\n justify-content: center;\n word-break: break-all;\n padding: 1rem;\n box-sizing: border-box;\n}\n\n.error ion-icon {\n color: #282828;\n --ionicon-stroke-width: calc(var(--width) / 5);\n font-size: calc(var(--width) / 2);\n}\n\na {\n text-decoration: none;\n width: var(--width);\n height: var(--height);\n}\n\n.code {\n font-weight: bold;\n font-size: calc(var(--width) / 8);\n}\n\n.text {\n font-size: calc(var(--width) / 20);\n}\n","import { PodOS, BrokenFile as BrokenFileData, SolidFile } from '@pod-os/core';\nimport { Component, Event, EventEmitter, h, Listen, Prop, State, Watch } from '@stencil/core';\nimport session from '../../store/session';\nimport { BrokenFile } from '../broken-file/BrokenFile';\n\n@Component({\n tag: 'pos-document',\n styleUrl: 'pos-document.css',\n shadow: true,\n})\nexport class PosDocument {\n @Prop() src: string;\n\n @Prop() alt: string;\n\n @State() os: PodOS;\n\n @State()\n private file: SolidFile;\n\n @State()\n private brokenFile: BrokenFileData;\n\n @State()\n private error: Error;\n\n @State()\n private savingFailed = false;\n\n @State()\n private loading: boolean = true;\n\n @State()\n private isEditable: boolean = false;\n\n @Event({ eventName: 'pod-os:init' }) initializeOsEmitter: EventEmitter;\n\n /**\n * Indicates that the resource given in `src` property has been loaded.\n */\n @Event({ eventName: 'pod-os:resource-loaded' }) resourceLoadedEmitter: EventEmitter<string>;\n\n /**\n * Emitted when an error occurs during file operations.\n */\n @Event({ eventName: 'pod-os:error' }) errorEmitter: EventEmitter<Error>;\n\n componentWillLoad() {\n session.onChange('isLoggedIn', () => this.fetchBlob());\n this.initializeOsEmitter.emit(this.setOs);\n }\n\n setOs = async (os: PodOS) => {\n this.os = os;\n };\n\n @Listen('pod-os:document-modified')\n async handleDocumentModified(event: CustomEvent) {\n const { file, newContent } = event.detail;\n try {\n this.savingFailed = false;\n const response = await this.os.files().putFile(file, newContent);\n if (!response.ok) {\n this.savingFailed = true;\n const error = new Error(`Failed to save file: ${response.status} ${response.statusText}`);\n this.errorEmitter.emit(error);\n }\n } catch (error) {\n this.savingFailed = true;\n this.errorEmitter.emit(error);\n }\n }\n\n @Watch('os')\n @Watch('src')\n async fetchBlob() {\n try {\n this.loading = true;\n const file = await this.os.files().fetchFile(this.src);\n const thing = this.os.store.get(this.src);\n this.isEditable = thing?.editable;\n this.resourceLoadedEmitter.emit(this.src);\n if (file.blob()) {\n this.file = file;\n this.error = null;\n } else {\n this.brokenFile = file as BrokenFileData;\n }\n } catch (err) {\n this.error = err;\n } finally {\n this.loading = false;\n }\n }\n\n render() {\n if (this.loading) {\n return <ion-skeleton-text animated={true}></ion-skeleton-text>;\n }\n if (this.error) {\n return <div class=\"error\">{this.error.message}</div>;\n }\n if (this.brokenFile) {\n return <BrokenFile file={this.brokenFile} />;\n }\n if (this.file.blob().type === 'text/markdown') {\n return (\n <pos-markdown-document\n editable={this.isEditable}\n savingFailed={this.savingFailed}\n file={this.file}\n ></pos-markdown-document>\n );\n } else {\n return <iframe src={URL.createObjectURL(this.file.blob())}></iframe>;\n }\n }\n}\n"],"version":3}
1
+ {"file":"pos-document2.js","mappings":"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","names":["session"],"sources":["src/components/pos-document/pos-document.css?tag=pos-document&encapsulation=shadow","src/components/pos-document/pos-document.tsx"],"sourcesContent":["iframe {\n background-color: var(--pos-background-color);\n width: 100%;\n height: 100vh;\n}\n\n/* consolidate with styles from pos-image */\n.error {\n display: flex;\n opacity: 0.8;\n background: repeating-linear-gradient(-45deg, rgba(150, 0, 0, 0.1), rgba(150, 0, 0, 0.1) 10px, #fff 5px, #fff 25px);\n flex-direction: column;\n border: 1px solid red;\n color: black;\n align-items: center;\n justify-content: center;\n word-break: break-all;\n padding: 1rem;\n box-sizing: border-box;\n}\n\n.error ion-icon {\n color: #282828;\n --ionicon-stroke-width: calc(var(--width) / 5);\n font-size: calc(var(--width) / 2);\n}\n\na {\n text-decoration: none;\n width: var(--width);\n height: var(--height);\n}\n\n.code {\n font-weight: bold;\n font-size: calc(var(--width) / 8);\n}\n\n.text {\n font-size: calc(var(--width) / 20);\n}\n","import { PodOS, BrokenFile as BrokenFileData, SolidFile } from '@pod-os/core';\nimport { Component, Event, EventEmitter, h, Listen, Prop, State, Watch } from '@stencil/core';\nimport session from '../../store/session';\nimport { BrokenFile } from '../broken-file/BrokenFile';\n\n@Component({\n tag: 'pos-document',\n styleUrl: 'pos-document.css',\n shadow: true,\n})\nexport class PosDocument {\n @Prop() src: string;\n\n @Prop() alt: string;\n\n @State() os: PodOS;\n\n @State()\n private file: SolidFile;\n\n @State()\n private brokenFile: BrokenFileData;\n\n @State()\n private error: Error;\n\n @State()\n private saveStatus: 'idle' | 'saving' | 'failed' = 'idle';\n\n @State()\n private loading: boolean = true;\n\n @State()\n private isEditable: boolean = false;\n\n @Event({ eventName: 'pod-os:init' }) initializeOsEmitter: EventEmitter;\n\n /**\n * Indicates that the resource given in `src` property has been loaded.\n */\n @Event({ eventName: 'pod-os:resource-loaded' }) resourceLoadedEmitter: EventEmitter<string>;\n\n /**\n * Emitted when an error occurs during file operations.\n */\n @Event({ eventName: 'pod-os:error' }) errorEmitter: EventEmitter<Error>;\n\n componentWillLoad() {\n session.onChange('isLoggedIn', () => this.fetchBlob());\n this.initializeOsEmitter.emit(this.setOs);\n }\n\n setOs = async (os: PodOS) => {\n this.os = os;\n };\n\n @Listen('pod-os:document-modified')\n async handleDocumentModified(event: CustomEvent) {\n const { file, newContent } = event.detail;\n try {\n this.saveStatus = 'saving';\n const response = await this.os.files().putFile(file, newContent);\n if (response.ok) {\n this.saveStatus = 'idle';\n } else {\n this.saveStatus = 'failed';\n const error = new Error(`Failed to save file: ${response.status} ${response.statusText}`);\n this.errorEmitter.emit(error);\n }\n } catch (error) {\n this.saveStatus = 'failed';\n this.errorEmitter.emit(error);\n }\n }\n\n @Watch('os')\n @Watch('src')\n async fetchBlob() {\n try {\n this.loading = true;\n const file = await this.os.files().fetchFile(this.src);\n const thing = this.os.store.get(this.src);\n this.isEditable = thing?.editable;\n this.resourceLoadedEmitter.emit(this.src);\n if (file.blob()) {\n this.file = file;\n this.error = null;\n } else {\n this.brokenFile = file as BrokenFileData;\n }\n } catch (err) {\n this.error = err;\n } finally {\n this.loading = false;\n }\n }\n\n render() {\n if (this.loading) {\n return <ion-skeleton-text animated={true}></ion-skeleton-text>;\n }\n if (this.error) {\n return <div class=\"error\">{this.error.message}</div>;\n }\n if (this.brokenFile) {\n return <BrokenFile file={this.brokenFile} />;\n }\n if (this.file.blob().type === 'text/markdown') {\n return (\n <pos-markdown-document\n editable={this.isEditable}\n saveStatus={this.saveStatus}\n file={this.file}\n ></pos-markdown-document>\n );\n } else {\n return <iframe src={URL.createObjectURL(this.file.blob())}></iframe>;\n }\n }\n}\n"],"version":3}