@docsector/docsector-reader 3.5.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +11 -11
  2. package/bin/docsector.js +1 -283
  3. package/package.json +1 -1
  4. package/public/images/cards/getting-started-cover.svg +60 -0
  5. package/public/images/cards/quick-links-cover.svg +71 -0
  6. package/src/components/{DPageBlockquote.vue → DBlockBlockquote.vue} +4 -0
  7. package/src/components/DBlockCards.vue +223 -0
  8. package/src/components/{DPageEmbeddedUrl.vue → DBlockEmbeddedUrl.vue} +1 -1
  9. package/src/components/{DPageExpandable.vue → DBlockExpandable.vue} +4 -0
  10. package/src/components/{DPageFile.vue → DBlockFile.vue} +1 -1
  11. package/src/components/{DPageImage.vue → DBlockImage.vue} +1 -1
  12. package/src/components/{DMermaidDiagram.vue → DBlockMermaidDiagram.vue} +4 -0
  13. package/src/components/{DQuickLinks.vue → DBlockQuickLinks.vue} +4 -0
  14. package/src/components/{DPageSourceCode.vue → DBlockSourceCode.vue} +6 -1
  15. package/src/components/DBlockStepper.vue +210 -0
  16. package/src/components/DBlockTimeline.vue +319 -0
  17. package/src/components/DPageTokens.vue +51 -18
  18. package/src/components/page-section-tokens.js +334 -9
  19. package/src/i18n/languages/en-US.hjson +5 -0
  20. package/src/i18n/languages/pt-BR.hjson +5 -0
  21. package/src/pages/guide/i18n-and-markdown.overview.en-US.md +6 -6
  22. package/src/pages/guide/i18n-and-markdown.overview.pt-BR.md +6 -6
  23. package/src/pages/guide/theming.overview.en-US.md +1 -1
  24. package/src/pages/guide/theming.overview.pt-BR.md +1 -1
  25. package/src/pages/manual/content/blocks/cards.overview.en-US.md +32 -0
  26. package/src/pages/manual/content/blocks/cards.overview.pt-BR.md +32 -0
  27. package/src/pages/manual/content/blocks/cards.showcase.en-US.md +39 -0
  28. package/src/pages/manual/content/blocks/cards.showcase.pt-BR.md +39 -0
  29. package/src/pages/manual/content/blocks/embedded-urls.overview.en-US.md +3 -3
  30. package/src/pages/manual/content/blocks/embedded-urls.overview.pt-BR.md +3 -3
  31. package/src/pages/manual/content/blocks/embedded-urls.showcase.en-US.md +8 -8
  32. package/src/pages/manual/content/blocks/embedded-urls.showcase.pt-BR.md +8 -8
  33. package/src/pages/manual/content/blocks/expandable.overview.en-US.md +8 -8
  34. package/src/pages/manual/content/blocks/expandable.overview.pt-BR.md +8 -8
  35. package/src/pages/manual/content/blocks/expandable.showcase.en-US.md +6 -6
  36. package/src/pages/manual/content/blocks/expandable.showcase.pt-BR.md +6 -6
  37. package/src/pages/manual/content/blocks/files.overview.en-US.md +3 -3
  38. package/src/pages/manual/content/blocks/files.overview.pt-BR.md +3 -3
  39. package/src/pages/manual/content/blocks/files.showcase.en-US.md +5 -5
  40. package/src/pages/manual/content/blocks/files.showcase.pt-BR.md +5 -5
  41. package/src/pages/manual/content/blocks/quick-links.overview.en-US.md +4 -4
  42. package/src/pages/manual/content/blocks/quick-links.overview.pt-BR.md +4 -4
  43. package/src/pages/manual/content/blocks/quick-links.showcase.en-US.md +9 -9
  44. package/src/pages/manual/content/blocks/quick-links.showcase.pt-BR.md +9 -9
  45. package/src/pages/manual/content/blocks/stepper.overview.en-US.md +59 -0
  46. package/src/pages/manual/content/blocks/stepper.overview.pt-BR.md +59 -0
  47. package/src/pages/manual/content/blocks/stepper.showcase.en-US.md +115 -0
  48. package/src/pages/manual/content/blocks/stepper.showcase.pt-BR.md +115 -0
  49. package/src/pages/manual/content/blocks/timeline.overview.en-US.md +47 -0
  50. package/src/pages/manual/content/blocks/timeline.overview.pt-BR.md +47 -0
  51. package/src/pages/manual/content/blocks/timeline.showcase.en-US.md +170 -0
  52. package/src/pages/manual/content/blocks/timeline.showcase.pt-BR.md +170 -0
  53. package/src/pages/manual.index.js +84 -0
