databricksedu 0.2.0__tar.gz → 0.2.1__tar.gz

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 (300) hide show
  1. {databricksedu-0.2.0 → databricksedu-0.2.1}/PKG-INFO +1 -1
  2. databricksedu-0.2.1/src/databricksedu/_version.py +1 -0
  3. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/assets/app.css +1 -1
  4. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/assets/app.js +32 -13
  5. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/workspace.py +20 -5
  6. {databricksedu-0.2.0 → databricksedu-0.2.1}/tools/assets/app.css +4 -0
  7. {databricksedu-0.2.0 → databricksedu-0.2.1}/tools/assets/app.js +32 -13
  8. databricksedu-0.2.0/src/databricksedu/_version.py +0 -1
  9. {databricksedu-0.2.0 → databricksedu-0.2.1}/.gitignore +0 -0
  10. {databricksedu-0.2.0 → databricksedu-0.2.1}/CONTENT_GUIDE.md +0 -0
  11. {databricksedu-0.2.0 → databricksedu-0.2.1}/LICENSE +0 -0
  12. {databricksedu-0.2.0 → databricksedu-0.2.1}/README.md +0 -0
  13. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/analytics/010-sql-warehouses/module.md +0 -0
  14. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/analytics/010-sql-warehouses/quiz.json +0 -0
  15. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/analytics/020-ai-bi-dashboards/module.md +0 -0
  16. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/analytics/020-ai-bi-dashboards/quiz.json +0 -0
  17. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/analytics/030-genie-spaces/module.md +0 -0
  18. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/analytics/030-genie-spaces/quiz.json +0 -0
  19. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/analytics/040-metric-views/module.md +0 -0
  20. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/analytics/040-metric-views/quiz.json +0 -0
  21. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/categories.json +0 -0
  22. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/010-lakehouse-architecture/module.md +0 -0
  23. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/010-lakehouse-architecture/quiz.json +0 -0
  24. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/020-parquet-files/module.md +0 -0
  25. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/020-parquet-files/quiz.json +0 -0
  26. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/030-medallion-architecture/module.md +0 -0
  27. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/030-medallion-architecture/quiz.json +0 -0
  28. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/040-unity-catalog-basics/module.md +0 -0
  29. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/040-unity-catalog-basics/quiz.json +0 -0
  30. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/050-delta-table-anatomy/module.md +0 -0
  31. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/050-delta-table-anatomy/quiz.json +0 -0
  32. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/060-delta-transaction-log/module.md +0 -0
  33. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/060-delta-transaction-log/quiz.json +0 -0
  34. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/070-delta-acid-concurrency/module.md +0 -0
  35. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/070-delta-acid-concurrency/quiz.json +0 -0
  36. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/080-delta-time-travel-vacuum/module.md +0 -0
  37. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/080-delta-time-travel-vacuum/quiz.json +0 -0
  38. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/090-deletion-vectors/module.md +0 -0
  39. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/090-deletion-vectors/quiz.json +0 -0
  40. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/100-delta-dml-merge/module.md +0 -0
  41. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/100-delta-dml-merge/quiz.json +0 -0
  42. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/110-schema-enforcement-evolution/module.md +0 -0
  43. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/110-schema-enforcement-evolution/quiz.json +0 -0
  44. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/120-change-data-feed/module.md +0 -0
  45. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/120-change-data-feed/quiz.json +0 -0
  46. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/130-delta-optimization/module.md +0 -0
  47. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/130-delta-optimization/quiz.json +0 -0
  48. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/140-spark-architecture/module.md +0 -0
  49. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/140-spark-architecture/quiz.json +0 -0
  50. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/150-spark-joins-shuffles/module.md +0 -0
  51. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/150-spark-joins-shuffles/quiz.json +0 -0
  52. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/160-auto-loader-copy-into/module.md +0 -0
  53. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/160-auto-loader-copy-into/quiz.json +0 -0
  54. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/170-structured-streaming-basics/module.md +0 -0
  55. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/170-structured-streaming-basics/quiz.json +0 -0
  56. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/180-watermarks-stateful-streaming/module.md +0 -0
  57. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/180-watermarks-stateful-streaming/quiz.json +0 -0
  58. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/190-declarative-pipelines/module.md +0 -0
  59. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/190-declarative-pipelines/quiz.json +0 -0
  60. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/200-data-quality-expectations/module.md +0 -0
  61. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/200-data-quality-expectations/quiz.json +0 -0
  62. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/210-cdc-scd/module.md +0 -0
  63. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/210-cdc-scd/quiz.json +0 -0
  64. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/220-lakeflow-jobs/module.md +0 -0
  65. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/220-lakeflow-jobs/quiz.json +0 -0
  66. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/230-asset-bundles-cicd/module.md +0 -0
  67. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/data-engineering/230-asset-bundles-cicd/quiz.json +0 -0
  68. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/demo-data/010-retail-data/module.md +0 -0
  69. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/demo-data/020-iot-data/module.md +0 -0
  70. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/demo-data/030-churn-data/module.md +0 -0
  71. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/demo-data/040-support-data/module.md +0 -0
  72. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/demo-data/050-hr-data/module.md +0 -0
  73. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/demo-data/060-cdc-data/module.md +0 -0
  74. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/010-exam-data-engineer-associate/module.md +0 -0
  75. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/010-exam-data-engineer-associate/quiz.json +0 -0
  76. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/020-exam-data-engineer-professional/module.md +0 -0
  77. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/020-exam-data-engineer-professional/quiz.json +0 -0
  78. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/030-exam-data-analyst-associate/module.md +0 -0
  79. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/030-exam-data-analyst-associate/quiz.json +0 -0
  80. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/040-exam-ml-associate/module.md +0 -0
  81. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/040-exam-ml-associate/quiz.json +0 -0
  82. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/050-exam-ml-professional/module.md +0 -0
  83. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/050-exam-ml-professional/quiz.json +0 -0
  84. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/060-exam-genai-engineer-associate/module.md +0 -0
  85. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/060-exam-genai-engineer-associate/quiz.json +0 -0
  86. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/070-exam-spark-developer-associate/module.md +0 -0
  87. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/exam-prep/070-exam-spark-developer-associate/quiz.json +0 -0
  88. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/010-llm-basics/module.md +0 -0
  89. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/010-llm-basics/quiz.json +0 -0
  90. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/020-prompt-engineering/module.md +0 -0
  91. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/020-prompt-engineering/quiz.json +0 -0
  92. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/030-embeddings-vector-search/module.md +0 -0
  93. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/030-embeddings-vector-search/quiz.json +0 -0
  94. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/040-chunking-parsing/module.md +0 -0
  95. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/040-chunking-parsing/quiz.json +0 -0
  96. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/050-rag-architecture/module.md +0 -0
  97. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/050-rag-architecture/quiz.json +0 -0
  98. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/060-agents-tools/module.md +0 -0
  99. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/060-agents-tools/quiz.json +0 -0
  100. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/070-genai-evaluation/module.md +0 -0
  101. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/070-genai-evaluation/quiz.json +0 -0
  102. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/080-ai-functions-gateway/module.md +0 -0
  103. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/generative-ai/080-ai-functions-gateway/quiz.json +0 -0
  104. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/governance/010-uc-privileges/module.md +0 -0
  105. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/governance/010-uc-privileges/quiz.json +0 -0
  106. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/governance/020-row-filters-column-masks/module.md +0 -0
  107. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/governance/020-row-filters-column-masks/quiz.json +0 -0
  108. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/governance/030-delta-sharing/module.md +0 -0
  109. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/governance/030-delta-sharing/quiz.json +0 -0
  110. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/governance/040-lineage-system-tables/module.md +0 -0
  111. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/governance/040-lineage-system-tables/quiz.json +0 -0
  112. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/010-ml-lifecycle/module.md +0 -0
  113. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/010-ml-lifecycle/quiz.json +0 -0
  114. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/020-mlflow-tracking/module.md +0 -0
  115. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/020-mlflow-tracking/quiz.json +0 -0
  116. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/030-feature-engineering/module.md +0 -0
  117. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/030-feature-engineering/quiz.json +0 -0
  118. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/040-hyperparameter-tuning/module.md +0 -0
  119. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/040-hyperparameter-tuning/quiz.json +0 -0
  120. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/050-models-in-unity-catalog/module.md +0 -0
  121. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/050-models-in-unity-catalog/quiz.json +0 -0
  122. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/060-model-serving/module.md +0 -0
  123. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/060-model-serving/quiz.json +0 -0
  124. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/070-model-monitoring/module.md +0 -0
  125. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/machine-learning/070-model-monitoring/quiz.json +0 -0
  126. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/010-lakeflow-connect-recap/module.md +0 -0
  127. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/010-lakeflow-connect-recap/quiz.json +0 -0
  128. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/020-lakeflow-jobs-recap/module.md +0 -0
  129. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/020-lakeflow-jobs-recap/quiz.json +0 -0
  130. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/030-declarative-pipelines-recap/module.md +0 -0
  131. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/030-declarative-pipelines-recap/quiz.json +0 -0
  132. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/040-devops-essentials-recap/module.md +0 -0
  133. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/040-devops-essentials-recap/quiz.json +0 -0
  134. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/050-streaming-pipelines-recap/module.md +0 -0
  135. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/050-streaming-pipelines-recap/quiz.json +0 -0
  136. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/060-data-privacy-recap/module.md +0 -0
  137. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/060-data-privacy-recap/quiz.json +0 -0
  138. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/070-performance-optimization-recap/module.md +0 -0
  139. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/070-performance-optimization-recap/quiz.json +0 -0
  140. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/080-asset-bundles-recap/module.md +0 -0
  141. {databricksedu-0.2.0 → databricksedu-0.2.1}/content/recaps/080-asset-bundles-recap/quiz.json +0 -0
  142. {databricksedu-0.2.0 → databricksedu-0.2.1}/hatch_build.py +0 -0
  143. {databricksedu-0.2.0 → databricksedu-0.2.1}/pyproject.toml +0 -0
  144. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/__init__.py +0 -0
  145. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/catalog.json +0 -0
  146. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/agents-tools.json.gz +0 -0
  147. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/ai-bi-dashboards.json.gz +0 -0
  148. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/ai-functions-gateway.json.gz +0 -0
  149. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/asset-bundles-cicd.json.gz +0 -0
  150. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/asset-bundles-recap.json.gz +0 -0
  151. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/auto-loader-copy-into.json.gz +0 -0
  152. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/cdc-data.json.gz +0 -0
  153. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/cdc-scd.json.gz +0 -0
  154. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/change-data-feed.json.gz +0 -0
  155. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/chunking-parsing.json.gz +0 -0
  156. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/churn-data.json.gz +0 -0
  157. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/data-privacy-recap.json.gz +0 -0
  158. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/data-quality-expectations.json.gz +0 -0
  159. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/declarative-pipelines-recap.json.gz +0 -0
  160. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/declarative-pipelines.json.gz +0 -0
  161. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/deletion-vectors.json.gz +0 -0
  162. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/delta-acid-concurrency.json.gz +0 -0
  163. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/delta-dml-merge.json.gz +0 -0
  164. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/delta-optimization.json.gz +0 -0
  165. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/delta-sharing.json.gz +0 -0
  166. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/delta-table-anatomy.json.gz +0 -0
  167. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/delta-time-travel-vacuum.json.gz +0 -0
  168. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/delta-transaction-log.json.gz +0 -0
  169. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/devops-essentials-recap.json.gz +0 -0
  170. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/embeddings-vector-search.json.gz +0 -0
  171. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/exam-data-analyst-associate.json.gz +0 -0
  172. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/exam-data-engineer-associate.json.gz +0 -0
  173. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/exam-data-engineer-professional.json.gz +0 -0
  174. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/exam-genai-engineer-associate.json.gz +0 -0
  175. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/exam-ml-associate.json.gz +0 -0
  176. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/exam-ml-professional.json.gz +0 -0
  177. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/exam-spark-developer-associate.json.gz +0 -0
  178. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/feature-engineering.json.gz +0 -0
  179. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/genai-evaluation.json.gz +0 -0
  180. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/genie-spaces.json.gz +0 -0
  181. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/hr-data.json.gz +0 -0
  182. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/hyperparameter-tuning.json.gz +0 -0
  183. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/iot-data.json.gz +0 -0
  184. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/lakeflow-connect-recap.json.gz +0 -0
  185. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/lakeflow-jobs-recap.json.gz +0 -0
  186. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/lakeflow-jobs.json.gz +0 -0
  187. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/lakehouse-architecture.json.gz +0 -0
  188. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/lineage-system-tables.json.gz +0 -0
  189. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/llm-basics.json.gz +0 -0
  190. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/medallion-architecture.json.gz +0 -0
  191. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/metric-views.json.gz +0 -0
  192. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/ml-lifecycle.json.gz +0 -0
  193. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/mlflow-tracking.json.gz +0 -0
  194. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/model-monitoring.json.gz +0 -0
  195. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/model-serving.json.gz +0 -0
  196. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/models-in-unity-catalog.json.gz +0 -0
  197. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/parquet-files.json.gz +0 -0
  198. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/performance-optimization-recap.json.gz +0 -0
  199. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/prompt-engineering.json.gz +0 -0
  200. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/rag-architecture.json.gz +0 -0
  201. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/retail-data.json.gz +0 -0
  202. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/row-filters-column-masks.json.gz +0 -0
  203. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/schema-enforcement-evolution.json.gz +0 -0
  204. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/spark-architecture.json.gz +0 -0
  205. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/spark-joins-shuffles.json.gz +0 -0
  206. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/sql-warehouses.json.gz +0 -0
  207. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/streaming-pipelines-recap.json.gz +0 -0
  208. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/structured-streaming-basics.json.gz +0 -0
  209. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/support-data.json.gz +0 -0
  210. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/uc-privileges.json.gz +0 -0
  211. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/unity-catalog-basics.json.gz +0 -0
  212. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/nb/watermarks-stateful-streaming.json.gz +0 -0
  213. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/agents-tools.b64 +0 -0
  214. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/ai-bi-dashboards.b64 +0 -0
  215. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/ai-functions-gateway.b64 +0 -0
  216. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/asset-bundles-cicd.b64 +0 -0
  217. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/asset-bundles-recap.b64 +0 -0
  218. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/auto-loader-copy-into.b64 +0 -0
  219. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/cdc-data.b64 +0 -0
  220. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/cdc-scd.b64 +0 -0
  221. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/change-data-feed.b64 +0 -0
  222. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/chunking-parsing.b64 +0 -0
  223. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/churn-data.b64 +0 -0
  224. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/data-privacy-recap.b64 +0 -0
  225. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/data-quality-expectations.b64 +0 -0
  226. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/declarative-pipelines-recap.b64 +0 -0
  227. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/declarative-pipelines.b64 +0 -0
  228. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/deletion-vectors.b64 +0 -0
  229. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/delta-acid-concurrency.b64 +0 -0
  230. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/delta-dml-merge.b64 +0 -0
  231. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/delta-optimization.b64 +0 -0
  232. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/delta-sharing.b64 +0 -0
  233. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/delta-table-anatomy.b64 +0 -0
  234. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/delta-time-travel-vacuum.b64 +0 -0
  235. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/delta-transaction-log.b64 +0 -0
  236. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/devops-essentials-recap.b64 +0 -0
  237. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/embeddings-vector-search.b64 +0 -0
  238. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/exam-data-analyst-associate.b64 +0 -0
  239. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/exam-data-engineer-associate.b64 +0 -0
  240. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/exam-data-engineer-professional.b64 +0 -0
  241. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/exam-genai-engineer-associate.b64 +0 -0
  242. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/exam-ml-associate.b64 +0 -0
  243. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/exam-ml-professional.b64 +0 -0
  244. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/exam-spark-developer-associate.b64 +0 -0
  245. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/feature-engineering.b64 +0 -0
  246. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/genai-evaluation.b64 +0 -0
  247. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/genie-spaces.b64 +0 -0
  248. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/hr-data.b64 +0 -0
  249. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/hyperparameter-tuning.b64 +0 -0
  250. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/iot-data.b64 +0 -0
  251. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/lakeflow-connect-recap.b64 +0 -0
  252. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/lakeflow-jobs-recap.b64 +0 -0
  253. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/lakeflow-jobs.b64 +0 -0
  254. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/lakehouse-architecture.b64 +0 -0
  255. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/lineage-system-tables.b64 +0 -0
  256. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/llm-basics.b64 +0 -0
  257. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/medallion-architecture.b64 +0 -0
  258. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/metric-views.b64 +0 -0
  259. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/ml-lifecycle.b64 +0 -0
  260. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/mlflow-tracking.b64 +0 -0
  261. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/model-monitoring.b64 +0 -0
  262. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/model-serving.b64 +0 -0
  263. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/models-in-unity-catalog.b64 +0 -0
  264. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/parquet-files.b64 +0 -0
  265. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/performance-optimization-recap.b64 +0 -0
  266. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/prompt-engineering.b64 +0 -0
  267. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/rag-architecture.b64 +0 -0
  268. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/retail-data.b64 +0 -0
  269. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/row-filters-column-masks.b64 +0 -0
  270. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/schema-enforcement-evolution.b64 +0 -0
  271. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/spark-architecture.b64 +0 -0
  272. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/spark-joins-shuffles.b64 +0 -0
  273. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/sql-warehouses.b64 +0 -0
  274. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/streaming-pipelines-recap.b64 +0 -0
  275. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/structured-streaming-basics.b64 +0 -0
  276. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/support-data.b64 +0 -0
  277. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/uc-privileges.b64 +0 -0
  278. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/unity-catalog-basics.b64 +0 -0
  279. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/_content/web/watermarks-stateful-streaming.b64 +0 -0
  280. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/app.py +0 -0
  281. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/assets/dbx.css +0 -0
  282. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/assets/quiz.js +0 -0
  283. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/assets/viz.css +0 -0
  284. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/assets/viz.js +0 -0
  285. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/catalog.py +0 -0
  286. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/data/__init__.py +0 -0
  287. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/data/_core.py +0 -0
  288. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/data/_load.py +0 -0
  289. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/data/cdc.py +0 -0
  290. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/data/churn.py +0 -0
  291. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/data/hr.py +0 -0
  292. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/data/iot.py +0 -0
  293. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/data/retail.py +0 -0
  294. {databricksedu-0.2.0 → databricksedu-0.2.1}/src/databricksedu/data/support.py +0 -0
  295. {databricksedu-0.2.0 → databricksedu-0.2.1}/tests/test_smoke.py +0 -0
  296. {databricksedu-0.2.0 → databricksedu-0.2.1}/tools/assets/dbx.css +0 -0
  297. {databricksedu-0.2.0 → databricksedu-0.2.1}/tools/assets/quiz.js +0 -0
  298. {databricksedu-0.2.0 → databricksedu-0.2.1}/tools/assets/viz.js +0 -0
  299. {databricksedu-0.2.0 → databricksedu-0.2.1}/tools/build.py +0 -0
  300. {databricksedu-0.2.0 → databricksedu-0.2.1}/tools/render.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: databricksedu
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Bite-sized Databricks lessons that run inside your notebook: animated slides, notes, exercises and seeded demo data.
5
5
  Project-URL: Homepage, https://github.com/misrori/databricksedu