@@ -0,0 +1,223 @@
1
+ <script setup>
2
+ const BASE_URL = import.meta.env.BASE_URL || '/'
3
+
4
+ defineOptions({
5
+ name: 'DBlockCards'
6
+ })
7
+
8
+ const props = defineProps({
9
+ items: {
10
+ type: Array,
11
+ default: () => []
12
+ },
13
+ title: {
14
+ type: String,
15
+ default: ''
16
+ }
17
+ })
18
+
19
+ const isExternal = (item) => {
20
+ const href = item?.href || ''
21
+ return /^https?:\/\//i.test(href)
22
+ }
23
+
24
+ const itemTag = (item) => {
25
+ if (item?.to) return 'router-link'
26
+ return 'a'
27
+ }
28
+
29
+ const itemProps = (item) => {
30
+ if (item?.to) {
31
+ return {
32
+ to: item.to
33
+ }
34
+ }
35
+
36
+ const href = item?.href || ''
37
+ return {
38
+ href,
39
+ target: isExternal(item) ? '_blank' : undefined,
40
+ rel: isExternal(item) ? 'noopener noreferrer' : undefined
41
+ }
42
+ }
43
+
44
+ const resolveAssetUrl = (raw = '') => {
45
+ const value = String(raw || '').trim()
46
+
47
+ if (!value) {
48
+ return ''
49
+ }
50
+
51
+ if (/^(?:[a-z]+:)?\/\//i.test(value) || /^(?:data:|blob:)/i.test(value)) {
52
+ return value
53
+ }
54
+
55
+ const trimmedBase = String(BASE_URL).replace(/\/$/, '')
56
+
57
+ if (value.startsWith('/')) {
58
+ return `${trimmedBase}${value}` || value
59
+ }
60
+
61
+ const normalized = value.replace(/^\.\//, '')
62
+ return `${trimmedBase}/${normalized}`.replace(/\/+/g, '/')
63
+ }
64
+ </script>
65
+
66
+ <template>
67
+ <div class="d-cards">
68
+ <h3 v-if="title" class="d-cards__title">{{ title }}</h3>
69
+
70
+ <div class="d-cards__grid">
71
+ <component
72
+ :is="itemTag(item)"
73
+ v-for="(item, index) in props.items"
74
+ :key="`${item.title}-${index}`"
75
+ class="d-cards__link"
76
+ v-bind="itemProps(item)"
77
+ >
78
+ <q-card flat bordered class="d-cards__card">
79
+ <q-img
80
+ v-if="item.image"
81
+ :src="resolveAssetUrl(item.image)"
82
+ :alt="item.title"
83
+ ratio="1.7778"
84
+ class="d-cards__image"
85
+ />
86
+
87
+ <q-card-section v-else-if="item.icon" class="d-cards__icon-section">
88
+ <div class="d-cards__icon-surface">
89
+ <q-icon :name="item.icon" size="56px" color="primary" />
90
+ </div>
91
+ </q-card-section>
92
+
93
+ <q-card-section class="d-cards__body">
94
+ <div class="d-cards__heading-row">
95
+ <div class="d-cards__heading-group">
96
+ <q-icon
97
+ v-if="item.image && item.icon"
98
+ :name="item.icon"
99
+ size="18px"
100
+ color="primary"
101
+ />
102
+ <div class="d-cards__label">{{ item.title }}</div>
103
+ </div>
104
+
105
+ <q-icon :name="isExternal(item) ? 'arrow_outward' : 'arrow_forward'" size="18px" />
106
+ </div>
107
+
108
+ <div class="d-cards__description">{{ item.description }}</div>
109
+ </q-card-section>
110
+ </q-card>
111
+ </component>
112
+ </div>
113
+ </div>
114
+ </template>
115
+
116
+ <style lang="sass">
117
+ body.body--light
118
+ --d-cards-card-bg: #fffdf8
119
+ --d-cards-card-border: rgba(123, 94, 45, 0.16)
120
+ --d-cards-card-shadow: rgba(94, 73, 37, 0.08)
121
+ --d-cards-card-shadow-hover: rgba(94, 73, 37, 0.16)
122
+ --d-cards-description: #4d5563
123
+ --d-cards-icon-surface: linear-gradient(180deg, rgba(210, 190, 145, 0.22), rgba(210, 190, 145, 0.08))
124
+
125
+ body.body--dark
126
+ --d-cards-card-bg: rgba(255, 248, 235, 0.035)
127
+ --d-cards-card-border: rgba(255, 235, 194, 0.12)
128
+ --d-cards-card-shadow: rgba(0, 0, 0, 0.25)
129
+ --d-cards-card-shadow-hover: rgba(0, 0, 0, 0.38)
130
+ --d-cards-description: rgba(255, 255, 255, 0.82)
131
+ --d-cards-icon-surface: linear-gradient(180deg, rgba(193, 166, 103, 0.18), rgba(193, 166, 103, 0.05))
132
+
133
+ .d-cards
134
+ margin: 0 auto
135
+
136
+ .d-cards__title
137
+ text-align: center
138
+ margin: 0 0 16px
139
+
140
+ .d-cards__grid
141
+ display: grid
142
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr))
143
+ gap: 16px
144
+
145
+ .d-cards__link
146
+ display: block
147
+ color: inherit
148
+ text-decoration: none
149
+ border-bottom: 0 !important
150
+ background: transparent !important
151
+
152
+ .d-cards__link:hover,
153
+ .d-cards__link:focus-visible,
154
+ .d-cards__link:active,
155
+ .d-cards__link:visited
156
+ color: inherit !important
157
+ text-decoration: none
158
+ border-bottom: 0 !important
159
+ background: transparent !important
160
+
161
+ .d-cards__card
162
+ height: 100%
163
+ overflow: hidden
164
+ border-radius: 18px
165
+ background: var(--d-cards-card-bg)
166
+ border-color: var(--d-cards-card-border)
167
+ box-shadow: 0 12px 28px var(--d-cards-card-shadow)
168
+ transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease
169
+
170
+ .d-cards__link:hover .d-cards__card,
171
+ .d-cards__link:focus-visible .d-cards__card
172
+ transform: translateY(-2px)
173
+ box-shadow: 0 18px 36px var(--d-cards-card-shadow-hover)
174
+
175
+ .d-cards__link:focus-visible
176
+ outline: none
177
+
178
+ .d-cards__image
179
+ background: rgba(0, 0, 0, 0.05)
180
+
181
+ .d-cards__icon-section
182
+ display: flex
183
+ padding-bottom: 0
184
+
185
+ .d-cards__icon-surface
186
+ display: flex
187
+ align-items: center
188
+ justify-content: center
189
+ width: 100%
190
+ min-height: 156px
191
+ border-radius: 14px
192
+ background: var(--d-cards-icon-surface)
193
+
194
+ .d-cards__body
195
+ display: grid
196
+ gap: 10px
197
+
198
+ .d-cards__heading-row
199
+ display: flex
200
+ align-items: flex-start
201
+ justify-content: space-between
202
+ gap: 12px
203
+
204
+ .d-cards__heading-group
205
+ display: flex
206
+ align-items: center
207
+ gap: 8px
208
+ min-width: 0
209
+
210
+ .d-cards__label
211
+ font-size: 1rem
212
+ font-weight: 700
213
+ line-height: 1.35
214
+
215
+ .d-cards__description
216
+ color: var(--d-cards-description)
217
+ font-size: 0.97rem
218
+ line-height: 1.55
219
+
220
+ @media (max-width: 599px)
221
+ .d-cards__grid
222
+ grid-template-columns: 1fr
223
+ </style>
@@ -5,7 +5,7 @@ import { useI18n } from 'vue-i18n'
5
5
  import { resolveEmbeddedUrl } from '../composables/useEmbeddedUrl'