6
6
  Project-URL: Source, https://github.com/misrori/databricksedu
@@ -0,0 +1 @@
1
+ __version__ = "0.2.1"
@@ -1 +1 @@
1
- html,body{margin:0;padding:0;height:auto;background:transparent}#dbe{--navy:#1B3139;--accent:#FF3621;--blue:#2272B4;--purple:#7C4DFF;--teal:#00A3A1;--bg:#F4F2EE;--muted:#6B7280;--line:#E5E7EB;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;color:#1F2937;background:var(--bg);display:flex;flex-direction:column;border-radius:14px;overflow:hidden;position:relative;border:1px solid #D6D3CD;box-sizing:border-box;width:100%;min-width:0}#dbe *{box-sizing:border-box}#dbe.fs,#dbe.page{border-radius:0;border:0;height:100vh!important}body:has(#dbe.page){overflow:hidden}#dbe button{font-family:inherit}.top{display:flex;align-items:center;gap:10px;padding:9px 16px;background:var(--navy);color:#fff;flex:none;z-index:5}.brand{display:flex;align-items:center;gap:8px;font-weight:800;letter-spacing:.01em;cursor:pointer;border:0;background:transparent;color:#fff;font-size:15px;padding:4px 6px;border-radius:8px}.brand:hover{background:rgba(255,255,255,.1)}.brand .lg{display:inline-flex;width:26px;height:26px;border-radius:8px;background:linear-gradient(135deg,#FF3621,#7C4DFF);align-items:center;justify-content:center;font-size:15px}.brand em{font-style:normal;color:#FF8A7A}.crumb{color:#94A3B8;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}.crumb b{color:#E2E8F0;font-weight:600}.seg{display:inline-flex;background:rgba(255,255,255,.1);border-radius:999px;padding:3px;flex:none}.seg button{border:0;background:transparent;color:#CBD5E1;padding:6px 14px;border-radius:999px;cursor:pointer;font-size:13px;white-space:nowrap}.seg button.on{background:#fff;color:var(--navy);font-weight:700}.hbtn{border:1px solid rgba(255,255,255,.25);background:transparent;color:#E2E8F0;border-radius:8px;padding:6px 10px;cursor:pointer;font-size:13px;white-space:nowrap;flex:none}.hbtn:hover{background:rgba(255,255,255,.12)}.hbtn.pri{background:linear-gradient(135deg,#FF3621,#c2410c);border-color:transparent;color:#fff;font-weight:700}#bar{height:3px;background:linear-gradient(90deg,var(--accent),var(--purple),var(--teal));width:0;transition:width .35s ease;flex:none}#main{flex:1;min-height:0;position:relative;display:flex;flex-direction:column}#home{flex:1;overflow:auto;padding:18px 22px 26px}.hhero{position:relative;overflow:hidden;border-radius:18px;padding:26px 30px;color:#fff;background:linear-gradient(120deg,#1B3139,#22425a,#2a2f6b,#1B3139);background-size:300% 300%;animation:dbxGrad 14s ease infinite}.hhero .blob{position:absolute;border-radius:50%;filter:blur(34px);opacity:.55;animation:dbxFloat 9s ease-in-out infinite}.hhero .b1{width:260px;height:260px;background:#FF3621;right:-50px;top:-90px}.hhero .b2{width:200px;height:200px;background:#7C4DFF;right:220px;bottom:-120px;animation-delay:-3s}.hhero .b3{width:160px;height:160px;background:#00A3A1;left:-50px;bottom:-70px;animation-delay:-6s}.hhero>div{position:relative}.hhero h1{margin:0 0 6px;font-size:30px;font-weight:800;letter-spacing:-.01em}.hhero h1 em{font-style:normal;color:#FF8A7A}.hhero p{margin:0;color:#E2E8F0;font-size:15px;max-width:760px;line-height:1.5}.hstats{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}.hstats span{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.25);padding:4px 12px;border-radius:999px;font-size:13px}.hrow{display:flex;gap:10px;align-items:center;margin:16px 0 4px;flex-wrap:wrap}.cats{display:flex;gap:8px;flex-wrap:wrap;flex:1}.cat{border:1px solid var(--line);background:#fff;color:#334155;border-radius:999px;padding:8px 14px;cursor:pointer;font-size:14px;font-weight:600;display:inline-flex;gap:7px;align-items:center;transition:all .2s}.cat:hover{border-color:var(--accent);transform:translateY(-1px)}.cat.on{background:var(--navy);color:#fff;border-color:var(--navy);box-shadow:0 6px 16px rgba(27,49,57,.25)}.cat i{font-style:normal;font-size:12px;background:rgba(100,116,139,.18);border-radius:999px;padding:1px 7px}.cat.on i{background:rgba(255,255,255,.2)}#q{border:1px solid var(--line);border-radius:999px;padding:9px 14px;font-size:14px;min-width:210px;outline:none;font-family:inherit;background:#fff}#q:focus{border-color:var(--purple);box-shadow:0 0 0 3px rgba(124,77,255,.15)}.cdesc{color:var(--muted);font-size:14px;margin:8px 2px 2px;display:flex;gap:10px;align-items:center;flex-wrap:wrap}.cdesc button{margin-left:auto;border:1px solid var(--line);background:#fff;border-radius:999px;padding:6px 14px;cursor:pointer;font-size:13px;font-weight:600;color:var(--navy)}.cdesc button:hover{border-color:var(--accent);color:var(--accent)}.gtitle{font-size:12px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:#94A3B8;margin:18px 2px 8px}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:14px}.mcard{background:#fff;border-radius:16px;padding:16px 16px 12px;cursor:pointer;border:2px solid transparent;box-shadow:0 4px 14px rgba(27,49,57,.07);transition:transform .2s,border-color .2s,box-shadow .2s;display:flex;flex-direction:column;animation:dbxRise .45s both;animation-delay:calc(var(--i,0)*35ms)}.mcard:hover{transform:translateY(-3px);border-color:var(--accent);box-shadow:0 12px 28px rgba(27,49,57,.14)}.mcard .mh{display:flex;gap:10px;align-items:flex-start}.mcard .mi{font-size:26px;line-height:1;flex:none;width:44px;height:44px;border-radius:12px;background:linear-gradient(135deg,#FFF4F1,#F5F3FF);display:flex;align-items:center;justify-content:center}.mcard .mt{font-weight:800;color:var(--navy);font-size:15.5px;line-height:1.25}.mcard .ms{color:#475569;font-size:13px;line-height:1.45;margin:8px 0 10px;flex:1}.mchips{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}.mchips span{font-size:11.5px;background:#F1F5F9;color:#475569;border-radius:999px;padding:2px 9px;white-space:nowrap}.mact{display:flex;gap:6px}.mact button{flex:1;border:1px solid var(--line);background:#fff;border-radius:9px;padding:7px 4px;cursor:pointer;font-size:12.5px;font-weight:700;color:var(--navy);white-space:nowrap}.mact button:hover{border-color:var(--accent);color:var(--accent)}.mact button.go{background:linear-gradient(135deg,#FF3621,#7C4DFF);border:0;color:#fff}.empty{color:var(--muted);padding:30px;text-align:center}.hfoot{margin-top:22px;display:flex;gap:14px;flex-wrap:wrap}.hfoot .cta{flex:2 1 380px;margin:0}.hfoot .pip{flex:1 1 260px;background:#fff;border-radius:16px;padding:16px 18px;border:1px solid var(--line);font-size:13px;color:#475569}.hfoot .pip code{display:block;background:#0D1117;color:#E6EDF3;border-radius:8px;padding:8px 10px;margin-top:6px;font-size:12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre-wrap}#player{flex:1;min-height:0;display:none;flex-direction:column}#slides{flex:1;display:flex;flex-direction:column;min-height:0;padding:14px 18px 8px;position:relative}.stage{flex:1;position:relative;min-height:0;perspective:1400px}.slide{position:absolute;inset:0;background:#fff;border-radius:18px;box-shadow:0 14px 40px rgba(27,49,57,.14);overflow:auto;padding:26px 44px 30px}.slide.enter-r{animation:inR .45s cubic-bezier(.2,.8,.2,1) both}.slide.enter-l{animation:inL .45s cubic-bezier(.2,.8,.2,1) both}@keyframes inR{from{opacity:0;transform:translateX(60px) rotateY(-6deg)}to{opacity:1;transform:none}}@keyframes inL{from{opacity:0;transform:translateX(-60px) rotateY(6deg)}to{opacity:1;transform:none}}.slide .dbx{max-width:none;font-size:17px}.slide .dbx .sec-head h2{font-size:29px}.slide .dbx table{font-size:15px}.slide .dbx .code pre{font-size:13.5px}.slide .dbx>*{animation:dbxRise .55s cubic-bezier(.2,.7,.2,1) both;animation-delay:calc(var(--i,0)*80ms + 100ms)}.slide.title{padding:0;overflow:hidden;background:transparent}.slide.title .dbx{height:100%;display:flex;flex-direction:column;position:relative}.slide.title .hero{flex:1;margin:0;border-radius:18px;display:flex;align-items:center;padding:40px 60px 130px}.slide.title .hero h1{font-size:46px}.slide.title .sub{font-size:19px}.slide.title .b1{width:420px;height:420px}.slide.title .b2{width:340px;height:340px}.slide.title .b3{width:300px;height:300px}.slide.title .idea{position:absolute;left:60px;right:60px;bottom:30px;font-size:17px;background:rgba(255,255,255,.96)}.slide.title .dbx>:not(.hero):not(.idea){display:none}.controls{display:flex;align-items:center;gap:12px;padding-top:10px;flex:none}.controls .nav{border:1px solid var(--line);background:#fff;border-radius:10px;min-width:44px;height:36px;cursor:pointer;font-size:15px;font-weight:700;color:var(--navy);padding:0 12px}.controls .nav:hover{border-color:var(--accent);color:var(--accent)}.controls .nav.next{background:linear-gradient(135deg,#FF3621,#7C4DFF);color:#fff;border:0}.dots{display:flex;gap:6px;flex:1;justify-content:center;flex-wrap:wrap}.dots button{width:10px;height:10px;border-radius:50%;border:0;background:#CBD5E1;cursor:pointer;padding:0;transition:all .25s}.dots button.on{background:var(--accent);width:28px;border-radius:6px}.count{color:var(--muted);font-size:13px;min-width:52px;text-align:right}.hint{color:#94A3B8;font-size:12px;white-space:nowrap}#overview{position:absolute;inset:0;background:rgba(244,242,238,.97);z-index:4;display:none;overflow:auto;padding:22px}#overview.on{display:block;animation:dbxRise .3s both}.ogrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px}.ocard{background:#fff;border-radius:14px;padding:14px;cursor:pointer;border:2px solid transparent;box-shadow:0 4px 14px rgba(0,0,0,.06);transition:all .2s}.ocard:hover{transform:translateY(-3px);border-color:var(--accent)}.ocard .n{font-size:12px;color:var(--muted);font-weight:700}.ocard .i{font-size:26px;margin:4px 0}.ocard .t{font-weight:700;color:var(--navy);font-size:14px}#doc{flex:1;display:none;min-height:0}#player.docmode #slides{display:none}#player.docmode #doc{display:flex}#toc{width:250px;flex:none;overflow:auto;padding:16px 12px;border-right:1px solid var(--line);background:#fff}#toc a{display:flex;gap:8px;align-items:center;padding:7px 10px;border-radius:9px;color:#334155;text-decoration:none;font-size:13px;margin:2px 0;cursor:pointer}#toc a:hover{background:#F1F5F9}#toc a.on{background:#FFF1EE;color:#C62D1A;font-weight:700}#toc .rawbtn{margin-top:12px;width:100%;border:1px dashed #CBD5E1;background:#fff;border-radius:9px;padding:8px;cursor:pointer;font-size:12.5px;color:#475569}#docScroll{flex:1;overflow:auto;padding:20px 28px 60px}.dsec{background:#fff;border-radius:16px;padding:22px 28px;margin:0 auto 16px;max-width:1000px;box-shadow:0 4px 18px rgba(27,49,57,.06)}.dsec.herosec{padding:0;background:transparent;box-shadow:none}.dsec .dbx{max-width:none}.dsec .dbx>*{animation:none}.rawmd{max-width:1000px;margin:0 auto;background:#0D1117;color:#E6EDF3;border-radius:14px;padding:18px 20px;font-size:12.5px;line-height:1.55;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.quiz{max-width:820px}.dbx .code .copy{display:inline-block;margin-left:auto;border:1px solid #30363D;background:#21262D;color:#C9D1D9;border-radius:6px;font-size:11px;padding:2px 8px;cursor:pointer}.dbx .code .run+.copy{margin-left:10px}.fin{text-align:center;padding:10px 0}.fin .big{font-size:60px;animation:vzPop .6s both}.fin h2{font-size:30px;color:var(--navy);margin:6px 0}.fin p{color:var(--muted);margin:0 0 16px}.fcards{display:flex;gap:12px;flex-wrap:wrap;justify-content:center;text-align:left;margin-bottom:14px}.fcard{flex:1 1 220px;max-width:330px;background:#F8FAFC;border:1px solid var(--line);border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .2s}.fcard:hover{border-color:var(--accent);transform:translateY(-2px)}.fcard b{display:block;color:var(--navy);margin-bottom:2px}.fcard span{font-size:13.5px;color:#475569}#modal{position:absolute;inset:0;background:rgba(15,23,42,.55);z-index:20;display:none;align-items:center;justify-content:center;padding:20px}#modal.on{display:flex;animation:dbxRise .25s both}.mbox{background:#fff;border-radius:18px;max-width:640px;width:100%;max-height:100%;overflow:auto;padding:22px 24px;box-shadow:0 30px 80px rgba(0,0,0,.35)}.mbox h3{margin:0 0 6px;color:var(--navy);font-size:20px}.mbox p{color:#475569;font-size:14px;line-height:1.5;margin:6px 0}.mbox ul{margin:6px 0;padding-left:20px;color:#334155;font-size:14px}.cmd{display:flex;gap:8px;align-items:stretch;margin:8px 0}.cmd code{flex:1;background:#0D1117;color:#E6EDF3;border-radius:10px;padding:10px 12px;font-size:12.5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre-wrap;word-break:break-all}.cmd button,.mclose{border:0;border-radius:10px;padding:0 14px;cursor:pointer;font-weight:700;background:linear-gradient(135deg,#FF3621,#7C4DFF);color:#fff;font-size:13px}.mclose{padding:9px 18px;margin-top:10px;background:#E5E7EB;color:#374151}.tip{background:#ECFDF3;border:1px solid #A7F3D0;border-radius:10px;padding:9px 12px;font-size:13.5px;color:#065F46;margin:8px 0}#err{position:absolute;left:10px;right:10px;bottom:10px;background:#FEF2F2;border:1px solid #FCA5A5;color:#991B1B;border-radius:10px;padding:8px 12px;font-size:12px;z-index:30;display:none;white-space:pre-wrap}.confetti{position:absolute;top:-20px;font-size:22px;z-index:9;animation:fall 2.6s linear forwards;pointer-events:none}@keyframes fall{to{transform:translateY(900px) rotate(720deg);opacity:.7}}.loading{padding:60px;text-align:center;color:var(--muted)}@media (max-width:820px){.slide{padding:18px}.slide.title .hero{padding:26px 26px 150px}.slide.title .hero h1{font-size:30px}.slide.title .idea{left:16px;right:16px}#toc{display:none}.crumb{display:none}.hint{display:none}.seg button{padding:6px 9px}}@media (prefers-reduced-motion: reduce){*,*::before,*::after{animation:none!important;transition:none!important}}
1
+ html,body{margin:0;padding:0;height:auto;background:transparent}#dbe{--navy:#1B3139;--accent:#FF3621;--blue:#2272B4;--purple:#7C4DFF;--teal:#00A3A1;--bg:#F4F2EE;--muted:#6B7280;--line:#E5E7EB;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;color:#1F2937;background:var(--bg);display:flex;flex-direction:column;border-radius:14px;overflow:hidden;position:relative;border:1px solid #D6D3CD;box-sizing:border-box;width:100%;min-width:0}#dbe *{box-sizing:border-box}#dbe.fs,#dbe.page{border-radius:0;border:0;height:100vh!important}body:has(#dbe.page){overflow:hidden}#dbe button{font-family:inherit}.top{display:flex;align-items:center;gap:10px;padding:9px 16px;background:var(--navy);color:#fff;flex:none;z-index:5}.brand{display:flex;align-items:center;gap:8px;font-weight:800;letter-spacing:.01em;cursor:pointer;border:0;background:transparent;color:#fff;font-size:15px;padding:4px 6px;border-radius:8px}.brand:hover{background:rgba(255,255,255,.1)}.brand .lg{display:inline-flex;width:26px;height:26px;border-radius:8px;background:linear-gradient(135deg,#FF3621,#7C4DFF);align-items:center;justify-content:center;font-size:15px}.brand em{font-style:normal;color:#FF8A7A}.crumb{color:#94A3B8;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}.crumb b{color:#E2E8F0;font-weight:600}.seg{display:inline-flex;background:rgba(255,255,255,.1);border-radius:999px;padding:3px;flex:none}.seg button{border:0;background:transparent;color:#CBD5E1;padding:6px 14px;border-radius:999px;cursor:pointer;font-size:13px;white-space:nowrap}.seg button.on{background:#fff;color:var(--navy);font-weight:700}.hbtn{border:1px solid rgba(255,255,255,.25);background:transparent;color:#E2E8F0;border-radius:8px;padding:6px 10px;cursor:pointer;font-size:13px;white-space:nowrap;flex:none}.hbtn:hover{background:rgba(255,255,255,.12)}.hbtn.pri{background:linear-gradient(135deg,#FF3621,#c2410c);border-color:transparent;color:#fff;font-weight:700}#bar{height:3px;background:linear-gradient(90deg,var(--accent),var(--purple),var(--teal));width:0;transition:width .35s ease;flex:none}#main{flex:1;min-height:0;position:relative;display:flex;flex-direction:column}#home{flex:1;overflow:auto;padding:18px 22px 26px}.hhero{position:relative;overflow:hidden;border-radius:18px;padding:26px 30px;color:#fff;background:linear-gradient(120deg,#1B3139,#22425a,#2a2f6b,#1B3139);background-size:300% 300%;animation:dbxGrad 14s ease infinite}.hhero .blob{position:absolute;border-radius:50%;filter:blur(34px);opacity:.55;animation:dbxFloat 9s ease-in-out infinite}.hhero .b1{width:260px;height:260px;background:#FF3621;right:-50px;top:-90px}.hhero .b2{width:200px;height:200px;background:#7C4DFF;right:220px;bottom:-120px;animation-delay:-3s}.hhero .b3{width:160px;height:160px;background:#00A3A1;left:-50px;bottom:-70px;animation-delay:-6s}.hhero>div{position:relative}.hhero h1{margin:0 0 6px;font-size:30px;font-weight:800;letter-spacing:-.01em}.hhero h1 em{font-style:normal;color:#FF8A7A}.hhero p{margin:0;color:#E2E8F0;font-size:15px;max-width:760px;line-height:1.5}.hstats{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}.hstats span{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.25);padding:4px 12px;border-radius:999px;font-size:13px}.hrow{display:flex;gap:10px;align-items:center;margin:16px 0 4px;flex-wrap:wrap}.cats{display:flex;gap:8px;flex-wrap:wrap;flex:1}.cat{border:1px solid var(--line);background:#fff;color:#334155;border-radius:999px;padding:8px 14px;cursor:pointer;font-size:14px;font-weight:600;display:inline-flex;gap:7px;align-items:center;transition:all .2s}.cat:hover{border-color:var(--accent);transform:translateY(-1px)}.cat.on{background:var(--navy);color:#fff;border-color:var(--navy);box-shadow:0 6px 16px rgba(27,49,57,.25)}.cat i{font-style:normal;font-size:12px;background:rgba(100,116,139,.18);border-radius:999px;padding:1px 7px}.cat.on i{background:rgba(255,255,255,.2)}#q{border:1px solid var(--line);border-radius:999px;padding:9px 14px;font-size:14px;min-width:210px;outline:none;font-family:inherit;background:#fff}#q:focus{border-color:var(--purple);box-shadow:0 0 0 3px rgba(124,77,255,.15)}.cdesc{color:var(--muted);font-size:14px;margin:8px 2px 2px;display:flex;gap:10px;align-items:center;flex-wrap:wrap}.cdesc button{margin-left:auto;border:1px solid var(--line);background:#fff;border-radius:999px;padding:6px 14px;cursor:pointer;font-size:13px;font-weight:600;color:var(--navy)}.cdesc button:hover{border-color:var(--accent);color:var(--accent)}.gtitle{font-size:12px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:#94A3B8;margin:18px 2px 8px}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:14px}.mcard{background:#fff;border-radius:16px;padding:16px 16px 12px;cursor:pointer;border:2px solid transparent;box-shadow:0 4px 14px rgba(27,49,57,.07);transition:transform .2s,border-color .2s,box-shadow .2s;display:flex;flex-direction:column;animation:dbxRise .45s both;animation-delay:calc(var(--i,0)*35ms)}.mcard:hover{transform:translateY(-3px);border-color:var(--accent);box-shadow:0 12px 28px rgba(27,49,57,.14)}.mcard .mh{display:flex;gap:10px;align-items:flex-start}.mcard .mi{font-size:26px;line-height:1;flex:none;width:44px;height:44px;border-radius:12px;background:linear-gradient(135deg,#FFF4F1,#F5F3FF);display:flex;align-items:center;justify-content:center}.mcard .mt{font-weight:800;color:var(--navy);font-size:15.5px;line-height:1.25}.mcard .ms{color:#475569;font-size:13px;line-height:1.45;margin:8px 0 10px;flex:1}.mchips{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}.mchips span{font-size:11.5px;background:#F1F5F9;color:#475569;border-radius:999px;padding:2px 9px;white-space:nowrap}.mact{display:flex;gap:6px}.mact button{flex:1;border:1px solid var(--line);background:#fff;border-radius:9px;padding:7px 4px;cursor:pointer;font-size:12.5px;font-weight:700;color:var(--navy);white-space:nowrap}.mact button:hover{border-color:var(--accent);color:var(--accent)}.mact button.go{background:linear-gradient(135deg,#FF3621,#7C4DFF);border:0;color:#fff}.empty{color:var(--muted);padding:30px;text-align:center}.hfoot{margin-top:22px;display:flex;gap:14px;flex-wrap:wrap}.hfoot .cta{flex:2 1 380px;margin:0}.hfoot .pip{flex:1 1 260px;background:#fff;border-radius:16px;padding:16px 18px;border:1px solid var(--line);font-size:13px;color:#475569}.hfoot .pip code{display:block;background:#0D1117;color:#E6EDF3;border-radius:8px;padding:8px 10px;margin-top:6px;font-size:12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre-wrap}#player{flex:1;min-height:0;display:none;flex-direction:column}#slides{flex:1;display:flex;flex-direction:column;min-height:0;padding:14px 18px 8px;position:relative}.stage{flex:1;position:relative;min-height:0;perspective:1400px}.slide{position:absolute;inset:0;background:#fff;border-radius:18px;box-shadow:0 14px 40px rgba(27,49,57,.14);overflow:auto;padding:26px 44px 30px}.slide.enter-r{animation:inR .45s cubic-bezier(.2,.8,.2,1) both}.slide.enter-l{animation:inL .45s cubic-bezier(.2,.8,.2,1) both}@keyframes inR{from{opacity:0;transform:translateX(60px) rotateY(-6deg)}to{opacity:1;transform:none}}@keyframes inL{from{opacity:0;transform:translateX(-60px) rotateY(6deg)}to{opacity:1;transform:none}}.slide .dbx{max-width:none;font-size:17px}.slide .dbx .sec-head h2{font-size:29px}.slide .dbx table{font-size:15px}.slide .dbx .code pre{font-size:13.5px}.slide .dbx>*{animation:dbxRise .55s cubic-bezier(.2,.7,.2,1) both;animation-delay:calc(var(--i,0)*80ms + 100ms)}.slide.title{padding:0;overflow:hidden;background:transparent}.slide.title .dbx{height:100%;display:flex;flex-direction:column;position:relative}.slide.title .hero{flex:1;margin:0;border-radius:18px;display:flex;align-items:center;padding:40px 60px 130px}.slide.title .hero h1{font-size:46px}.slide.title .sub{font-size:19px}.slide.title .b1{width:420px;height:420px}.slide.title .b2{width:340px;height:340px}.slide.title .b3{width:300px;height:300px}.slide.title .idea{position:absolute;left:60px;right:60px;bottom:30px;font-size:17px;background:rgba(255,255,255,.96)}.slide.title .dbx>:not(.hero):not(.idea){display:none}.controls{display:flex;align-items:center;gap:12px;padding-top:10px;flex:none}.controls .nav{border:1px solid var(--line);background:#fff;border-radius:10px;min-width:44px;height:36px;cursor:pointer;font-size:15px;font-weight:700;color:var(--navy);padding:0 12px}.controls .nav:hover{border-color:var(--accent);color:var(--accent)}.controls .nav.next{background:linear-gradient(135deg,#FF3621,#7C4DFF);color:#fff;border:0}.dots{display:flex;gap:6px;flex:1;justify-content:center;flex-wrap:wrap}.dots button{width:10px;height:10px;border-radius:50%;border:0;background:#CBD5E1;cursor:pointer;padding:0;transition:all .25s}.dots button.on{background:var(--accent);width:28px;border-radius:6px}.count{color:var(--muted);font-size:13px;min-width:52px;text-align:right}.hint{color:#94A3B8;font-size:12px;white-space:nowrap}#overview{position:absolute;inset:0;background:rgba(244,242,238,.97);z-index:4;display:none;overflow:auto;padding:22px}#overview.on{display:block;animation:dbxRise .3s both}.ogrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px}.ocard{background:#fff;border-radius:14px;padding:14px;cursor:pointer;border:2px solid transparent;box-shadow:0 4px 14px rgba(0,0,0,.06);transition:all .2s}.ocard:hover{transform:translateY(-3px);border-color:var(--accent)}.ocard .n{font-size:12px;color:var(--muted);font-weight:700}.ocard .i{font-size:26px;margin:4px 0}.ocard .t{font-weight:700;color:var(--navy);font-size:14px}#doc{flex:1;display:none;min-height:0}#player.docmode #slides{display:none}#player.docmode #doc{display:flex}#toc{width:250px;flex:none;overflow:auto;padding:16px 12px;border-right:1px solid var(--line);background:#fff}#toc a{display:flex;gap:8px;align-items:center;padding:7px 10px;border-radius:9px;color:#334155;text-decoration:none;font-size:13px;margin:2px 0;cursor:pointer}#toc a:hover{background:#F1F5F9}#toc a.on{background:#FFF1EE;color:#C62D1A;font-weight:700}#toc .rawbtn{margin-top:12px;width:100%;border:1px dashed #CBD5E1;background:#fff;border-radius:9px;padding:8px;cursor:pointer;font-size:12.5px;color:#475569}#docScroll{flex:1;overflow:auto;padding:20px 28px 60px}.dsec{background:#fff;border-radius:16px;padding:22px 28px;margin:0 auto 16px;max-width:1000px;box-shadow:0 4px 18px rgba(27,49,57,.06)}.dsec.herosec{padding:0;background:transparent;box-shadow:none}.dsec .dbx{max-width:none}.dsec .dbx>*{animation:none}.rawmd{max-width:1000px;margin:0 auto;background:#0D1117;color:#E6EDF3;border-radius:14px;padding:18px 20px;font-size:12.5px;line-height:1.55;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.quiz{max-width:820px}.dbx .code .copy{display:inline-block;margin-left:auto;border:1px solid #30363D;background:#21262D;color:#C9D1D9;border-radius:6px;font-size:11px;padding:2px 8px;cursor:pointer}.dbx .code .run+.copy{margin-left:10px}.fin{text-align:center;padding:10px 0}.fin .big{font-size:60px;animation:vzPop .6s both}.fin h2{font-size:30px;color:var(--navy);margin:6px 0}.fin p{color:var(--muted);margin:0 0 16px}.fcards{display:flex;gap:12px;flex-wrap:wrap;justify-content:center;text-align:left;margin-bottom:14px}.fcard{flex:1 1 220px;max-width:330px;background:#F8FAFC;border:1px solid var(--line);border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .2s}.fcard:hover{border-color:var(--accent);transform:translateY(-2px)}.fcard b{display:block;color:var(--navy);margin-bottom:2px}.fcard span{font-size:13.5px;color:#475569}#modal{position:absolute;inset:0;background:rgba(15,23,42,.55);z-index:20;display:none;align-items:center;justify-content:center;padding:20px}#modal.on{display:flex;animation:dbxRise .25s both}.mbox{background:#fff;border-radius:18px;max-width:640px;width:100%;max-height:100%;overflow:auto;padding:22px 24px;box-shadow:0 30px 80px rgba(0,0,0,.35)}.mbox h3{margin:0 0 6px;color:var(--navy);font-size:20px}.mbox p{color:#475569;font-size:14px;line-height:1.5;margin:6px 0}.mbox ul{margin:6px 0;padding-left:20px;color:#334155;font-size:14px}.cmd{display:flex;gap:8px;align-items:stretch;margin:8px 0}.cmd code{flex:1;background:#0D1117;color:#E6EDF3;border-radius:10px;padding:10px 12px;font-size:12.5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre-wrap;word-break:break-all}.cmd button,.mclose{border:0;border-radius:10px;padding:0 14px;cursor:pointer;font-weight:700;background:linear-gradient(135deg,#FF3621,#7C4DFF);color:#fff;font-size:13px}.mclose{padding:9px 18px;margin-top:10px;background:#E5E7EB;color:#374151}.fsopt{display:block;width:100%;text-align:left;border:1px solid var(--line);background:#F8FAFC;border-radius:12px;padding:11px 14px;margin:8px 0;cursor:pointer;text-decoration:none;color:#0F172A;font-size:14px}.fsopt:hover{border-color:#FF3621;background:#FFF7F5}.fsopt span{display:block;color:#64748B;font-size:12.5px;margin-top:2px}.mclose{padding:9px 16px;margin-top:6px}.tip{background:#ECFDF3;border:1px solid #A7F3D0;border-radius:10px;padding:9px 12px;font-size:13.5px;color:#065F46;margin:8px 0}#err{position:absolute;left:10px;right:10px;bottom:10px;background:#FEF2F2;border:1px solid #FCA5A5;color:#991B1B;border-radius:10px;padding:8px 12px;font-size:12px;z-index:30;display:none;white-space:pre-wrap}.confetti{position:absolute;top:-20px;font-size:22px;z-index:9;animation:fall 2.6s linear forwards;pointer-events:none}@keyframes fall{to{transform:translateY(900px) rotate(720deg);opacity:.7}}.loading{padding:60px;text-align:center;color:var(--muted)}@media (max-width:820px){.slide{padding:18px}.slide.title .hero{padding:26px 26px 150px}.slide.title .hero h1{font-size:30px}.slide.title .idea{left:16px;right:16px}#toc{display:none}.crumb{display:none}.hint{display:none}.seg button{padding:6px 9px}}@media (prefers-reduced-motion: reduce){*,*::before,*::after{animation:none!important;transition:none!important}}
@@ -26,7 +26,7 @@
26
26
  '<button class="hbtn" id="bOver" title="Slide overview (O)" style="display:none">▦</button>' +