6
6
 
7
7
  defineOptions({
8
- name: 'DPageEmbeddedUrl'
8
+ name: 'DBlockEmbeddedUrl'
9
9
  })
10
10
 
11
11
  const props = defineProps({
@@ -1,4 +1,8 @@
1
1
  <script setup>
2
+ defineOptions({
3
+ name: 'DBlockExpandable'
4
+ })
5
+
2
6
  defineProps({
3
7
  title: {
4
8
  type: String,
@@ -8,7 +8,7 @@ import { resolveFileIconUrl } from '../composables/useFileIcon'
8
8
  const BASE_URL = import.meta.env.BASE_URL || '/'
9
9
 
10
10
  defineOptions({
11
- name: 'DPageFile'
11
+ name: 'DBlockFile'
12
12
  })
13
13
 
14
14
  const props = defineProps({
@@ -2,7 +2,7 @@
2
2
  import { computed } from 'vue'
3
3
 
4
4
  defineOptions({
5
- name: 'DPageImage'
5
+ name: 'DBlockImage'
6
6
  })
7
7
 
8
8
  const props = defineProps({
@@ -2,6 +2,10 @@
2
2
  import { ref, onMounted, watch } from 'vue'
3
3
  import { useQuasar } from 'quasar'
4
4
 
5
+ defineOptions({
6
+ name: 'DBlockMermaidDiagram'
7
+ })
8
+
5
9
  const props = defineProps({
6
10
  content: {
7
11
  type: String,
@@ -1,4 +1,8 @@
1
1
  <script setup>
2
+ defineOptions({
3
+ name: 'DBlockQuickLinks'
4
+ })
5
+
2
6
  const props = defineProps({
3
7
  items: {
4
8
  type: Array,
@@ -11,6 +11,10 @@ import 'prismjs/components/prism-php'
11
11
  import 'prismjs/components/prism-bash'
12
12
  import { looksLikeFileName, resolveFileIconUrl } from '../composables/useFileIcon'
13
13
 
14
+ defineOptions({
15
+ name: 'DBlockSourceCode'
16
+ })
17
+
14
18
  const props = defineProps({
15
19
  index: {
16
20
  type: Number,
@@ -504,11 +508,12 @@ function printToLetter(number) {
504
508
  padding: 0
505
509
 
506
510
  .lines
507
- padding: 11px 5px 8px 5px
511
+ padding: 10px 5px 10px 5px
508
512
  text-align: right
509
513
  float: left
510
514
  -webkit-user-select: none
511
515
  user-select: none
516
+ line-height: 19px
512
517
 
513
518
  a
514
519
  display: block
@@ -0,0 +1,210 @@
1
+ <script setup>
2
+ import { computed, ref, watch } from 'vue'
3
+ import { useI18n } from 'vue-i18n'
4
+
5
+ defineOptions({
6
+ name: 'DBlockStepper'
7
+ })
8
+
9
+ const props = defineProps({
10
+ steps: {
11
+ type: Array,
12
+ default: () => []
13
+ }
14
+ })
15
+
16
+ const { t } = useI18n()
17
+ const currentStep = ref(1)
18
+ const isFinished = ref(false)
19
+ const stepCount = computed(() => props.steps.length)
20
+
21
+ watch(stepCount, (count) => {
22
+ if (count < 1) {
23
+ currentStep.value = 1
24
+ isFinished.value = false
25
+ return
26
+ }
27
+
28
+ if (currentStep.value > count) {
29
+ currentStep.value = count
30
+ }
31
+ }, { immediate: true })
32
+
33
+ const isLastStep = (index) => index === props.steps.length - 1
34
+ const hasDefaultIcon = (step) => typeof step?.icon === 'string' && step.icon !== '' && step.icon !== 'none'
35
+ const stepPrefix = (step, index) => hasDefaultIcon(step) ? void 0 : String(index + 1)
36
+ const isStepDone = (index) => isFinished.value || currentStep.value > index + 1
37
+
38
+ const goToStep = (stepNumber) => {
39
+ if (stepNumber < 1 || stepNumber > props.steps.length) {
40
+ return
41
+ }
42
+
43
+ isFinished.value = false
44
+ currentStep.value = stepNumber
45
+ }
46
+
47
+ const finishStepper = () => {
48
+ isFinished.value = true
49
+ currentStep.value = null
50
+ }
51
+ </script>
52
+
53
+ <template>
54
+ <div v-if="steps.length" class="d-stepper">
55
+ <q-stepper
56
+ v-model="currentStep"
57
+ vertical
58
+ animated
59
+ flat
60
+ bordered
61
+ header-nav
62
+ color="primary"
63
+ active-color="primary"
64
+ done-color="positive"
65
+ inactive-color="grey-6"
66
+ class="d-stepper__shell"
67
+ >
68
+ <q-step
69
+ v-for="(step, index) in steps"
70
+ :key="`${step.title}-${index}`"
71
+ :name="index + 1"
72
+ :title="step.title"
73
+ :prefix="stepPrefix(step, index)"
74
+ :icon="step.icon || void 0"
75
+ :active-icon="step.activeIcon || step.icon || void 0"
76
+ :done-icon="step.doneIcon || step.icon || void 0"
77
+ :error-icon="step.errorIcon || step.icon || void 0"
78
+ :done="isStepDone(index)"
79
+ header-class="d-stepper__step-header"
80
+ class="d-stepper__step"
81
+ >
82
+ <div class="d-stepper__body">
83
+ <slot :step="step" :index="index" />
84
+ </div>
85
+
86
+ <q-stepper-navigation class="d-stepper__navigation">
87
+ <q-btn
88
+ v-if="!isLastStep(index)"
89
+ color="primary"
90
+ no-caps
91
+ unelevated
92
+ :label="t('page.stepper.continue')"
93
+ @click="goToStep(index + 2)"
94
+ />
95
+
96
+ <q-btn
97
+ v-else
98
+ color="positive"
99
+ no-caps
100
+ unelevated
101
+ :label="t('page.stepper.finish')"
102
+ @click="finishStepper"
103
+ />
104
+
105
+ <q-btn
106
+ v-if="index > 0"
107
+ unelevated
108
+ no-caps
109
+ class="d-stepper__back d-stepper__secondary-action"
110
+ :label="t('page.stepper.back')"
111
+ @click="goToStep(index)"
112
+ />
113
+ </q-stepper-navigation>
114
+ </q-step>
115
+ </q-stepper>
116
+ </div>
117
+ </template>
118
+
119
+ <style lang="sass">
120
+ body.body--light
121
+ --d-stepper-shell-bg: #fffdfa
122
+ --d-stepper-shell-border: rgba(123, 94, 45, 0.16)
123
+ --d-stepper-shell-shadow: rgba(94, 73, 37, 0.08)
124
+ --d-stepper-header-bg: rgba(255, 242, 212, 0.32)
125
+ --d-stepper-divider: rgba(123, 94, 45, 0.14)
126
+ --d-stepper-text-muted: #5f6772
127
+ --d-stepper-secondary-bg: rgba(123, 94, 45, 0.12)
128
+ --d-stepper-secondary-bg-hover: rgba(123, 94, 45, 0.18)
129
+ --d-stepper-secondary-text: #705420
130
+
131
+ body.body--dark
132
+ --d-stepper-shell-bg: rgba(255, 248, 235, 0.04)
133
+ --d-stepper-shell-border: rgba(255, 235, 194, 0.12)
134
+ --d-stepper-shell-shadow: rgba(0, 0, 0, 0.28)
135
+ --d-stepper-header-bg: rgba(255, 240, 210, 0.04)
136
+ --d-stepper-divider: rgba(255, 235, 194, 0.08)
137
+ --d-stepper-text-muted: rgba(255, 255, 255, 0.72)
138
+ --d-stepper-secondary-bg: rgba(255, 235, 194, 0.1)
139
+ --d-stepper-secondary-bg-hover: rgba(255, 235, 194, 0.16)
140
+ --d-stepper-secondary-text: #f4ddb0
141
+
142
+ .d-stepper
143
+ margin: 1.5rem 0
144
+
145
+ .d-stepper__shell
146
+ border-radius: 20px
147
+ overflow: hidden
148
+ background: var(--d-stepper-shell-bg)
149
+ border-color: var(--d-stepper-shell-border)
150
+ box-shadow: 0 16px 36px var(--d-stepper-shell-shadow)
151
+
152
+ .d-stepper__shell.q-stepper--vertical
153
+ .q-stepper__header
154
+ background: var(--d-stepper-header-bg)
155
+
156
+ .q-stepper__tab
157
+ min-height: 72px
158
+
159
+ .q-stepper__step-inner
160
+ border-top: 1px solid var(--d-stepper-divider)
161
+
162
+ .q-stepper__title
163
+ font-size: 1rem
164
+ font-weight: 700
165
+ line-height: 1.45
166
+
167
+ .q-stepper__caption
168
+ color: var(--d-stepper-text-muted)
169
+
170
+ .d-stepper__step-header
171
+ font-weight: 700
172
+
173
+ .d-stepper__body
174
+ min-width: 0
175
+ padding-top: 0.85rem
176
+
177
+ > :first-child
178
+ margin-top: 0
179
+
180
+ > :last-child
181
+ margin-bottom: 0
182
+
183
+ .d-stepper__navigation
184
+ display: flex
185
+ flex-wrap: wrap
186
+ gap: 0.75rem
187
+ margin-top: 1rem
188
+
189
+ .d-stepper__back
190
+ margin-left: 0 !important
191
+
192
+ .d-stepper__secondary-action
193
+ background: var(--d-stepper-secondary-bg) !important
194
+ color: var(--d-stepper-secondary-text) !important
195
+
196
+ &:hover,
197
+ &:focus-visible
198
+ background: var(--d-stepper-secondary-bg-hover) !important
199
+
200
+ @media (max-width: 599px)
201
+ .d-stepper__shell.q-stepper--vertical
202
+ .q-stepper__tab
203
+ min-height: 64px
204
+
205
+ .q-stepper__title
206
+ font-size: 0.97rem
207
+
208
+ .d-stepper__navigation
209
+ gap: 0.55rem
210
+ </style>