27
27
  '<button class="hbtn pri" id="bSave" style="display:none">💾 Save to workspace</button>' +
28
28
  '<button class="hbtn" id="bSize" title="Window height">↕</button>' +
29
- '<button class="hbtn" id="bFull" title="Full screen (F)">⛶</button>' +
29
+ '<button class="hbtn" id="bFull" title="Full screen (F)">⛶ Full screen</button>' +
30
30
  '</div><div id="bar"></div>' +
31
31
  '<div id="main">' +
32
32
  '<div id="home"></div>' +
@@ -336,23 +336,42 @@
336
336
  if (!S.mod) return 'cat/' + S.cat;
337
337
  return S.mode === 'doc' ? 'doc/' + S.mod.id : 'slides/' + S.mod.id + '/' + S.idx;
338
338
  }
339
- // Notebook outputs (Databricks displayHTML) live in an iframe that may not allow fullscreen:
340
- // then the app is reopened in its own browser tab, where F / ⛶ gives real full screen.
341
- function openTab() {
342
- var w = null;
343
- try { w = window.open('', '_blank'); } catch (e) { }
344
- if (!w) { setH(Math.max(H, (window.screen && screen.availHeight || 900) - 160)); root.scrollIntoView(); return; }
339
+ function pageHtml() {
345
340
  var start = '<script>window.DBE_START=' + JSON.stringify({ route: route(), page: true }) + ';<\/script>';
346
- w.document.open();
347
- w.document.write(SRC.replace('<script>window.DBE=', start + '<script>window.DBE='));
348
- w.document.close();
341
+ return SRC.replace('<script>window.DBE=', start + '<script>window.DBE=');
342
+ }
343
+ function fillScreen() {
344
+ setH(Math.max(H, ((window.screen && screen.availHeight) || 900) - 140));
345
+ try { root.scrollIntoView({ block: 'start' }); } catch (e) { root.scrollIntoView(); }
346
+ }
347
+ // Notebook outputs (Databricks displayHTML) live in an iframe that does not allow full screen.
348
+ // Then offer real links (a click on a link is rarely blocked, unlike window.open from script).
349
+ function fsMenu() {
350
+ var url = null;
351
+ try { url = URL.createObjectURL(new Blob([pageHtml()], { type: 'text/html' })); } catch (e) { }
352
+ var h = '<div class="mbox"><h3>⛶ Full screen</h3>' +
353
+ '<p>The notebook does not let this window go full screen by itself. Pick one:</p>' +
354
+ (url ? '<a class="fsopt" href="' + url + '" target="_blank" rel="noopener" id="fsTab"><b>↗ Open in a new browser tab</b>' +
355
+ '<span>The whole app in its own tab, right where you are now. Press <b>F</b> there for real full screen.</span></a>' : '') +
356
+ '<button class="fsopt" id="fsFill"><b>⤢ Make this window as tall as the screen</b><span>Stays in the notebook. Combine it with the ' +
357
+ 'cell\'s own full-screen icon in the Databricks cell toolbar.</span></button>' +
358
+ (url ? '<a class="fsopt" href="' + url + '" download="databricksedu.html" id="fsDl"><b>⬇ Download as an HTML file</b>' +
359
+ '<span>Open it later in any browser, also offline.</span></a>' : '') +
360
+ '<button class="mclose" id="mclose">Close</button></div>';
361
+ var modal = $('modal');
362
+ modal.innerHTML = h; modal.classList.add('on');
363
+ function close() { modal.classList.remove('on'); }
364
+ $('fsFill').onclick = function () { close(); fillScreen(); };
365
+ if (url) { $('fsTab').addEventListener('click', function () { setTimeout(close, 50); }); $('fsDl').addEventListener('click', function () { setTimeout(close, 50); }); }
366
+ $('mclose').onclick = close;
367
+ modal.onclick = function (e) { if (e.target === modal) close(); };
349
368
  }
350
369
  function toggleFs() {
351
370
  if (document.fullscreenElement || document.webkitFullscreenElement) return (document.exitFullscreen || document.webkitExitFullscreen).call(document);
352
- if (!fsOk) return openTab();
371
+ if (!fsOk) return fsMenu();
353
372
  var req = root.requestFullscreen || root.webkitRequestFullscreen, p = null;
354
- try { p = req.call(root); } catch (e) { return openTab(); }
355
- if (p && p.catch) p.catch(openTab);
373
+ try { p = req.call(root); } catch (e) { return fsMenu(); }
374
+ if (p && p.catch) p.catch(fsMenu);
356
375
  }
357
376
  document.addEventListener('keydown', function (e) {
358
377
  if (/INPUT|TEXTAREA/.test((e.target.tagName || ''))) return;
@@ -13,20 +13,35 @@ def _magic(text):
13
13
  return "\n".join("# MAGIC " + line if line else "# MAGIC" for line in text.splitlines())
14
14
 
15
15
 
16
+ _CSS_JS = {}
17
+
18
+
19
+ def _css_loader(with_viz):
20
+ """A script that adds the stylesheet. Databricks runs the scripts of a %md-sandbox cell, but its
21
+ Markdown pass can break a long <style> block (CSS is full of * and _); base64 has neither."""
22
+ if with_viz not in _CSS_JS:
23
+ css = catalog.asset("dbx.css") + (catalog.asset("viz.css") if with_viz else "")
24
+ b64 = base64.b64encode(css.encode("utf-8")).decode("ascii")
25
+ b64 = "'+\n'".join(b64[i:i + 400] for i in range(0, len(b64), 400)) # short lines
26
+ _CSS_JS[with_viz] = ("(function(){var b=atob('%s'),u=new Uint8Array(b.length);"
27
+ "for(var i=0;i<b.length;i++)u[i]=b.charCodeAt(i);"
28
+ "var s=document.createElement('style');s.textContent=new TextDecoder('utf-8').decode(u);"
29
+ "(document.head||document.documentElement).appendChild(s);})();\n" % b64)
30
+ return _CSS_JS[with_viz]
31
+
32
+
16
33
  def _sandbox(cell):
17
34
  """A %md-sandbox cell. No blank lines (they would end the HTML block) and no bare $ (KaTeX)."""
18
35
  body = cell["h"].replace("$", "&#36;")
19
36
  body = "\n".join(line if line.strip() else "<span></span>" for line in body.splitlines())
20
- css = catalog.asset("dbx.css") + (catalog.asset("viz.css") if cell.get("viz") else "")
21
- out = "%md-sandbox\n<style>" + css + "</style>\n<div class=\"dbx\">\n" + body + "\n</div>"
22
- script = ""
37
+ out = "%md-sandbox\n<div class=\"dbx\">\n" + body + "\n</div>"
38
+ script = _css_loader(bool(cell.get("viz")))
23
39
  if cell.get("viz"):
24
40
  script += catalog.asset("viz.js") + "\nDBXViz.init(document, {autoplay: true});\n"
25
41
  if cell.get("quiz"):
26
42
  quiz = json.dumps(cell["quiz"], ensure_ascii=False).replace("$", "\\u0024").replace("</", "<\\/")
27
43
  script += catalog.asset("quiz.js") + "\ndbxQuiz('dbxquiz', " + quiz + ");\n"
28
- if script:
29
- out += "\n<script>\n" + script.replace("$", "\\u0024") + "</script>"
44
+ out += "\n<script>\n" + script.replace("$", "\\u0024") + "</script>"
30
45
  return out
31
46
 
32
47
 
@@ -139,6 +139,10 @@ body:has(#dbe.page){overflow:hidden}
139
139
  .cmd code{flex:1;background:#0D1117;color:#E6EDF3;border-radius:10px;padding:10px 12px;font-size:12.5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre-wrap;word-break:break-all}
140
140
  .cmd button,.mclose{border:0;border-radius:10px;padding:0 14px;cursor:pointer;font-weight:700;background:linear-gradient(135deg,#FF3621,#7C4DFF);color:#fff;font-size:13px}
141
141
  .mclose{padding:9px 18px;margin-top:10px;background:#E5E7EB;color:#374151}
142
+ .fsopt{display:block;width:100%;text-align:left;border:1px solid var(--line);background:#F8FAFC;border-radius:12px;padding:11px 14px;margin:8px 0;cursor:pointer;text-decoration:none;color:#0F172A;font-size:14px}
143
+ .fsopt:hover{border-color:#FF3621;background:#FFF7F5}
144
+ .fsopt span{display:block;color:#64748B;font-size:12.5px;margin-top:2px}
145
+ .mclose{padding:9px 16px;margin-top:6px}
142
146
  .tip{background:#ECFDF3;border:1px solid #A7F3D0;border-radius:10px;padding:9px 12px;font-size:13.5px;color:#065F46;margin:8px 0}
143
147
  #err{position:absolute;left:10px;right:10px;bottom:10px;background:#FEF2F2;border:1px solid #FCA5A5;color:#991B1B;border-radius:10px;padding:8px 12px;font-size:12px;z-index:30;display:none;white-space:pre-wrap}
144
148
  .confetti{position:absolute;top:-20px;font-size:22px;z-index:9;animation:fall 2.6s linear forwards;pointer-events:none}
@@ -28,7 +28,7 @@
28
28
  '<button class="hbtn" id="bOver" title="Slide overview (O)" style="display:none">▦</button>' +
29
29
  '<button class="hbtn pri" id="bSave" style="display:none">💾 Save to workspace</button>' +
30
30
  '<button class="hbtn" id="bSize" title="Window height">↕</button>' +
31
- '<button class="hbtn" id="bFull" title="Full screen (F)">⛶</button>' +
31
+ '<button class="hbtn" id="bFull" title="Full screen (F)">⛶ Full screen</button>' +
32
32
  '</div><div id="bar"></div>' +
33
33
  '<div id="main">' +
34
34
  '<div id="home"></div>' +
@@ -344,23 +344,42 @@
344
344
  if (!S.mod) return 'cat/' + S.cat;
345
345
  return S.mode === 'doc' ? 'doc/' + S.mod.id : 'slides/' + S.mod.id + '/' + S.idx;
346
346
  }
347
- // Notebook outputs (Databricks displayHTML) live in an iframe that may not allow fullscreen:
348
- // then the app is reopened in its own browser tab, where F / ⛶ gives real full screen.
349
- function openTab() {
350
- var w = null;
351
- try { w = window.open('', '_blank'); } catch (e) { }
352
- if (!w) { setH(Math.max(H, (window.screen && screen.availHeight || 900) - 160)); root.scrollIntoView(); return; }
347
+ function pageHtml() {
353
348
  var start = '<script>window.DBE_START=' + JSON.stringify({ route: route(), page: true }) + ';<\/script>';
354
- w.document.open();
355
- w.document.write(SRC.replace('<script>window.DBE=', start + '<script>window.DBE='));
356
- w.document.close();
349
+ return SRC.replace('<script>window.DBE=', start + '<script>window.DBE=');
350
+ }
351
+ function fillScreen() {
352
+ setH(Math.max(H, ((window.screen && screen.availHeight) || 900) - 140));
353
+ try { root.scrollIntoView({ block: 'start' }); } catch (e) { root.scrollIntoView(); }
354
+ }
355
+ // Notebook outputs (Databricks displayHTML) live in an iframe that does not allow full screen.
356
+ // Then offer real links (a click on a link is rarely blocked, unlike window.open from script).
357
+ function fsMenu() {
358
+ var url = null;
359
+ try { url = URL.createObjectURL(new Blob([pageHtml()], { type: 'text/html' })); } catch (e) { }
360
+ var h = '<div class="mbox"><h3>⛶ Full screen</h3>' +
361
+ '<p>The notebook does not let this window go full screen by itself. Pick one:</p>' +
362
+ (url ? '<a class="fsopt" href="' + url + '" target="_blank" rel="noopener" id="fsTab"><b>↗ Open in a new browser tab</b>' +
363
+ '<span>The whole app in its own tab, right where you are now. Press <b>F</b> there for real full screen.</span></a>' : '') +
364
+ '<button class="fsopt" id="fsFill"><b>⤢ Make this window as tall as the screen</b><span>Stays in the notebook. Combine it with the ' +
365
+ 'cell\'s own full-screen icon in the Databricks cell toolbar.</span></button>' +
366
+ (url ? '<a class="fsopt" href="' + url + '" download="databricksedu.html" id="fsDl"><b>⬇ Download as an HTML file</b>' +
367
+ '<span>Open it later in any browser, also offline.</span></a>' : '') +
368
+ '<button class="mclose" id="mclose">Close</button></div>';
369
+ var modal = $('modal');
370
+ modal.innerHTML = h; modal.classList.add('on');
371
+ function close() { modal.classList.remove('on'); }
372
+ $('fsFill').onclick = function () { close(); fillScreen(); };
373
+ if (url) { $('fsTab').addEventListener('click', function () { setTimeout(close, 50); }); $('fsDl').addEventListener('click', function () { setTimeout(close, 50); }); }
374
+ $('mclose').onclick = close;
375
+ modal.onclick = function (e) { if (e.target === modal) close(); };
357
376
  }
358
377
  function toggleFs() {
359
378
  if (document.fullscreenElement || document.webkitFullscreenElement) return (document.exitFullscreen || document.webkitExitFullscreen).call(document);
360
- if (!fsOk) return openTab();
379
+ if (!fsOk) return fsMenu();
361
380
  var req = root.requestFullscreen || root.webkitRequestFullscreen, p = null;
362
- try { p = req.call(root); } catch (e) { return openTab(); }
363
- if (p && p.catch) p.catch(openTab);
381
+ try { p = req.call(root); } catch (e) { return fsMenu(); }
382
+ if (p && p.catch) p.catch(fsMenu);
364
383
  }
365
384
  document.addEventListener('keydown', function (e) {
366
385
  if (/INPUT|TEXTAREA/.test((e.target.tagName || ''))) return;
@@ -1 +0,0 @@
1
- __version__ = "0.2.0"
File without changes
File without changes
File without changes